durar-ai 2026.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5497 -0
- package/LICENSE +21 -0
- package/README.md +614 -0
- package/assets/avatar-placeholder.svg +19 -0
- package/assets/chrome-extension/icons/icon128.png +0 -0
- package/assets/chrome-extension/icons/icon16.png +0 -0
- package/assets/chrome-extension/icons/icon32.png +0 -0
- package/assets/chrome-extension/icons/icon48.png +0 -0
- package/assets/dmg-background-small.png +0 -0
- package/assets/dmg-background.png +0 -0
- package/docs/.i18n/README.md +72 -0
- package/docs/.i18n/ar-navigation.json +18 -0
- package/docs/.i18n/de-navigation.json +18 -0
- package/docs/.i18n/es-navigation.json +18 -0
- package/docs/.i18n/fr-navigation.json +18 -0
- package/docs/.i18n/glossary.ar.json +5 -0
- package/docs/.i18n/glossary.de.json +5 -0
- package/docs/.i18n/glossary.es.json +5 -0
- package/docs/.i18n/glossary.fr.json +5 -0
- package/docs/.i18n/glossary.id.json +5 -0
- package/docs/.i18n/glossary.it.json +5 -0
- package/docs/.i18n/glossary.ja-JP.json +14 -0
- package/docs/.i18n/glossary.ko.json +5 -0
- package/docs/.i18n/glossary.pl.json +5 -0
- package/docs/.i18n/glossary.pt-BR.json +5 -0
- package/docs/.i18n/glossary.tr.json +5 -0
- package/docs/.i18n/glossary.zh-CN.json +358 -0
- package/docs/.i18n/id-navigation.json +18 -0
- package/docs/.i18n/it-navigation.json +18 -0
- package/docs/.i18n/ja-navigation.json +18 -0
- package/docs/.i18n/ko-navigation.json +18 -0
- package/docs/.i18n/pl-navigation.json +18 -0
- package/docs/.i18n/pt-BR-navigation.json +18 -0
- package/docs/.i18n/tr-navigation.json +18 -0
- package/docs/.i18n/zh-Hans-navigation.json +544 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.svg +418 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/openclaw-logo-text.svg +418 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith-light.svg +14 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex-light.svg +16 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/github-light.svg +3 -0
- package/docs/assets/sponsors/github.svg +3 -0
- package/docs/assets/sponsors/nvidia-dark.svg +9 -0
- package/docs/assets/sponsors/nvidia.svg +9 -0
- package/docs/assets/sponsors/openai-light.svg +3 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel-light.svg +5 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +80 -0
- package/docs/automation/auth-monitoring.md +8 -0
- package/docs/automation/clawflow.md +8 -0
- package/docs/automation/cron-jobs.md +410 -0
- package/docs/automation/cron-vs-heartbeat.md +8 -0
- package/docs/automation/gmail-pubsub.md +8 -0
- package/docs/automation/hooks.md +303 -0
- package/docs/automation/index.md +115 -0
- package/docs/automation/poll.md +8 -0
- package/docs/automation/standing-orders.md +254 -0
- package/docs/automation/taskflow.md +82 -0
- package/docs/automation/tasks.md +323 -0
- package/docs/automation/troubleshooting.md +8 -0
- package/docs/automation/webhook.md +8 -0
- package/docs/brave-search.md +103 -0
- package/docs/channels/bluebubbles.md +435 -0
- package/docs/channels/broadcast-groups.md +442 -0
- package/docs/channels/channel-routing.md +139 -0
- package/docs/channels/discord.md +1254 -0
- package/docs/channels/feishu.md +793 -0
- package/docs/channels/googlechat.md +270 -0
- package/docs/channels/group-messages.md +84 -0
- package/docs/channels/groups.md +410 -0
- package/docs/channels/imessage.md +427 -0
- package/docs/channels/index.md +50 -0
- package/docs/channels/irc.md +252 -0
- package/docs/channels/line.md +225 -0
- package/docs/channels/location.md +56 -0
- package/docs/channels/matrix.md +869 -0
- package/docs/channels/mattermost.md +472 -0
- package/docs/channels/msteams.md +805 -0
- package/docs/channels/nextcloud-talk.md +149 -0
- package/docs/channels/nostr.md +252 -0
- package/docs/channels/pairing.md +129 -0
- package/docs/channels/qqbot.md +193 -0
- package/docs/channels/signal.md +337 -0
- package/docs/channels/slack.md +681 -0
- package/docs/channels/synology-chat.md +185 -0
- package/docs/channels/telegram.md +1072 -0
- package/docs/channels/tlon.md +290 -0
- package/docs/channels/troubleshooting.md +133 -0
- package/docs/channels/twitch.md +394 -0
- package/docs/channels/whatsapp.md +488 -0
- package/docs/channels/zalo.md +254 -0
- package/docs/channels/zalouser.md +195 -0
- package/docs/ci.md +66 -0
- package/docs/cli/acp.md +316 -0
- package/docs/cli/agent.md +57 -0
- package/docs/cli/agents.md +220 -0
- package/docs/cli/approvals.md +136 -0
- package/docs/cli/backup.md +84 -0
- package/docs/cli/browser.md +233 -0
- package/docs/cli/channels.md +131 -0
- package/docs/cli/clawbot.md +21 -0
- package/docs/cli/completion.md +35 -0
- package/docs/cli/config.md +353 -0
- package/docs/cli/configure.md +70 -0
- package/docs/cli/cron.md +167 -0
- package/docs/cli/daemon.md +57 -0
- package/docs/cli/dashboard.md +22 -0
- package/docs/cli/devices.md +171 -0
- package/docs/cli/directory.md +63 -0
- package/docs/cli/dns.md +48 -0
- package/docs/cli/docs.md +28 -0
- package/docs/cli/doctor.md +63 -0
- package/docs/cli/flows.md +18 -0
- package/docs/cli/gateway.md +307 -0
- package/docs/cli/health.md +36 -0
- package/docs/cli/hooks.md +337 -0
- package/docs/cli/index.md +1836 -0
- package/docs/cli/logs.md +59 -0
- package/docs/cli/mcp.md +505 -0
- package/docs/cli/memory.md +139 -0
- package/docs/cli/message.md +300 -0
- package/docs/cli/models.md +136 -0
- package/docs/cli/node.md +137 -0
- package/docs/cli/nodes.md +66 -0
- package/docs/cli/onboard.md +171 -0
- package/docs/cli/pairing.md +65 -0
- package/docs/cli/plugins.md +305 -0
- package/docs/cli/qr.md +52 -0
- package/docs/cli/reset.md +35 -0
- package/docs/cli/sandbox.md +197 -0
- package/docs/cli/secrets.md +197 -0
- package/docs/cli/security.md +86 -0
- package/docs/cli/sessions.md +113 -0
- package/docs/cli/setup.md +45 -0
- package/docs/cli/skills.md +59 -0
- package/docs/cli/status.md +35 -0
- package/docs/cli/system.md +71 -0
- package/docs/cli/tui.md +30 -0
- package/docs/cli/uninstall.md +39 -0
- package/docs/cli/update.md +113 -0
- package/docs/cli/voicecall.md +34 -0
- package/docs/cli/webhooks.md +91 -0
- package/docs/concepts/agent-loop.md +168 -0
- package/docs/concepts/agent-workspace.md +246 -0
- package/docs/concepts/agent.md +129 -0
- package/docs/concepts/architecture.md +156 -0
- package/docs/concepts/compaction.md +122 -0
- package/docs/concepts/context-engine.md +274 -0
- package/docs/concepts/context.md +179 -0
- package/docs/concepts/delegate-architecture.md +307 -0
- package/docs/concepts/dreaming.md +173 -0
- package/docs/concepts/features.md +76 -0
- package/docs/concepts/markdown-formatting.md +130 -0
- package/docs/concepts/memory-builtin.md +105 -0
- package/docs/concepts/memory-honcho.md +140 -0
- package/docs/concepts/memory-qmd.md +163 -0
- package/docs/concepts/memory-search.md +141 -0
- package/docs/concepts/memory.md +121 -0
- package/docs/concepts/messages.md +161 -0
- package/docs/concepts/model-failover.md +349 -0
- package/docs/concepts/model-providers.md +799 -0
- package/docs/concepts/models.md +255 -0
- package/docs/concepts/multi-agent.md +615 -0
- package/docs/concepts/oauth.md +225 -0
- package/docs/concepts/presence.md +102 -0
- package/docs/concepts/queue.md +89 -0
- package/docs/concepts/retry.md +69 -0
- package/docs/concepts/session-pruning.md +92 -0
- package/docs/concepts/session-tool.md +141 -0
- package/docs/concepts/session.md +116 -0
- package/docs/concepts/soul.md +110 -0
- package/docs/concepts/streaming.md +161 -0
- package/docs/concepts/system-prompt.md +182 -0
- package/docs/concepts/timezone.md +97 -0
- package/docs/concepts/typebox.md +307 -0
- package/docs/concepts/typing-indicators.md +69 -0
- package/docs/concepts/usage-tracking.md +59 -0
- package/docs/date-time.md +128 -0
- package/docs/debug/node-issue.md +85 -0
- package/docs/diagnostics/flags.md +91 -0
- package/docs/docs.json +1601 -0
- package/docs/gateway/authentication.md +218 -0
- package/docs/gateway/background-process.md +131 -0
- package/docs/gateway/bonjour.md +179 -0
- package/docs/gateway/bridge-protocol.md +89 -0
- package/docs/gateway/cli-backends.md +310 -0
- package/docs/gateway/configuration-examples.md +631 -0
- package/docs/gateway/configuration-reference.md +3618 -0
- package/docs/gateway/configuration.md +698 -0
- package/docs/gateway/discovery.md +141 -0
- package/docs/gateway/doctor.md +494 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +61 -0
- package/docs/gateway/heartbeat.md +443 -0
- package/docs/gateway/index.md +367 -0
- package/docs/gateway/local-models.md +163 -0
- package/docs/gateway/logging.md +113 -0
- package/docs/gateway/multiple-gateways.md +120 -0
- package/docs/gateway/network-model.md +25 -0
- package/docs/gateway/openai-http-api.md +280 -0
- package/docs/gateway/openresponses-http-api.md +340 -0
- package/docs/gateway/openshell.md +307 -0
- package/docs/gateway/pairing.md +138 -0
- package/docs/gateway/protocol.md +588 -0
- package/docs/gateway/remote-gateway-readme.md +164 -0
- package/docs/gateway/remote.md +251 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +141 -0
- package/docs/gateway/sandboxing.md +473 -0
- package/docs/gateway/secrets-plan-contract.md +116 -0
- package/docs/gateway/secrets.md +541 -0
- package/docs/gateway/security/index.md +1362 -0
- package/docs/gateway/tailscale.md +136 -0
- package/docs/gateway/tools-invoke-http-api.md +161 -0
- package/docs/gateway/troubleshooting.md +451 -0
- package/docs/gateway/trusted-proxy-auth.md +399 -0
- package/docs/help/debugging.md +168 -0
- package/docs/help/environment.md +165 -0
- package/docs/help/faq.md +3244 -0
- package/docs/help/index.md +28 -0
- package/docs/help/scripts.md +27 -0
- package/docs/help/testing.md +640 -0
- package/docs/help/troubleshooting.md +372 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-step2-create-app.png +0 -0
- package/docs/images/feishu-step3-credentials.png +0 -0
- package/docs/images/feishu-step4-permissions.png +0 -0
- package/docs/images/feishu-step5-bot-capability.png +0 -0
- package/docs/images/feishu-step6-event-subscription.png +0 -0
- package/docs/images/feishu-verification-token.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +230 -0
- package/docs/install/azure.md +311 -0
- package/docs/install/bun.md +55 -0
- package/docs/install/clawdock.md +106 -0
- package/docs/install/development-channels.md +131 -0
- package/docs/install/digitalocean.md +129 -0
- package/docs/install/docker-vm-runtime.md +142 -0
- package/docs/install/docker.md +412 -0
- package/docs/install/exe-dev.md +133 -0
- package/docs/install/fly.md +504 -0
- package/docs/install/gcp.md +412 -0
- package/docs/install/hetzner.md +259 -0
- package/docs/install/index.md +212 -0
- package/docs/install/installer.md +443 -0
- package/docs/install/kubernetes.md +192 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-matrix.md +349 -0
- package/docs/install/migrating.md +112 -0
- package/docs/install/nix.md +89 -0
- package/docs/install/node.md +144 -0
- package/docs/install/northflank.mdx +42 -0
- package/docs/install/oracle.md +158 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +90 -0
- package/docs/install/raspberry-pi.md +159 -0
- package/docs/install/render.mdx +165 -0
- package/docs/install/uninstall.md +128 -0
- package/docs/install/updating.md +142 -0
- package/docs/logging.md +389 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +69 -0
- package/docs/nodes/audio.md +191 -0
- package/docs/nodes/camera.md +162 -0
- package/docs/nodes/images.md +73 -0
- package/docs/nodes/index.md +408 -0
- package/docs/nodes/location-command.md +98 -0
- package/docs/nodes/media-understanding.md +432 -0
- package/docs/nodes/talk.md +92 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +66 -0
- package/docs/perplexity.md +181 -0
- package/docs/pi-dev.md +80 -0
- package/docs/pi.md +570 -0
- package/docs/platforms/android.md +244 -0
- package/docs/platforms/digitalocean.md +266 -0
- package/docs/platforms/index.md +55 -0
- package/docs/platforms/ios.md +223 -0
- package/docs/platforms/linux.md +100 -0
- package/docs/platforms/mac/bundled-gateway.md +75 -0
- package/docs/platforms/mac/canvas.md +125 -0
- package/docs/platforms/mac/child-process.md +69 -0
- package/docs/platforms/mac/dev-setup.md +107 -0
- package/docs/platforms/mac/health.md +34 -0
- package/docs/platforms/mac/icon.md +31 -0
- package/docs/platforms/mac/logging.md +57 -0
- package/docs/platforms/mac/menu-bar.md +81 -0
- package/docs/platforms/mac/peekaboo.md +65 -0
- package/docs/platforms/mac/permissions.md +50 -0
- package/docs/platforms/mac/remote.md +84 -0
- package/docs/platforms/mac/signing.md +47 -0
- package/docs/platforms/mac/skills.md +40 -0
- package/docs/platforms/mac/voice-overlay.md +60 -0
- package/docs/platforms/mac/voicewake.md +67 -0
- package/docs/platforms/mac/webchat.md +51 -0
- package/docs/platforms/mac/xpc.md +61 -0
- package/docs/platforms/macos.md +229 -0
- package/docs/platforms/oracle.md +305 -0
- package/docs/platforms/raspberry-pi.md +420 -0
- package/docs/platforms/windows.md +241 -0
- package/docs/plugins/agent-tools.md +10 -0
- package/docs/plugins/architecture.md +1609 -0
- package/docs/plugins/building-extensions.md +10 -0
- package/docs/plugins/building-plugins.md +319 -0
- package/docs/plugins/bundles.md +292 -0
- package/docs/plugins/community.md +149 -0
- package/docs/plugins/manifest.md +412 -0
- package/docs/plugins/sdk-channel-plugins.md +508 -0
- package/docs/plugins/sdk-entrypoints.md +210 -0
- package/docs/plugins/sdk-migration.md +359 -0
- package/docs/plugins/sdk-overview.md +475 -0
- package/docs/plugins/sdk-provider-plugins.md +712 -0
- package/docs/plugins/sdk-runtime.md +381 -0
- package/docs/plugins/sdk-setup.md +516 -0
- package/docs/plugins/sdk-testing.md +263 -0
- package/docs/plugins/voice-call.md +466 -0
- package/docs/plugins/zalouser.md +78 -0
- package/docs/prose.md +134 -0
- package/docs/providers/anthropic.md +402 -0
- package/docs/providers/bedrock-mantle.md +91 -0
- package/docs/providers/bedrock.md +273 -0
- package/docs/providers/chutes.md +103 -0
- package/docs/providers/claude-max-api-proxy.md +163 -0
- package/docs/providers/cloudflare-ai-gateway.md +71 -0
- package/docs/providers/deepgram.md +93 -0
- package/docs/providers/deepseek.md +53 -0
- package/docs/providers/fireworks.md +69 -0
- package/docs/providers/github-copilot.md +80 -0
- package/docs/providers/glm.md +68 -0
- package/docs/providers/google.md +149 -0
- package/docs/providers/groq.md +105 -0
- package/docs/providers/huggingface.md +193 -0
- package/docs/providers/index.md +81 -0
- package/docs/providers/kilocode.md +89 -0
- package/docs/providers/litellm.md +159 -0
- package/docs/providers/minimax.md +281 -0
- package/docs/providers/mistral.md +68 -0
- package/docs/providers/models.md +56 -0
- package/docs/providers/moonshot.md +224 -0
- package/docs/providers/nvidia.md +58 -0
- package/docs/providers/ollama.md +379 -0
- package/docs/providers/openai.md +472 -0
- package/docs/providers/opencode-go.md +45 -0
- package/docs/providers/opencode.md +68 -0
- package/docs/providers/openrouter.md +59 -0
- package/docs/providers/perplexity-provider.md +62 -0
- package/docs/providers/qianfan.md +90 -0
- package/docs/providers/qwen.md +128 -0
- package/docs/providers/qwen_modelstudio.md +137 -0
- package/docs/providers/sglang.md +115 -0
- package/docs/providers/stepfun.md +152 -0
- package/docs/providers/synthetic.md +101 -0
- package/docs/providers/together.md +70 -0
- package/docs/providers/venice.md +282 -0
- package/docs/providers/vercel-ai-gateway.md +60 -0
- package/docs/providers/vllm.md +103 -0
- package/docs/providers/volcengine.md +94 -0
- package/docs/providers/xai.md +94 -0
- package/docs/providers/xiaomi.md +89 -0
- package/docs/providers/zai.md +75 -0
- package/docs/reference/AGENTS.default.md +126 -0
- package/docs/reference/RELEASING.md +138 -0
- package/docs/reference/api-usage-costs.md +198 -0
- package/docs/reference/credits.md +30 -0
- package/docs/reference/device-models.md +47 -0
- package/docs/reference/memory-config.md +421 -0
- package/docs/reference/prompt-caching.md +344 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +148 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +607 -0
- package/docs/reference/session-management-compaction.md +352 -0
- package/docs/reference/templates/AGENTS.dev.md +84 -0
- package/docs/reference/templates/AGENTS.md +219 -0
- package/docs/reference/templates/BOOT.md +12 -0
- package/docs/reference/templates/BOOTSTRAP.md +62 -0
- package/docs/reference/templates/CLAUDE.md +1 -0
- package/docs/reference/templates/HEARTBEAT.md +14 -0
- package/docs/reference/templates/IDENTITY.dev.md +48 -0
- package/docs/reference/templates/IDENTITY.md +30 -0
- package/docs/reference/templates/SOUL.dev.md +77 -0
- package/docs/reference/templates/SOUL.md +45 -0
- package/docs/reference/templates/TOOLS.dev.md +25 -0
- package/docs/reference/templates/TOOLS.md +47 -0
- package/docs/reference/templates/USER.dev.md +19 -0
- package/docs/reference/templates/USER.md +24 -0
- package/docs/reference/test.md +119 -0
- package/docs/reference/token-use.md +197 -0
- package/docs/reference/transcript-hygiene.md +151 -0
- package/docs/reference/wizard.md +245 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +98 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +608 -0
- package/docs/security/formal-verification.md +167 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +9 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +41 -0
- package/docs/start/docs-directory.md +67 -0
- package/docs/start/getting-started.md +148 -0
- package/docs/start/hubs.md +199 -0
- package/docs/start/lore.md +219 -0
- package/docs/start/onboarding-overview.md +69 -0
- package/docs/start/onboarding.md +92 -0
- package/docs/start/openclaw.md +225 -0
- package/docs/start/quickstart.md +22 -0
- package/docs/start/setup.md +172 -0
- package/docs/start/showcase.md +418 -0
- package/docs/start/wizard-cli-automation.md +233 -0
- package/docs/start/wizard-cli-reference.md +324 -0
- package/docs/start/wizard.md +127 -0
- package/docs/style.css +37 -0
- package/docs/tools/acp-agents.md +837 -0
- package/docs/tools/agent-send.md +100 -0
- package/docs/tools/apply-patch.md +52 -0
- package/docs/tools/brave-search.md +107 -0
- package/docs/tools/browser-linux-troubleshooting.md +145 -0
- package/docs/tools/browser-login.md +73 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +221 -0
- package/docs/tools/browser.md +890 -0
- package/docs/tools/btw.md +142 -0
- package/docs/tools/capability-cookbook.md +119 -0
- package/docs/tools/clawhub.md +348 -0
- package/docs/tools/code-execution.md +90 -0
- package/docs/tools/creating-skills.md +119 -0
- package/docs/tools/diffs.md +434 -0
- package/docs/tools/duckduckgo-search.md +102 -0
- package/docs/tools/elevated.md +116 -0
- package/docs/tools/exa-search.md +127 -0
- package/docs/tools/exec-approvals.md +635 -0
- package/docs/tools/exec.md +237 -0
- package/docs/tools/firecrawl.md +147 -0
- package/docs/tools/gemini-search.md +98 -0
- package/docs/tools/grok-search.md +102 -0
- package/docs/tools/image-generation.md +139 -0
- package/docs/tools/index.md +174 -0
- package/docs/tools/kimi-search.md +98 -0
- package/docs/tools/llm-task.md +119 -0
- package/docs/tools/lobster.md +348 -0
- package/docs/tools/loop-detection.md +100 -0
- package/docs/tools/minimax-search.md +99 -0
- package/docs/tools/multi-agent-sandbox-tools.md +373 -0
- package/docs/tools/ollama-search.md +100 -0
- package/docs/tools/pdf.md +176 -0
- package/docs/tools/perplexity-search.md +185 -0
- package/docs/tools/plugin.md +348 -0
- package/docs/tools/reactions.md +78 -0
- package/docs/tools/searxng-search.md +132 -0
- package/docs/tools/skills-config.md +133 -0
- package/docs/tools/skills.md +377 -0
- package/docs/tools/slash-commands.md +322 -0
- package/docs/tools/subagents.md +341 -0
- package/docs/tools/tavily.md +129 -0
- package/docs/tools/thinking.md +102 -0
- package/docs/tools/tts.md +452 -0
- package/docs/tools/web-fetch.md +159 -0
- package/docs/tools/web.md +417 -0
- package/docs/tts.md +452 -0
- package/docs/vps.md +115 -0
- package/docs/web/control-ui.md +318 -0
- package/docs/web/dashboard.md +93 -0
- package/docs/web/index.md +126 -0
- package/docs/web/tui.md +176 -0
- package/docs/web/webchat.md +77 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/durar.mjs +180 -0
- package/package.json +1259 -0
- package/scripts/npm-runner.mjs +111 -0
- package/scripts/postinstall-bundled-plugins.mjs +188 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +199 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +316 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +885 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +320 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/notion/SKILL.md +174 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +62 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +88 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +151 -0
- package/skills/sherpa-onnx-tts/SKILL.md +109 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +372 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +159 -0
- package/skills/skill-creator/scripts/test_package_skill.py +160 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +72 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/taskflow/SKILL.md +149 -0
- package/skills/taskflow/examples/inbox-triage.lobster +33 -0
- package/skills/taskflow/examples/pr-intake.lobster +32 -0
- package/skills/taskflow-inbox-triage/SKILL.md +119 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +170 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +108 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +129 -0
- package/skills/xurl/SKILL.md +461 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Browser-based control UI for the Gateway (chat, nodes, config)"
|
|
3
|
+
read_when:
|
|
4
|
+
- You want to operate the Gateway from a browser
|
|
5
|
+
- You want Tailnet access without SSH tunnels
|
|
6
|
+
title: "Control UI"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Control UI (browser)
|
|
10
|
+
|
|
11
|
+
The Control UI is a small **Vite + Lit** single-page app served by the Gateway:
|
|
12
|
+
|
|
13
|
+
- default: `http://<host>:18789/`
|
|
14
|
+
- optional prefix: set `gateway.controlUi.basePath` (e.g. `/Durar`)
|
|
15
|
+
|
|
16
|
+
It speaks **directly to the Gateway WebSocket** on the same port.
|
|
17
|
+
|
|
18
|
+
## Quick open (local)
|
|
19
|
+
|
|
20
|
+
If the Gateway is running on the same computer, open:
|
|
21
|
+
|
|
22
|
+
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (or [http://localhost:18789/](http://localhost:18789/))
|
|
23
|
+
|
|
24
|
+
If the page fails to load, start the Gateway first: `Durar gateway`.
|
|
25
|
+
|
|
26
|
+
Auth is supplied during the WebSocket handshake via:
|
|
27
|
+
|
|
28
|
+
- `connect.params.auth.token`
|
|
29
|
+
- `connect.params.auth.password`
|
|
30
|
+
- Tailscale Serve identity headers when `gateway.auth.allowTailscale: true`
|
|
31
|
+
- trusted-proxy identity headers when `gateway.auth.mode: "trusted-proxy"`
|
|
32
|
+
|
|
33
|
+
The dashboard settings panel keeps a token for the current browser tab session
|
|
34
|
+
and selected gateway URL; passwords are not persisted. Onboarding usually
|
|
35
|
+
generates a gateway token for shared-secret auth on first connect, but password
|
|
36
|
+
auth works too when `gateway.auth.mode` is `"password"`.
|
|
37
|
+
|
|
38
|
+
## Device pairing (first connection)
|
|
39
|
+
|
|
40
|
+
When you connect to the Control UI from a new browser or device, the Gateway
|
|
41
|
+
requires a **one-time pairing approval** — even if you're on the same Tailnet
|
|
42
|
+
with `gateway.auth.allowTailscale: true`. This is a security measure to prevent
|
|
43
|
+
unauthorized access.
|
|
44
|
+
|
|
45
|
+
**What you'll see:** "disconnected (1008): pairing required"
|
|
46
|
+
|
|
47
|
+
**To approve the device:**
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# List pending requests
|
|
51
|
+
Durar devices list
|
|
52
|
+
|
|
53
|
+
# Approve by request ID
|
|
54
|
+
Durar devices approve <requestId>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
If the browser retries pairing with changed auth details (role/scopes/public
|
|
58
|
+
key), the previous pending request is superseded and a new `requestId` is
|
|
59
|
+
created. Re-run `Durar devices list` before approval.
|
|
60
|
+
|
|
61
|
+
Once approved, the device is remembered and won't require re-approval unless
|
|
62
|
+
you revoke it with `Durar devices revoke --device <id> --role <role>`. See
|
|
63
|
+
[Devices CLI](/cli/devices) for token rotation and revocation.
|
|
64
|
+
|
|
65
|
+
**Notes:**
|
|
66
|
+
|
|
67
|
+
- Direct local loopback browser connections (`127.0.0.1` / `localhost`) are
|
|
68
|
+
auto-approved.
|
|
69
|
+
- Tailnet and LAN browser connects still require explicit approval, even when
|
|
70
|
+
they originate from the same machine.
|
|
71
|
+
- Each browser profile generates a unique device ID, so switching browsers or
|
|
72
|
+
clearing browser data will require re-pairing.
|
|
73
|
+
|
|
74
|
+
## Language support
|
|
75
|
+
|
|
76
|
+
The Control UI can localize itself on first load based on your browser locale, and you can override it later from the language picker in the Access card.
|
|
77
|
+
|
|
78
|
+
- Supported locales: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`
|
|
79
|
+
- Non-English translations are lazy-loaded in the browser.
|
|
80
|
+
- The selected locale is saved in browser storage and reused on future visits.
|
|
81
|
+
- Missing translation keys fall back to English.
|
|
82
|
+
|
|
83
|
+
## What it can do (today)
|
|
84
|
+
|
|
85
|
+
- Chat with the model via Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`)
|
|
86
|
+
- Stream tool calls + live tool output cards in Chat (agent events)
|
|
87
|
+
- Channels: built-in plus bundled/external plugin channels status, QR login, and per-channel config (`channels.status`, `web.login.*`, `config.patch`)
|
|
88
|
+
- Instances: presence list + refresh (`system-presence`)
|
|
89
|
+
- Sessions: list + per-session model/thinking/fast/verbose/reasoning overrides (`sessions.list`, `sessions.patch`)
|
|
90
|
+
- Cron jobs: list/add/edit/run/enable/disable + run history (`cron.*`)
|
|
91
|
+
- Skills: status, enable/disable, install, API key updates (`skills.*`)
|
|
92
|
+
- Nodes: list + caps (`node.list`)
|
|
93
|
+
- Exec approvals: edit gateway or node allowlists + ask policy for `exec host=gateway/node` (`exec.approvals.*`)
|
|
94
|
+
- Config: view/edit `~/.Durar/Durar.json` (`config.get`, `config.set`)
|
|
95
|
+
- Config: apply + restart with validation (`config.apply`) and wake the last active session
|
|
96
|
+
- Config writes include a base-hash guard to prevent clobbering concurrent edits
|
|
97
|
+
- Config writes (`config.set`/`config.apply`/`config.patch`) also preflight active SecretRef resolution for refs in the submitted config payload; unresolved active submitted refs are rejected before write
|
|
98
|
+
- Config schema + form rendering (`config.schema` / `config.schema.lookup`,
|
|
99
|
+
including field `title` / `description`, matched UI hints, immediate child
|
|
100
|
+
summaries, docs metadata on nested object/wildcard/array/composition nodes,
|
|
101
|
+
plus plugin + channel schemas when available); Raw JSON editor is
|
|
102
|
+
available only when the snapshot has a safe raw round-trip
|
|
103
|
+
- If a snapshot cannot safely round-trip raw text, Control UI forces Form mode and disables Raw mode for that snapshot
|
|
104
|
+
- Structured SecretRef object values are rendered read-only in form text inputs to prevent accidental object-to-string corruption
|
|
105
|
+
- Debug: status/health/models snapshots + event log + manual RPC calls (`status`, `health`, `models.list`)
|
|
106
|
+
- Logs: live tail of gateway file logs with filter/export (`logs.tail`)
|
|
107
|
+
- Update: run a package/git update + restart (`update.run`) with a restart report
|
|
108
|
+
|
|
109
|
+
Cron jobs panel notes:
|
|
110
|
+
|
|
111
|
+
- For isolated jobs, delivery defaults to announce summary. You can switch to none if you want internal-only runs.
|
|
112
|
+
- Channel/target fields appear when announce is selected.
|
|
113
|
+
- Webhook mode uses `delivery.mode = "webhook"` with `delivery.to` set to a valid HTTP(S) webhook URL.
|
|
114
|
+
- For main-session jobs, webhook and none delivery modes are available.
|
|
115
|
+
- Advanced edit controls include delete-after-run, clear agent override, cron exact/stagger options,
|
|
116
|
+
agent model/thinking overrides, and best-effort delivery toggles.
|
|
117
|
+
- Form validation is inline with field-level errors; invalid values disable the save button until fixed.
|
|
118
|
+
- Set `cron.webhookToken` to send a dedicated bearer token, if omitted the webhook is sent without an auth header.
|
|
119
|
+
- Deprecated fallback: stored legacy jobs with `notify: true` can still use `cron.webhook` until migrated.
|
|
120
|
+
|
|
121
|
+
## Chat behavior
|
|
122
|
+
|
|
123
|
+
- `chat.send` is **non-blocking**: it acks immediately with `{ runId, status: "started" }` and the response streams via `chat` events.
|
|
124
|
+
- Re-sending with the same `idempotencyKey` returns `{ status: "in_flight" }` while running, and `{ status: "ok" }` after completion.
|
|
125
|
+
- `chat.history` responses are size-bounded for UI safety. When transcript entries are too large, Gateway may truncate long text fields, omit heavy metadata blocks, and replace oversized messages with a placeholder (`[chat.history omitted: message too large]`).
|
|
126
|
+
- `chat.history` also strips display-only inline directive tags from visible assistant text (for example `[[reply_to_*]]` and `[[audio_as_voice]]`), plain-text tool-call XML payloads (including `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, and truncated tool-call blocks), and leaked ASCII/full-width model control tokens, and omits assistant entries whose whole visible text is only the exact silent token `NO_REPLY` / `no_reply`.
|
|
127
|
+
- `chat.inject` appends an assistant note to the session transcript and broadcasts a `chat` event for UI-only updates (no agent run, no channel delivery).
|
|
128
|
+
- The chat header model and thinking pickers patch the active session immediately through `sessions.patch`; they are persistent session overrides, not one-turn-only send options.
|
|
129
|
+
- Stop:
|
|
130
|
+
- Click **Stop** (calls `chat.abort`)
|
|
131
|
+
- Type `/stop` (or standalone abort phrases like `stop`, `stop action`, `stop run`, `stop Durar`, `please stop`) to abort out-of-band
|
|
132
|
+
- `chat.abort` supports `{ sessionKey }` (no `runId`) to abort all active runs for that session
|
|
133
|
+
- Abort partial retention:
|
|
134
|
+
- When a run is aborted, partial assistant text can still be shown in the UI
|
|
135
|
+
- Gateway persists aborted partial assistant text into transcript history when buffered output exists
|
|
136
|
+
- Persisted entries include abort metadata so transcript consumers can tell abort partials from normal completion output
|
|
137
|
+
|
|
138
|
+
## Tailnet access (recommended)
|
|
139
|
+
|
|
140
|
+
### Integrated Tailscale Serve (preferred)
|
|
141
|
+
|
|
142
|
+
Keep the Gateway on loopback and let Tailscale Serve proxy it with HTTPS:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
Durar gateway --tailscale serve
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Open:
|
|
149
|
+
|
|
150
|
+
- `https://<magicdns>/` (or your configured `gateway.controlUi.basePath`)
|
|
151
|
+
|
|
152
|
+
By default, Control UI/WebSocket Serve requests can authenticate via Tailscale identity headers
|
|
153
|
+
(`tailscale-user-login`) when `gateway.auth.allowTailscale` is `true`. Durar
|
|
154
|
+
verifies the identity by resolving the `x-forwarded-for` address with
|
|
155
|
+
`tailscale whois` and matching it to the header, and only accepts these when the
|
|
156
|
+
request hits loopback with Tailscale’s `x-forwarded-*` headers. Set
|
|
157
|
+
`gateway.auth.allowTailscale: false` if you want to require explicit shared-secret
|
|
158
|
+
credentials even for Serve traffic. Then use `gateway.auth.mode: "token"` or
|
|
159
|
+
`"password"`.
|
|
160
|
+
For that async Serve identity path, failed auth attempts for the same client IP
|
|
161
|
+
and auth scope are serialized before rate-limit writes. Concurrent bad retries
|
|
162
|
+
from the same browser can therefore show `retry later` on the second request
|
|
163
|
+
instead of two plain mismatches racing in parallel.
|
|
164
|
+
Tokenless Serve auth assumes the gateway host is trusted. If untrusted local
|
|
165
|
+
code may run on that host, require token/password auth.
|
|
166
|
+
|
|
167
|
+
### Bind to tailnet + token
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
Durar gateway --bind tailnet --token "$(openssl rand -hex 32)"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Then open:
|
|
174
|
+
|
|
175
|
+
- `http://<tailscale-ip>:18789/` (or your configured `gateway.controlUi.basePath`)
|
|
176
|
+
|
|
177
|
+
Paste the matching shared secret into the UI settings (sent as
|
|
178
|
+
`connect.params.auth.token` or `connect.params.auth.password`).
|
|
179
|
+
|
|
180
|
+
## Insecure HTTP
|
|
181
|
+
|
|
182
|
+
If you open the dashboard over plain HTTP (`http://<lan-ip>` or `http://<tailscale-ip>`),
|
|
183
|
+
the browser runs in a **non-secure context** and blocks WebCrypto. By default,
|
|
184
|
+
Durar **blocks** Control UI connections without device identity.
|
|
185
|
+
|
|
186
|
+
Documented exceptions:
|
|
187
|
+
|
|
188
|
+
- localhost-only insecure HTTP compatibility with `gateway.controlUi.allowInsecureAuth=true`
|
|
189
|
+
- successful operator Control UI auth through `gateway.auth.mode: "trusted-proxy"`
|
|
190
|
+
- break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
|
|
191
|
+
|
|
192
|
+
**Recommended fix:** use HTTPS (Tailscale Serve) or open the UI locally:
|
|
193
|
+
|
|
194
|
+
- `https://<magicdns>/` (Serve)
|
|
195
|
+
- `http://127.0.0.1:18789/` (on the gateway host)
|
|
196
|
+
|
|
197
|
+
**Insecure-auth toggle behavior:**
|
|
198
|
+
|
|
199
|
+
```json5
|
|
200
|
+
{
|
|
201
|
+
gateway: {
|
|
202
|
+
controlUi: { allowInsecureAuth: true },
|
|
203
|
+
bind: "tailnet",
|
|
204
|
+
auth: { mode: "token", token: "replace-me" },
|
|
205
|
+
},
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`allowInsecureAuth` is a local compatibility toggle only:
|
|
210
|
+
|
|
211
|
+
- It allows localhost Control UI sessions to proceed without device identity in
|
|
212
|
+
non-secure HTTP contexts.
|
|
213
|
+
- It does not bypass pairing checks.
|
|
214
|
+
- It does not relax remote (non-localhost) device identity requirements.
|
|
215
|
+
|
|
216
|
+
**Break-glass only:**
|
|
217
|
+
|
|
218
|
+
```json5
|
|
219
|
+
{
|
|
220
|
+
gateway: {
|
|
221
|
+
controlUi: { dangerouslyDisableDeviceAuth: true },
|
|
222
|
+
bind: "tailnet",
|
|
223
|
+
auth: { mode: "token", token: "replace-me" },
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
`dangerouslyDisableDeviceAuth` disables Control UI device identity checks and is a
|
|
229
|
+
severe security downgrade. Revert quickly after emergency use.
|
|
230
|
+
|
|
231
|
+
Trusted-proxy note:
|
|
232
|
+
|
|
233
|
+
- successful trusted-proxy auth can admit **operator** Control UI sessions without
|
|
234
|
+
device identity
|
|
235
|
+
- this does **not** extend to node-role Control UI sessions
|
|
236
|
+
- same-host loopback reverse proxies still do not satisfy trusted-proxy auth; see
|
|
237
|
+
[Trusted Proxy Auth](/gateway/trusted-proxy-auth)
|
|
238
|
+
|
|
239
|
+
See [Tailscale](/gateway/tailscale) for HTTPS setup guidance.
|
|
240
|
+
|
|
241
|
+
## Building the UI
|
|
242
|
+
|
|
243
|
+
The Gateway serves static files from `dist/control-ui`. Build them with:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
pnpm ui:build # auto-installs UI deps on first run
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Optional absolute base (when you want fixed asset URLs):
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
Durar_CONTROL_UI_BASE_PATH=/Durar/ pnpm ui:build
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
For local development (separate dev server):
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
pnpm ui:dev # auto-installs UI deps on first run
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Then point the UI at your Gateway WS URL (e.g. `ws://127.0.0.1:18789`).
|
|
262
|
+
|
|
263
|
+
## Debugging/testing: dev server + remote Gateway
|
|
264
|
+
|
|
265
|
+
The Control UI is static files; the WebSocket target is configurable and can be
|
|
266
|
+
different from the HTTP origin. This is handy when you want the Vite dev server
|
|
267
|
+
locally but the Gateway runs elsewhere.
|
|
268
|
+
|
|
269
|
+
1. Start the UI dev server: `pnpm ui:dev`
|
|
270
|
+
2. Open a URL like:
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Optional one-time auth (if needed):
|
|
277
|
+
|
|
278
|
+
```text
|
|
279
|
+
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789#token=<gateway-token>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Notes:
|
|
283
|
+
|
|
284
|
+
- `gatewayUrl` is stored in localStorage after load and removed from the URL.
|
|
285
|
+
- `token` should be passed via the URL fragment (`#token=...`) whenever possible. Fragments are not sent to the server, which avoids request-log and Referer leakage. Legacy `?token=` query params are still imported once for compatibility, but only as a fallback, and are stripped immediately after bootstrap.
|
|
286
|
+
- `password` is kept in memory only.
|
|
287
|
+
- When `gatewayUrl` is set, the UI does not fall back to config or environment credentials.
|
|
288
|
+
Provide `token` (or `password`) explicitly. Missing explicit credentials is an error.
|
|
289
|
+
- Use `wss://` when the Gateway is behind TLS (Tailscale Serve, HTTPS proxy, etc.).
|
|
290
|
+
- `gatewayUrl` is only accepted in a top-level window (not embedded) to prevent clickjacking.
|
|
291
|
+
- Non-loopback Control UI deployments must set `gateway.controlUi.allowedOrigins`
|
|
292
|
+
explicitly (full origins). This includes remote dev setups.
|
|
293
|
+
- Do not use `gateway.controlUi.allowedOrigins: ["*"]` except for tightly controlled
|
|
294
|
+
local testing. It means allow any browser origin, not “match whatever host I am
|
|
295
|
+
using.”
|
|
296
|
+
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` enables
|
|
297
|
+
Host-header origin fallback mode, but it is a dangerous security mode.
|
|
298
|
+
|
|
299
|
+
Example:
|
|
300
|
+
|
|
301
|
+
```json5
|
|
302
|
+
{
|
|
303
|
+
gateway: {
|
|
304
|
+
controlUi: {
|
|
305
|
+
allowedOrigins: ["http://localhost:5173"],
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Remote access setup details: [Remote access](/gateway/remote).
|
|
312
|
+
|
|
313
|
+
## Related
|
|
314
|
+
|
|
315
|
+
- [Dashboard](/web/dashboard) — gateway dashboard
|
|
316
|
+
- [WebChat](/web/webchat) — browser-based chat interface
|
|
317
|
+
- [TUI](/web/tui) — terminal user interface
|
|
318
|
+
- [Health Checks](/gateway/health) — gateway health monitoring
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway dashboard (Control UI) access and auth"
|
|
3
|
+
read_when:
|
|
4
|
+
- Changing dashboard authentication or exposure modes
|
|
5
|
+
title: "Dashboard"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Dashboard (Control UI)
|
|
9
|
+
|
|
10
|
+
The Gateway dashboard is the browser Control UI served at `/` by default
|
|
11
|
+
(override with `gateway.controlUi.basePath`).
|
|
12
|
+
|
|
13
|
+
Quick open (local Gateway):
|
|
14
|
+
|
|
15
|
+
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (or [http://localhost:18789/](http://localhost:18789/))
|
|
16
|
+
|
|
17
|
+
Key references:
|
|
18
|
+
|
|
19
|
+
- [Control UI](/web/control-ui) for usage and UI capabilities.
|
|
20
|
+
- [Tailscale](/gateway/tailscale) for Serve/Funnel automation.
|
|
21
|
+
- [Web surfaces](/web) for bind modes and security notes.
|
|
22
|
+
|
|
23
|
+
Authentication is enforced at the WebSocket handshake via the configured gateway
|
|
24
|
+
auth path:
|
|
25
|
+
|
|
26
|
+
- `connect.params.auth.token`
|
|
27
|
+
- `connect.params.auth.password`
|
|
28
|
+
- Tailscale Serve identity headers when `gateway.auth.allowTailscale: true`
|
|
29
|
+
- trusted-proxy identity headers when `gateway.auth.mode: "trusted-proxy"`
|
|
30
|
+
|
|
31
|
+
See `gateway.auth` in [Gateway configuration](/gateway/configuration).
|
|
32
|
+
|
|
33
|
+
Security note: the Control UI is an **admin surface** (chat, config, exec approvals).
|
|
34
|
+
Do not expose it publicly. The UI keeps dashboard URL tokens in sessionStorage
|
|
35
|
+
for the current browser tab session and selected gateway URL, and strips them from the URL after load.
|
|
36
|
+
Prefer localhost, Tailscale Serve, or an SSH tunnel.
|
|
37
|
+
|
|
38
|
+
## Fast path (recommended)
|
|
39
|
+
|
|
40
|
+
- After onboarding, the CLI auto-opens the dashboard and prints a clean (non-tokenized) link.
|
|
41
|
+
- Re-open anytime: `Durar dashboard` (copies link, opens browser if possible, shows SSH hint if headless).
|
|
42
|
+
- If the UI prompts for shared-secret auth, paste the configured token or
|
|
43
|
+
password into Control UI settings.
|
|
44
|
+
|
|
45
|
+
## Auth basics (local vs remote)
|
|
46
|
+
|
|
47
|
+
- **Localhost**: open `http://127.0.0.1:18789/`.
|
|
48
|
+
- **Shared-secret token source**: `gateway.auth.token` (or
|
|
49
|
+
`Durar_GATEWAY_TOKEN`); `Durar dashboard` can pass it via URL fragment
|
|
50
|
+
for one-time bootstrap, and the Control UI keeps it in sessionStorage for the
|
|
51
|
+
current browser tab session and selected gateway URL instead of localStorage.
|
|
52
|
+
- If `gateway.auth.token` is SecretRef-managed, `Durar dashboard`
|
|
53
|
+
prints/copies/opens a non-tokenized URL by design. This avoids exposing
|
|
54
|
+
externally managed tokens in shell logs, clipboard history, or browser-launch
|
|
55
|
+
arguments.
|
|
56
|
+
- If `gateway.auth.token` is configured as a SecretRef and is unresolved in your
|
|
57
|
+
current shell, `Durar dashboard` still prints a non-tokenized URL plus
|
|
58
|
+
actionable auth setup guidance.
|
|
59
|
+
- **Shared-secret password**: use the configured `gateway.auth.password` (or
|
|
60
|
+
`Durar_GATEWAY_PASSWORD`). The dashboard does not persist passwords across
|
|
61
|
+
reloads.
|
|
62
|
+
- **Identity-bearing modes**: Tailscale Serve can satisfy Control UI/WebSocket
|
|
63
|
+
auth via identity headers when `gateway.auth.allowTailscale: true`, and a
|
|
64
|
+
non-loopback identity-aware reverse proxy can satisfy
|
|
65
|
+
`gateway.auth.mode: "trusted-proxy"`. In those modes the dashboard does not
|
|
66
|
+
need a pasted shared secret for the WebSocket.
|
|
67
|
+
- **Not localhost**: use Tailscale Serve, a non-loopback shared-secret bind, a
|
|
68
|
+
non-loopback identity-aware reverse proxy with
|
|
69
|
+
`gateway.auth.mode: "trusted-proxy"`, or an SSH tunnel. HTTP APIs still use
|
|
70
|
+
shared-secret auth unless you intentionally run private-ingress
|
|
71
|
+
`gateway.auth.mode: "none"` or trusted-proxy HTTP auth. See
|
|
72
|
+
[Web surfaces](/web).
|
|
73
|
+
|
|
74
|
+
<a id="if-you-see-unauthorized-1008"></a>
|
|
75
|
+
|
|
76
|
+
## If you see "unauthorized" / 1008
|
|
77
|
+
|
|
78
|
+
- Ensure the gateway is reachable (local: `Durar status`; remote: SSH tunnel `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/`).
|
|
79
|
+
- For `AUTH_TOKEN_MISMATCH`, clients may do one trusted retry with a cached device token when the gateway returns retry hints. That cached-token retry reuses the token's cached approved scopes; explicit `deviceToken` / explicit `scopes` callers keep their requested scope set. If auth still fails after that retry, resolve token drift manually.
|
|
80
|
+
- Outside that retry path, connect auth precedence is explicit shared token/password first, then explicit `deviceToken`, then stored device token, then bootstrap token.
|
|
81
|
+
- On the async Tailscale Serve Control UI path, failed attempts for the same
|
|
82
|
+
`{scope, ip}` are serialized before the failed-auth limiter records them, so
|
|
83
|
+
the second concurrent bad retry can already show `retry later`.
|
|
84
|
+
- For token drift repair steps, follow [Token drift recovery checklist](/cli/devices#token-drift-recovery-checklist).
|
|
85
|
+
- Retrieve or supply the shared secret from the gateway host:
|
|
86
|
+
- Token: `Durar config get gateway.auth.token`
|
|
87
|
+
- Password: resolve the configured `gateway.auth.password` or
|
|
88
|
+
`Durar_GATEWAY_PASSWORD`
|
|
89
|
+
- SecretRef-managed token: resolve the external secret provider or export
|
|
90
|
+
`Durar_GATEWAY_TOKEN` in this shell, then rerun `Durar dashboard`
|
|
91
|
+
- No shared secret configured: `Durar doctor --generate-gateway-token`
|
|
92
|
+
- In the dashboard settings, paste the token or password into the auth field,
|
|
93
|
+
then connect.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway web surfaces: Control UI, bind modes, and security"
|
|
3
|
+
read_when:
|
|
4
|
+
- You want to access the Gateway over Tailscale
|
|
5
|
+
- You want the browser Control UI and config editing
|
|
6
|
+
title: "Web"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Web (Gateway)
|
|
10
|
+
|
|
11
|
+
The Gateway serves a small **browser Control UI** (Vite + Lit) from the same port as the Gateway WebSocket:
|
|
12
|
+
|
|
13
|
+
- default: `http://<host>:18789/`
|
|
14
|
+
- optional prefix: set `gateway.controlUi.basePath` (e.g. `/Durar`)
|
|
15
|
+
|
|
16
|
+
Capabilities live in [Control UI](/web/control-ui).
|
|
17
|
+
This page focuses on bind modes, security, and web-facing surfaces.
|
|
18
|
+
|
|
19
|
+
## Webhooks
|
|
20
|
+
|
|
21
|
+
When `hooks.enabled=true`, the Gateway also exposes a small webhook endpoint on the same HTTP server.
|
|
22
|
+
See [Gateway configuration](/gateway/configuration) → `hooks` for auth + payloads.
|
|
23
|
+
|
|
24
|
+
## Config (default-on)
|
|
25
|
+
|
|
26
|
+
The Control UI is **enabled by default** when assets are present (`dist/control-ui`).
|
|
27
|
+
You can control it via config:
|
|
28
|
+
|
|
29
|
+
```json5
|
|
30
|
+
{
|
|
31
|
+
gateway: {
|
|
32
|
+
controlUi: { enabled: true, basePath: "/Durar" }, // basePath optional
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Tailscale access
|
|
38
|
+
|
|
39
|
+
### Integrated Serve (recommended)
|
|
40
|
+
|
|
41
|
+
Keep the Gateway on loopback and let Tailscale Serve proxy it:
|
|
42
|
+
|
|
43
|
+
```json5
|
|
44
|
+
{
|
|
45
|
+
gateway: {
|
|
46
|
+
bind: "loopback",
|
|
47
|
+
tailscale: { mode: "serve" },
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Then start the gateway:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
Durar gateway
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Open:
|
|
59
|
+
|
|
60
|
+
- `https://<magicdns>/` (or your configured `gateway.controlUi.basePath`)
|
|
61
|
+
|
|
62
|
+
### Tailnet bind + token
|
|
63
|
+
|
|
64
|
+
```json5
|
|
65
|
+
{
|
|
66
|
+
gateway: {
|
|
67
|
+
bind: "tailnet",
|
|
68
|
+
controlUi: { enabled: true },
|
|
69
|
+
auth: { mode: "token", token: "your-token" },
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Then start the gateway (this non-loopback example uses shared-secret token
|
|
75
|
+
auth):
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
Durar gateway
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Open:
|
|
82
|
+
|
|
83
|
+
- `http://<tailscale-ip>:18789/` (or your configured `gateway.controlUi.basePath`)
|
|
84
|
+
|
|
85
|
+
### Public internet (Funnel)
|
|
86
|
+
|
|
87
|
+
```json5
|
|
88
|
+
{
|
|
89
|
+
gateway: {
|
|
90
|
+
bind: "loopback",
|
|
91
|
+
tailscale: { mode: "funnel" },
|
|
92
|
+
auth: { mode: "password" }, // or Durar_GATEWAY_PASSWORD
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Security notes
|
|
98
|
+
|
|
99
|
+
- Gateway auth is required by default (token, password, trusted-proxy, or Tailscale Serve identity headers when enabled).
|
|
100
|
+
- Non-loopback binds still **require** gateway auth. In practice that means token/password auth or an identity-aware reverse proxy with `gateway.auth.mode: "trusted-proxy"`.
|
|
101
|
+
- The wizard creates shared-secret auth by default and usually generates a
|
|
102
|
+
gateway token (even on loopback).
|
|
103
|
+
- In shared-secret mode, the UI sends `connect.params.auth.token` or
|
|
104
|
+
`connect.params.auth.password`.
|
|
105
|
+
- In identity-bearing modes such as Tailscale Serve or `trusted-proxy`, the
|
|
106
|
+
WebSocket auth check is satisfied from request headers instead.
|
|
107
|
+
- For non-loopback Control UI deployments, set `gateway.controlUi.allowedOrigins`
|
|
108
|
+
explicitly (full origins). Without it, gateway startup is refused by default.
|
|
109
|
+
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` enables
|
|
110
|
+
Host-header origin fallback mode, but is a dangerous security downgrade.
|
|
111
|
+
- With Serve, Tailscale identity headers can satisfy Control UI/WebSocket auth
|
|
112
|
+
when `gateway.auth.allowTailscale` is `true` (no token/password required).
|
|
113
|
+
HTTP API endpoints do not use those Tailscale identity headers; they follow
|
|
114
|
+
the gateway's normal HTTP auth mode instead. Set
|
|
115
|
+
`gateway.auth.allowTailscale: false` to require explicit credentials. See
|
|
116
|
+
[Tailscale](/gateway/tailscale) and [Security](/gateway/security). This
|
|
117
|
+
tokenless flow assumes the gateway host is trusted.
|
|
118
|
+
- `gateway.tailscale.mode: "funnel"` requires `gateway.auth.mode: "password"` (shared password).
|
|
119
|
+
|
|
120
|
+
## Building the UI
|
|
121
|
+
|
|
122
|
+
The Gateway serves static files from `dist/control-ui`. Build them with:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
pnpm ui:build # auto-installs UI deps on first run
|
|
126
|
+
```
|