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,516 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Plugin Setup and Config"
|
|
3
|
+
sidebarTitle: "Setup and Config"
|
|
4
|
+
summary: "Setup wizards, setup-entry.ts, config schemas, and package.json metadata"
|
|
5
|
+
read_when:
|
|
6
|
+
- You are adding a setup wizard to a plugin
|
|
7
|
+
- You need to understand setup-entry.ts vs index.ts
|
|
8
|
+
- You are defining plugin config schemas or package.json Durar metadata
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Plugin Setup and Config
|
|
12
|
+
|
|
13
|
+
Reference for plugin packaging (`package.json` metadata), manifests
|
|
14
|
+
(`Durar.plugin.json`), setup entries, and config schemas.
|
|
15
|
+
|
|
16
|
+
<Tip>
|
|
17
|
+
**Looking for a walkthrough?** The how-to guides cover packaging in context:
|
|
18
|
+
[Channel Plugins](/plugins/sdk-channel-plugins#step-1-package-and-manifest) and
|
|
19
|
+
[Provider Plugins](/plugins/sdk-provider-plugins#step-1-package-and-manifest).
|
|
20
|
+
</Tip>
|
|
21
|
+
|
|
22
|
+
## Package metadata
|
|
23
|
+
|
|
24
|
+
Your `package.json` needs an `Durar` field that tells the plugin system what
|
|
25
|
+
your plugin provides:
|
|
26
|
+
|
|
27
|
+
**Channel plugin:**
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"name": "@myorg/Durar-my-channel",
|
|
32
|
+
"version": "1.0.0",
|
|
33
|
+
"type": "module",
|
|
34
|
+
"Durar": {
|
|
35
|
+
"extensions": ["./index.ts"],
|
|
36
|
+
"setupEntry": "./setup-entry.ts",
|
|
37
|
+
"channel": {
|
|
38
|
+
"id": "my-channel",
|
|
39
|
+
"label": "My Channel",
|
|
40
|
+
"blurb": "Short description of the channel."
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Provider plugin / Durar Gateway publish baseline:**
|
|
47
|
+
|
|
48
|
+
```json Durar-Durar Gateway-package.json
|
|
49
|
+
{
|
|
50
|
+
"name": "@myorg/Durar-my-plugin",
|
|
51
|
+
"version": "1.0.0",
|
|
52
|
+
"type": "module",
|
|
53
|
+
"Durar": {
|
|
54
|
+
"extensions": ["./index.ts"],
|
|
55
|
+
"compat": {
|
|
56
|
+
"pluginApi": ">=2026.3.24-beta.2",
|
|
57
|
+
"minGatewayVersion": "2026.3.24-beta.2"
|
|
58
|
+
},
|
|
59
|
+
"build": {
|
|
60
|
+
"DurarVersion": "2026.3.24-beta.2",
|
|
61
|
+
"pluginSdkVersion": "2026.3.24-beta.2"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
If you publish the plugin externally on Durar Gateway, those `compat` and `build`
|
|
68
|
+
fields are required. The canonical publish snippets live in
|
|
69
|
+
`docs/snippets/plugin-publish/`.
|
|
70
|
+
|
|
71
|
+
### `Durar` fields
|
|
72
|
+
|
|
73
|
+
| Field | Type | Description |
|
|
74
|
+
| ------------ | ---------- | ------------------------------------------------------------------------------------------------------ |
|
|
75
|
+
| `extensions` | `string[]` | Entry point files (relative to package root) |
|
|
76
|
+
| `setupEntry` | `string` | Lightweight setup-only entry (optional) |
|
|
77
|
+
| `channel` | `object` | Channel catalog metadata for setup, picker, quickstart, and status surfaces |
|
|
78
|
+
| `providers` | `string[]` | Provider ids registered by this plugin |
|
|
79
|
+
| `install` | `object` | Install hints: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
|
|
80
|
+
| `startup` | `object` | Startup behavior flags |
|
|
81
|
+
|
|
82
|
+
### `Durar.channel`
|
|
83
|
+
|
|
84
|
+
`Durar.channel` is cheap package metadata for channel discovery and setup
|
|
85
|
+
surfaces before runtime loads.
|
|
86
|
+
|
|
87
|
+
| Field | Type | What it means |
|
|
88
|
+
| -------------------------------------- | ---------- | ----------------------------------------------------------------------------- |
|
|
89
|
+
| `id` | `string` | Canonical channel id. |
|
|
90
|
+
| `label` | `string` | Primary channel label. |
|
|
91
|
+
| `selectionLabel` | `string` | Picker/setup label when it should differ from `label`. |
|
|
92
|
+
| `detailLabel` | `string` | Secondary detail label for richer channel catalogs and status surfaces. |
|
|
93
|
+
| `docsPath` | `string` | Docs path for setup and selection links. |
|
|
94
|
+
| `docsLabel` | `string` | Override label used for docs links when it should differ from the channel id. |
|
|
95
|
+
| `blurb` | `string` | Short onboarding/catalog description. |
|
|
96
|
+
| `order` | `number` | Sort order in channel catalogs. |
|
|
97
|
+
| `aliases` | `string[]` | Extra lookup aliases for channel selection. |
|
|
98
|
+
| `preferOver` | `string[]` | Lower-priority plugin/channel ids this channel should outrank. |
|
|
99
|
+
| `systemImage` | `string` | Optional icon/system-image name for channel UI catalogs. |
|
|
100
|
+
| `selectionDocsPrefix` | `string` | Prefix text before docs links in selection surfaces. |
|
|
101
|
+
| `selectionDocsOmitLabel` | `boolean` | Show the docs path directly instead of a labeled docs link in selection copy. |
|
|
102
|
+
| `selectionExtras` | `string[]` | Extra short strings appended in selection copy. |
|
|
103
|
+
| `markdownCapable` | `boolean` | Marks the channel as markdown-capable for outbound formatting decisions. |
|
|
104
|
+
| `showConfigured` | `boolean` | Controls whether configured-channel listing surfaces show this channel. |
|
|
105
|
+
| `quickstartAllowFrom` | `boolean` | Opt this channel into the standard quickstart `allowFrom` setup flow. |
|
|
106
|
+
| `forceAccountBinding` | `boolean` | Require explicit account binding even when only one account exists. |
|
|
107
|
+
| `preferSessionLookupForAnnounceTarget` | `boolean` | Prefer session lookup when resolving announce targets for this channel. |
|
|
108
|
+
|
|
109
|
+
Example:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"Durar": {
|
|
114
|
+
"channel": {
|
|
115
|
+
"id": "my-channel",
|
|
116
|
+
"label": "My Channel",
|
|
117
|
+
"selectionLabel": "My Channel (self-hosted)",
|
|
118
|
+
"detailLabel": "My Channel Bot",
|
|
119
|
+
"docsPath": "/channels/my-channel",
|
|
120
|
+
"docsLabel": "my-channel",
|
|
121
|
+
"blurb": "Webhook-based self-hosted chat integration.",
|
|
122
|
+
"order": 80,
|
|
123
|
+
"aliases": ["mc"],
|
|
124
|
+
"preferOver": ["my-channel-legacy"],
|
|
125
|
+
"selectionDocsPrefix": "Guide:",
|
|
126
|
+
"selectionExtras": ["Markdown"],
|
|
127
|
+
"markdownCapable": true,
|
|
128
|
+
"quickstartAllowFrom": true
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `Durar.install`
|
|
135
|
+
|
|
136
|
+
`Durar.install` is package metadata, not manifest metadata.
|
|
137
|
+
|
|
138
|
+
| Field | Type | What it means |
|
|
139
|
+
| ---------------------------- | -------------------- | -------------------------------------------------------------------------------- |
|
|
140
|
+
| `npmSpec` | `string` | Canonical npm spec for install/update flows. |
|
|
141
|
+
| `localPath` | `string` | Local development or bundled install path. |
|
|
142
|
+
| `defaultChoice` | `"npm"` \| `"local"` | Preferred install source when both are available. |
|
|
143
|
+
| `minHostVersion` | `string` | Minimum supported Durar version in the form `>=x.y.z`. |
|
|
144
|
+
| `allowInvalidConfigRecovery` | `boolean` | Lets bundled-plugin reinstall flows recover from specific stale-config failures. |
|
|
145
|
+
|
|
146
|
+
If `minHostVersion` is set, install and manifest-registry loading both enforce
|
|
147
|
+
it. Older hosts skip the plugin; invalid version strings are rejected.
|
|
148
|
+
|
|
149
|
+
`allowInvalidConfigRecovery` is not a general bypass for broken configs. It is
|
|
150
|
+
for narrow bundled-plugin recovery only, so reinstall/setup can repair known
|
|
151
|
+
upgrade leftovers like a missing bundled plugin path or stale `channels.<id>`
|
|
152
|
+
entry for that same plugin. If config is broken for unrelated reasons, install
|
|
153
|
+
still fails closed and tells the operator to run `Durar doctor --fix`.
|
|
154
|
+
|
|
155
|
+
### Deferred full load
|
|
156
|
+
|
|
157
|
+
Channel plugins can opt into deferred loading with:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"Durar": {
|
|
162
|
+
"extensions": ["./index.ts"],
|
|
163
|
+
"setupEntry": "./setup-entry.ts",
|
|
164
|
+
"startup": {
|
|
165
|
+
"deferConfiguredChannelFullLoadUntilAfterListen": true
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
When enabled, Durar loads only `setupEntry` during the pre-listen startup
|
|
172
|
+
phase, even for already-configured channels. The full entry loads after the
|
|
173
|
+
gateway starts listening.
|
|
174
|
+
|
|
175
|
+
<Warning>
|
|
176
|
+
Only enable deferred loading when your `setupEntry` registers everything the
|
|
177
|
+
gateway needs before it starts listening (channel registration, HTTP routes,
|
|
178
|
+
gateway methods). If the full entry owns required startup capabilities, keep
|
|
179
|
+
the default behavior.
|
|
180
|
+
</Warning>
|
|
181
|
+
|
|
182
|
+
If your setup/full entry registers gateway RPC methods, keep them on a
|
|
183
|
+
plugin-specific prefix. Reserved core admin namespaces (`config.*`,
|
|
184
|
+
`exec.approvals.*`, `wizard.*`, `update.*`) stay core-owned and always resolve
|
|
185
|
+
to `operator.admin`.
|
|
186
|
+
|
|
187
|
+
## Plugin manifest
|
|
188
|
+
|
|
189
|
+
Every native plugin must ship an `Durar.plugin.json` in the package root.
|
|
190
|
+
Durar uses this to validate config without executing plugin code.
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{
|
|
194
|
+
"id": "my-plugin",
|
|
195
|
+
"name": "My Plugin",
|
|
196
|
+
"description": "Adds My Plugin capabilities to Durar",
|
|
197
|
+
"configSchema": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"additionalProperties": false,
|
|
200
|
+
"properties": {
|
|
201
|
+
"webhookSecret": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"description": "Webhook verification secret"
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
For channel plugins, add `kind` and `channels`:
|
|
211
|
+
|
|
212
|
+
```json
|
|
213
|
+
{
|
|
214
|
+
"id": "my-channel",
|
|
215
|
+
"kind": "channel",
|
|
216
|
+
"channels": ["my-channel"],
|
|
217
|
+
"configSchema": {
|
|
218
|
+
"type": "object",
|
|
219
|
+
"additionalProperties": false,
|
|
220
|
+
"properties": {}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Even plugins with no config must ship a schema. An empty schema is valid:
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
{
|
|
229
|
+
"id": "my-plugin",
|
|
230
|
+
"configSchema": {
|
|
231
|
+
"type": "object",
|
|
232
|
+
"additionalProperties": false
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
See [Plugin Manifest](/plugins/manifest) for the full schema reference.
|
|
238
|
+
|
|
239
|
+
## Durar Gateway publishing
|
|
240
|
+
|
|
241
|
+
For plugin packages, use the package-specific Durar Gateway command:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
Durar Gateway package publish your-org/your-plugin --dry-run
|
|
245
|
+
Durar Gateway package publish your-org/your-plugin
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
The legacy skill-only publish alias is for skills. Plugin packages should
|
|
249
|
+
always use `Durar Gateway package publish`.
|
|
250
|
+
|
|
251
|
+
## Setup entry
|
|
252
|
+
|
|
253
|
+
The `setup-entry.ts` file is a lightweight alternative to `index.ts` that
|
|
254
|
+
Durar loads when it only needs setup surfaces (onboarding, config repair,
|
|
255
|
+
disabled channel inspection).
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
// setup-entry.ts
|
|
259
|
+
import { defineSetupPluginEntry } from "Durar/plugin-sdk/channel-core";
|
|
260
|
+
import { myChannelPlugin } from "./src/channel.js";
|
|
261
|
+
|
|
262
|
+
export default defineSetupPluginEntry(myChannelPlugin);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
This avoids loading heavy runtime code (crypto libraries, CLI registrations,
|
|
266
|
+
background services) during setup flows.
|
|
267
|
+
|
|
268
|
+
**When Durar uses `setupEntry` instead of the full entry:**
|
|
269
|
+
|
|
270
|
+
- The channel is disabled but needs setup/onboarding surfaces
|
|
271
|
+
- The channel is enabled but unconfigured
|
|
272
|
+
- Deferred loading is enabled (`deferConfiguredChannelFullLoadUntilAfterListen`)
|
|
273
|
+
|
|
274
|
+
**What `setupEntry` must register:**
|
|
275
|
+
|
|
276
|
+
- The channel plugin object (via `defineSetupPluginEntry`)
|
|
277
|
+
- Any HTTP routes required before gateway listen
|
|
278
|
+
- Any gateway methods needed during startup
|
|
279
|
+
|
|
280
|
+
Those startup gateway methods should still avoid reserved core admin
|
|
281
|
+
namespaces such as `config.*` or `update.*`.
|
|
282
|
+
|
|
283
|
+
**What `setupEntry` should NOT include:**
|
|
284
|
+
|
|
285
|
+
- CLI registrations
|
|
286
|
+
- Background services
|
|
287
|
+
- Heavy runtime imports (crypto, SDKs)
|
|
288
|
+
- Gateway methods only needed after startup
|
|
289
|
+
|
|
290
|
+
### Narrow setup helper imports
|
|
291
|
+
|
|
292
|
+
For hot setup-only paths, prefer the narrow setup helper seams over the broader
|
|
293
|
+
`plugin-sdk/setup` umbrella when you only need part of the setup surface:
|
|
294
|
+
|
|
295
|
+
| Import path | Use it for | Key exports |
|
|
296
|
+
| ---------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
297
|
+
| `plugin-sdk/setup-runtime` | setup-time runtime helpers that stay available in `setupEntry` / deferred channel startup | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
|
298
|
+
| `plugin-sdk/setup-adapter-runtime` | environment-aware account setup adapters | `createEnvPatchedAccountSetupAdapter` |
|
|
299
|
+
| `plugin-sdk/setup-tools` | setup/install CLI/archive/docs helpers | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
|
300
|
+
|
|
301
|
+
Use the broader `plugin-sdk/setup` seam when you want the full shared setup
|
|
302
|
+
toolbox, including config-patch helpers such as
|
|
303
|
+
`moveSingleAccountChannelSectionToDefaultAccount(...)`.
|
|
304
|
+
|
|
305
|
+
The setup patch adapters stay hot-path safe on import. Their bundled
|
|
306
|
+
single-account promotion contract-surface lookup is lazy, so importing
|
|
307
|
+
`plugin-sdk/setup-runtime` does not eagerly load bundled contract-surface
|
|
308
|
+
discovery before the adapter is actually used.
|
|
309
|
+
|
|
310
|
+
### Channel-owned single-account promotion
|
|
311
|
+
|
|
312
|
+
When a channel upgrades from a single-account top-level config to
|
|
313
|
+
`channels.<id>.accounts.*`, the default shared behavior is to move promoted
|
|
314
|
+
account-scoped values into `accounts.default`.
|
|
315
|
+
|
|
316
|
+
Bundled channels can narrow or override that promotion through their setup
|
|
317
|
+
contract surface:
|
|
318
|
+
|
|
319
|
+
- `singleAccountKeysToMove`: extra top-level keys that should move into the
|
|
320
|
+
promoted account
|
|
321
|
+
- `namedAccountPromotionKeys`: when named accounts already exist, only these
|
|
322
|
+
keys move into the promoted account; shared policy/delivery keys stay at the
|
|
323
|
+
channel root
|
|
324
|
+
- `resolveSingleAccountPromotionTarget(...)`: choose which existing account
|
|
325
|
+
receives promoted values
|
|
326
|
+
|
|
327
|
+
Matrix is the current bundled example. If exactly one named Matrix account
|
|
328
|
+
already exists, or if `defaultAccount` points at an existing non-canonical key
|
|
329
|
+
such as `Ops`, promotion preserves that account instead of creating a new
|
|
330
|
+
`accounts.default` entry.
|
|
331
|
+
|
|
332
|
+
## Config schema
|
|
333
|
+
|
|
334
|
+
Plugin config is validated against the JSON Schema in your manifest. Users
|
|
335
|
+
configure plugins via:
|
|
336
|
+
|
|
337
|
+
```json5
|
|
338
|
+
{
|
|
339
|
+
plugins: {
|
|
340
|
+
entries: {
|
|
341
|
+
"my-plugin": {
|
|
342
|
+
config: {
|
|
343
|
+
webhookSecret: "abc123",
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Your plugin receives this config as `api.pluginConfig` during registration.
|
|
352
|
+
|
|
353
|
+
For channel-specific config, use the channel config section instead:
|
|
354
|
+
|
|
355
|
+
```json5
|
|
356
|
+
{
|
|
357
|
+
channels: {
|
|
358
|
+
"my-channel": {
|
|
359
|
+
token: "bot-token",
|
|
360
|
+
allowFrom: ["user1", "user2"],
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Building channel config schemas
|
|
367
|
+
|
|
368
|
+
Use `buildChannelConfigSchema` from `Durar/plugin-sdk/core` to convert a
|
|
369
|
+
Zod schema into the `ChannelConfigSchema` wrapper that Durar validates:
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
import { z } from "zod";
|
|
373
|
+
import { buildChannelConfigSchema } from "Durar/plugin-sdk/core";
|
|
374
|
+
|
|
375
|
+
const accountSchema = z.object({
|
|
376
|
+
token: z.string().optional(),
|
|
377
|
+
allowFrom: z.array(z.string()).optional(),
|
|
378
|
+
accounts: z.object({}).catchall(z.any()).optional(),
|
|
379
|
+
defaultAccount: z.string().optional(),
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
const configSchema = buildChannelConfigSchema(accountSchema);
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Setup wizards
|
|
386
|
+
|
|
387
|
+
Channel plugins can provide interactive setup wizards for `Durar onboard`.
|
|
388
|
+
The wizard is a `ChannelSetupWizard` object on the `ChannelPlugin`:
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
import type { ChannelSetupWizard } from "Durar/plugin-sdk/channel-setup";
|
|
392
|
+
|
|
393
|
+
const setupWizard: ChannelSetupWizard = {
|
|
394
|
+
channel: "my-channel",
|
|
395
|
+
status: {
|
|
396
|
+
configuredLabel: "Connected",
|
|
397
|
+
unconfiguredLabel: "Not configured",
|
|
398
|
+
resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token),
|
|
399
|
+
},
|
|
400
|
+
credentials: [
|
|
401
|
+
{
|
|
402
|
+
inputKey: "token",
|
|
403
|
+
providerHint: "my-channel",
|
|
404
|
+
credentialLabel: "Bot token",
|
|
405
|
+
preferredEnvVar: "MY_CHANNEL_BOT_TOKEN",
|
|
406
|
+
envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?",
|
|
407
|
+
keepPrompt: "Keep current token?",
|
|
408
|
+
inputPrompt: "Enter your bot token:",
|
|
409
|
+
inspect: ({ cfg, accountId }) => {
|
|
410
|
+
const token = (cfg.channels as any)?.["my-channel"]?.token;
|
|
411
|
+
return {
|
|
412
|
+
accountConfigured: Boolean(token),
|
|
413
|
+
hasConfiguredValue: Boolean(token),
|
|
414
|
+
};
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
};
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
The `ChannelSetupWizard` type supports `credentials`, `textInputs`,
|
|
422
|
+
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize`, and more.
|
|
423
|
+
See bundled plugin packages (for example the Discord plugin `src/channel.setup.ts`) for
|
|
424
|
+
full examples.
|
|
425
|
+
|
|
426
|
+
For DM allowlist prompts that only need the standard
|
|
427
|
+
`note -> prompt -> parse -> merge -> patch` flow, prefer the shared setup
|
|
428
|
+
helpers from `Durar/plugin-sdk/setup`: `createPromptParsedAllowFromForAccount(...)`,
|
|
429
|
+
`createTopLevelChannelParsedAllowFromPrompt(...)`, and
|
|
430
|
+
`createNestedChannelParsedAllowFromPrompt(...)`.
|
|
431
|
+
|
|
432
|
+
For channel setup status blocks that only vary by labels, scores, and optional
|
|
433
|
+
extra lines, prefer `createStandardChannelSetupStatus(...)` from
|
|
434
|
+
`Durar/plugin-sdk/setup` instead of hand-rolling the same `status` object in
|
|
435
|
+
each plugin.
|
|
436
|
+
|
|
437
|
+
For optional setup surfaces that should only appear in certain contexts, use
|
|
438
|
+
`createOptionalChannelSetupSurface` from `Durar/plugin-sdk/channel-setup`:
|
|
439
|
+
|
|
440
|
+
```typescript
|
|
441
|
+
import { createOptionalChannelSetupSurface } from "Durar/plugin-sdk/channel-setup";
|
|
442
|
+
|
|
443
|
+
const setupSurface = createOptionalChannelSetupSurface({
|
|
444
|
+
channel: "my-channel",
|
|
445
|
+
label: "My Channel",
|
|
446
|
+
npmSpec: "@myorg/Durar-my-channel",
|
|
447
|
+
docsPath: "/channels/my-channel",
|
|
448
|
+
});
|
|
449
|
+
// Returns { setupAdapter, setupWizard }
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
`plugin-sdk/channel-setup` also exposes the lower-level
|
|
453
|
+
`createOptionalChannelSetupAdapter(...)` and
|
|
454
|
+
`createOptionalChannelSetupWizard(...)` builders when you only need one half of
|
|
455
|
+
that optional-install surface.
|
|
456
|
+
|
|
457
|
+
The generated optional adapter/wizard fail closed on real config writes. They
|
|
458
|
+
reuse one install-required message across `validateInput`,
|
|
459
|
+
`applyAccountConfig`, and `finalize`, and append a docs link when `docsPath` is
|
|
460
|
+
set.
|
|
461
|
+
|
|
462
|
+
For binary-backed setup UIs, prefer the shared delegated helpers instead of
|
|
463
|
+
copying the same binary/status glue into every channel:
|
|
464
|
+
|
|
465
|
+
- `createDetectedBinaryStatus(...)` for status blocks that vary only by labels,
|
|
466
|
+
hints, scores, and binary detection
|
|
467
|
+
- `createCliPathTextInput(...)` for path-backed text inputs
|
|
468
|
+
- `createDelegatedSetupWizardStatusResolvers(...)`,
|
|
469
|
+
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)`, and
|
|
470
|
+
`createDelegatedResolveConfigured(...)` when `setupEntry` needs to forward to
|
|
471
|
+
a heavier full wizard lazily
|
|
472
|
+
- `createDelegatedTextInputShouldPrompt(...)` when `setupEntry` only needs to
|
|
473
|
+
delegate a `textInputs[*].shouldPrompt` decision
|
|
474
|
+
|
|
475
|
+
## Publishing and installing
|
|
476
|
+
|
|
477
|
+
**External plugins:** publish to [Durar Gateway](/tools/Durar Gateway) or npm, then install:
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
Durar plugins install @myorg/Durar-my-plugin
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
Durar tries Durar Gateway first and falls back to npm automatically. You can also
|
|
484
|
+
force Durar Gateway explicitly:
|
|
485
|
+
|
|
486
|
+
```bash
|
|
487
|
+
Durar plugins install Durar Gateway:@myorg/Durar-my-plugin # Durar Gateway only
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
There is no matching `npm:` override. Use the normal npm package spec when you
|
|
491
|
+
want the npm path after Durar Gateway fallback:
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
Durar plugins install @myorg/Durar-my-plugin
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**In-repo plugins:** place under the bundled plugin workspace tree and they are automatically
|
|
498
|
+
discovered during build.
|
|
499
|
+
|
|
500
|
+
**Users can install:**
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
Durar plugins install <package-name>
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
<Info>
|
|
507
|
+
For npm-sourced installs, `Durar plugins install` runs
|
|
508
|
+
`npm install --ignore-scripts` (no lifecycle scripts). Keep plugin dependency
|
|
509
|
+
trees pure JS/TS and avoid packages that require `postinstall` builds.
|
|
510
|
+
</Info>
|
|
511
|
+
|
|
512
|
+
## Related
|
|
513
|
+
|
|
514
|
+
- [SDK Entry Points](/plugins/sdk-entrypoints) -- `definePluginEntry` and `defineChannelPluginEntry`
|
|
515
|
+
- [Plugin Manifest](/plugins/manifest) -- full manifest schema reference
|
|
516
|
+
- [Building Plugins](/plugins/building-plugins) -- step-by-step getting started guide
|