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,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "OAuth in Durar: token exchange, storage, and multi-account patterns"
|
|
3
|
+
read_when:
|
|
4
|
+
- You want to understand Durar OAuth end-to-end
|
|
5
|
+
- You hit token invalidation / logout issues
|
|
6
|
+
- You want Claude CLI or OAuth auth flows
|
|
7
|
+
- You want multiple accounts or profile routing
|
|
8
|
+
title: "OAuth"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# OAuth
|
|
12
|
+
|
|
13
|
+
Durar supports “subscription auth” via OAuth for providers that offer it
|
|
14
|
+
(notably **OpenAI Codex (ChatGPT OAuth)**). For Anthropic subscriptions, new
|
|
15
|
+
setup should use the local **Claude CLI** login path on the gateway host, but
|
|
16
|
+
Anthropic distinguishes between direct Claude Code usage and Durar's reuse
|
|
17
|
+
path. Anthropic's public Claude Code docs say direct Claude Code use stays
|
|
18
|
+
inside Claude subscription limits. Separately, Anthropic notified Durar
|
|
19
|
+
users on **April 4, 2026 at 12:00 PM PT / 8:00 PM BST** that Durar counts as
|
|
20
|
+
a third-party harness and now requires **Extra Usage** for that traffic.
|
|
21
|
+
OpenAI Codex OAuth is explicitly supported for use in external tools like
|
|
22
|
+
Durar. This page explains:
|
|
23
|
+
|
|
24
|
+
For Anthropic in production, API key auth is the safer recommended path.
|
|
25
|
+
|
|
26
|
+
- how the OAuth **token exchange** works (PKCE)
|
|
27
|
+
- where tokens are **stored** (and why)
|
|
28
|
+
- how to handle **multiple accounts** (profiles + per-session overrides)
|
|
29
|
+
|
|
30
|
+
Durar also supports **provider plugins** that ship their own OAuth or API‑key
|
|
31
|
+
flows. Run them via:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
Durar models auth login --provider <id>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## The token sink (why it exists)
|
|
38
|
+
|
|
39
|
+
OAuth providers commonly mint a **new refresh token** during login/refresh flows. Some providers (or OAuth clients) can invalidate older refresh tokens when a new one is issued for the same user/app.
|
|
40
|
+
|
|
41
|
+
Practical symptom:
|
|
42
|
+
|
|
43
|
+
- you log in via Durar _and_ via Claude Code / Codex CLI → one of them randomly gets “logged out” later
|
|
44
|
+
|
|
45
|
+
To reduce that, Durar treats `auth-profiles.json` as a **token sink**:
|
|
46
|
+
|
|
47
|
+
- the runtime reads credentials from **one place**
|
|
48
|
+
- we can keep multiple profiles and route them deterministically
|
|
49
|
+
- when credentials are reused from an external CLI like Codex CLI, Durar
|
|
50
|
+
mirrors them with provenance and re-reads that external source instead of
|
|
51
|
+
rotating the refresh token itself
|
|
52
|
+
|
|
53
|
+
## Storage (where tokens live)
|
|
54
|
+
|
|
55
|
+
Secrets are stored **per-agent**:
|
|
56
|
+
|
|
57
|
+
- Auth profiles (OAuth + API keys + optional value-level refs): `~/.Durar/agents/<agentId>/agent/auth-profiles.json`
|
|
58
|
+
- Legacy compatibility file: `~/.Durar/agents/<agentId>/agent/auth.json`
|
|
59
|
+
(static `api_key` entries are scrubbed when discovered)
|
|
60
|
+
|
|
61
|
+
Legacy import-only file (still supported, but not the main store):
|
|
62
|
+
|
|
63
|
+
- `~/.Durar/credentials/oauth.json` (imported into `auth-profiles.json` on first use)
|
|
64
|
+
|
|
65
|
+
All of the above also respect `$Durar_STATE_DIR` (state dir override). Full reference: [/gateway/configuration](/gateway/configuration-reference#auth-storage)
|
|
66
|
+
|
|
67
|
+
For static secret refs and runtime snapshot activation behavior, see [Secrets Management](/gateway/secrets).
|
|
68
|
+
|
|
69
|
+
## Anthropic legacy token compatibility
|
|
70
|
+
|
|
71
|
+
<Warning>
|
|
72
|
+
Anthropic's public Claude Code docs say direct Claude Code use stays within
|
|
73
|
+
Claude subscription limits. Separately, Anthropic told Durar users on
|
|
74
|
+
**April 4, 2026 at 12:00 PM PT / 8:00 PM BST** that **Durar counts as a
|
|
75
|
+
third-party harness**. Existing Anthropic token profiles remain technically
|
|
76
|
+
usable in Durar, but Anthropic says the Durar path now requires **Extra
|
|
77
|
+
Usage** (pay-as-you-go billed separately from the subscription) for that
|
|
78
|
+
traffic.
|
|
79
|
+
|
|
80
|
+
For Anthropic's current direct-Claude-Code plan docs, see [Using Claude Code
|
|
81
|
+
with your Pro or Max
|
|
82
|
+
plan](https://support.claude.com/en/articles/11145838-using-claude-code-with-your-pro-or-max-plan)
|
|
83
|
+
and [Using Claude Code with your Team or Enterprise
|
|
84
|
+
plan](https://support.anthropic.com/en/articles/11845131-using-claude-code-with-your-team-or-enterprise-plan/).
|
|
85
|
+
|
|
86
|
+
If you want other subscription-style options in Durar, see [OpenAI
|
|
87
|
+
Codex](/providers/openai), [Qwen Cloud Coding
|
|
88
|
+
Plan](/providers/qwen), [MiniMax Coding Plan](/providers/minimax),
|
|
89
|
+
and [Z.AI / GLM Coding Plan](/providers/glm).
|
|
90
|
+
</Warning>
|
|
91
|
+
|
|
92
|
+
Durar now exposes Anthropic setup-token again as a legacy/manual path.
|
|
93
|
+
Anthropic's Durar-specific billing notice still applies to that path, so
|
|
94
|
+
use it with the expectation that Anthropic requires **Extra Usage** for
|
|
95
|
+
Durar-driven Claude-login traffic.
|
|
96
|
+
|
|
97
|
+
## Anthropic Claude CLI migration
|
|
98
|
+
|
|
99
|
+
If Claude CLI is already installed and signed in on the gateway host, you can
|
|
100
|
+
switch Anthropic model selection over to the local CLI backend. This is a
|
|
101
|
+
supported Durar path when you want to reuse a local Claude CLI login on the
|
|
102
|
+
same host.
|
|
103
|
+
|
|
104
|
+
Prerequisites:
|
|
105
|
+
|
|
106
|
+
- the `claude` binary is installed on the gateway host
|
|
107
|
+
- Claude CLI is already authenticated there via `claude auth login`
|
|
108
|
+
|
|
109
|
+
Migration command:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
Durar models auth login --provider anthropic --method cli --set-default
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Onboarding shortcut:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
Durar onboard --auth-choice anthropic-cli
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
This keeps existing Anthropic auth profiles for rollback, but rewrites the main
|
|
122
|
+
default-model path from `anthropic/...` to `claude-cli/...`, rewrites matching
|
|
123
|
+
Anthropic Claude fallbacks, and adds matching `claude-cli/...` allowlist
|
|
124
|
+
entries under `agents.defaults.models`.
|
|
125
|
+
|
|
126
|
+
Verify:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
Durar models status
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## OAuth exchange (how login works)
|
|
133
|
+
|
|
134
|
+
Durar’s interactive login flows are implemented in `@mariozechner/pi-ai` and wired into the wizards/commands.
|
|
135
|
+
|
|
136
|
+
### Anthropic Claude CLI
|
|
137
|
+
|
|
138
|
+
Flow shape:
|
|
139
|
+
|
|
140
|
+
Claude CLI path:
|
|
141
|
+
|
|
142
|
+
1. sign in with `claude auth login` on the gateway host
|
|
143
|
+
2. run `Durar models auth login --provider anthropic --method cli --set-default`
|
|
144
|
+
3. store no new auth profile; switch model selection to `claude-cli/...`
|
|
145
|
+
4. keep existing Anthropic auth profiles for rollback
|
|
146
|
+
|
|
147
|
+
Anthropic's public Claude Code docs describe this direct Claude subscription
|
|
148
|
+
login flow for `claude` itself. Durar can reuse that local login, but
|
|
149
|
+
Anthropic separately classifies the Durar-controlled path as third-party
|
|
150
|
+
harness usage for billing purposes.
|
|
151
|
+
|
|
152
|
+
Interactive assistant path:
|
|
153
|
+
|
|
154
|
+
- `Durar onboard` / `Durar configure` → auth choice `anthropic-cli`
|
|
155
|
+
|
|
156
|
+
### OpenAI Codex (ChatGPT OAuth)
|
|
157
|
+
|
|
158
|
+
OpenAI Codex OAuth is explicitly supported for use outside the Codex CLI, including Durar workflows.
|
|
159
|
+
|
|
160
|
+
Flow shape (PKCE):
|
|
161
|
+
|
|
162
|
+
1. generate PKCE verifier/challenge + random `state`
|
|
163
|
+
2. open `https://auth.openai.com/oauth/authorize?...`
|
|
164
|
+
3. try to capture callback on `http://127.0.0.1:1455/auth/callback`
|
|
165
|
+
4. if callback can’t bind (or you’re remote/headless), paste the redirect URL/code
|
|
166
|
+
5. exchange at `https://auth.openai.com/oauth/token`
|
|
167
|
+
6. extract `accountId` from the access token and store `{ access, refresh, expires, accountId }`
|
|
168
|
+
|
|
169
|
+
Wizard path is `Durar onboard` → auth choice `openai-codex`.
|
|
170
|
+
|
|
171
|
+
## Refresh + expiry
|
|
172
|
+
|
|
173
|
+
Profiles store an `expires` timestamp.
|
|
174
|
+
|
|
175
|
+
At runtime:
|
|
176
|
+
|
|
177
|
+
- if `expires` is in the future → use the stored access token
|
|
178
|
+
- if expired → refresh (under a file lock) and overwrite the stored credentials
|
|
179
|
+
- exception: reused external CLI credentials stay externally managed; Durar
|
|
180
|
+
re-reads the CLI auth store and never spends the copied refresh token itself
|
|
181
|
+
|
|
182
|
+
The refresh flow is automatic; you generally don't need to manage tokens manually.
|
|
183
|
+
|
|
184
|
+
## Multiple accounts (profiles) + routing
|
|
185
|
+
|
|
186
|
+
Two patterns:
|
|
187
|
+
|
|
188
|
+
### 1) Preferred: separate agents
|
|
189
|
+
|
|
190
|
+
If you want “personal” and “work” to never interact, use isolated agents (separate sessions + credentials + workspace):
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
Durar agents add work
|
|
194
|
+
Durar agents add personal
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Then configure auth per-agent (wizard) and route chats to the right agent.
|
|
198
|
+
|
|
199
|
+
### 2) Advanced: multiple profiles in one agent
|
|
200
|
+
|
|
201
|
+
`auth-profiles.json` supports multiple profile IDs for the same provider.
|
|
202
|
+
|
|
203
|
+
Pick which profile is used:
|
|
204
|
+
|
|
205
|
+
- globally via config ordering (`auth.order`)
|
|
206
|
+
- per-session via `/model ...@<profileId>`
|
|
207
|
+
|
|
208
|
+
Example (session override):
|
|
209
|
+
|
|
210
|
+
- `/model Opus@anthropic:work`
|
|
211
|
+
|
|
212
|
+
How to see what profile IDs exist:
|
|
213
|
+
|
|
214
|
+
- `Durar channels list --json` (shows `auth[]`)
|
|
215
|
+
|
|
216
|
+
Related docs:
|
|
217
|
+
|
|
218
|
+
- [/concepts/model-failover](/concepts/model-failover) (rotation + cooldown rules)
|
|
219
|
+
- [/tools/slash-commands](/tools/slash-commands) (command surface)
|
|
220
|
+
|
|
221
|
+
## Related
|
|
222
|
+
|
|
223
|
+
- [Authentication](/gateway/authentication) — model provider auth overview
|
|
224
|
+
- [Secrets](/gateway/secrets) — credential storage and SecretRef
|
|
225
|
+
- [Configuration Reference](/gateway/configuration-reference#auth-storage) — auth config keys
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "How Durar presence entries are produced, merged, and displayed"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging the Instances tab
|
|
5
|
+
- Investigating duplicate or stale instance rows
|
|
6
|
+
- Changing gateway WS connect or system-event beacons
|
|
7
|
+
title: "Presence"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Presence
|
|
11
|
+
|
|
12
|
+
Durar “presence” is a lightweight, best‑effort view of:
|
|
13
|
+
|
|
14
|
+
- the **Gateway** itself, and
|
|
15
|
+
- **clients connected to the Gateway** (mac app, WebChat, CLI, etc.)
|
|
16
|
+
|
|
17
|
+
Presence is used primarily to render the macOS app’s **Instances** tab and to
|
|
18
|
+
provide quick operator visibility.
|
|
19
|
+
|
|
20
|
+
## Presence fields (what shows up)
|
|
21
|
+
|
|
22
|
+
Presence entries are structured objects with fields like:
|
|
23
|
+
|
|
24
|
+
- `instanceId` (optional but strongly recommended): stable client identity (usually `connect.client.instanceId`)
|
|
25
|
+
- `host`: human‑friendly host name
|
|
26
|
+
- `ip`: best‑effort IP address
|
|
27
|
+
- `version`: client version string
|
|
28
|
+
- `deviceFamily` / `modelIdentifier`: hardware hints
|
|
29
|
+
- `mode`: `ui`, `webchat`, `cli`, `backend`, `probe`, `test`, `node`, ...
|
|
30
|
+
- `lastInputSeconds`: “seconds since last user input” (if known)
|
|
31
|
+
- `reason`: `self`, `connect`, `node-connected`, `periodic`, ...
|
|
32
|
+
- `ts`: last update timestamp (ms since epoch)
|
|
33
|
+
|
|
34
|
+
## Producers (where presence comes from)
|
|
35
|
+
|
|
36
|
+
Presence entries are produced by multiple sources and **merged**.
|
|
37
|
+
|
|
38
|
+
### 1) Gateway self entry
|
|
39
|
+
|
|
40
|
+
The Gateway always seeds a “self” entry at startup so UIs show the gateway host
|
|
41
|
+
even before any clients connect.
|
|
42
|
+
|
|
43
|
+
### 2) WebSocket connect
|
|
44
|
+
|
|
45
|
+
Every WS client begins with a `connect` request. On successful handshake the
|
|
46
|
+
Gateway upserts a presence entry for that connection.
|
|
47
|
+
|
|
48
|
+
#### Why one-off CLI commands do not show up
|
|
49
|
+
|
|
50
|
+
The CLI often connects for short, one‑off commands. To avoid spamming the
|
|
51
|
+
Instances list, `client.mode === "cli"` is **not** turned into a presence entry.
|
|
52
|
+
|
|
53
|
+
### 3) `system-event` beacons
|
|
54
|
+
|
|
55
|
+
Clients can send richer periodic beacons via the `system-event` method. The mac
|
|
56
|
+
app uses this to report host name, IP, and `lastInputSeconds`.
|
|
57
|
+
|
|
58
|
+
### 4) Node connects (role: node)
|
|
59
|
+
|
|
60
|
+
When a node connects over the Gateway WebSocket with `role: node`, the Gateway
|
|
61
|
+
upserts a presence entry for that node (same flow as other WS clients).
|
|
62
|
+
|
|
63
|
+
## Merge + dedupe rules (why `instanceId` matters)
|
|
64
|
+
|
|
65
|
+
Presence entries are stored in a single in‑memory map:
|
|
66
|
+
|
|
67
|
+
- Entries are keyed by a **presence key**.
|
|
68
|
+
- The best key is a stable `instanceId` (from `connect.client.instanceId`) that survives restarts.
|
|
69
|
+
- Keys are case‑insensitive.
|
|
70
|
+
|
|
71
|
+
If a client reconnects without a stable `instanceId`, it may show up as a
|
|
72
|
+
**duplicate** row.
|
|
73
|
+
|
|
74
|
+
## TTL and bounded size
|
|
75
|
+
|
|
76
|
+
Presence is intentionally ephemeral:
|
|
77
|
+
|
|
78
|
+
- **TTL:** entries older than 5 minutes are pruned
|
|
79
|
+
- **Max entries:** 200 (oldest dropped first)
|
|
80
|
+
|
|
81
|
+
This keeps the list fresh and avoids unbounded memory growth.
|
|
82
|
+
|
|
83
|
+
## Remote/tunnel caveat (loopback IPs)
|
|
84
|
+
|
|
85
|
+
When a client connects over an SSH tunnel / local port forward, the Gateway may
|
|
86
|
+
see the remote address as `127.0.0.1`. To avoid overwriting a good client‑reported
|
|
87
|
+
IP, loopback remote addresses are ignored.
|
|
88
|
+
|
|
89
|
+
## Consumers
|
|
90
|
+
|
|
91
|
+
### macOS Instances tab
|
|
92
|
+
|
|
93
|
+
The macOS app renders the output of `system-presence` and applies a small status
|
|
94
|
+
indicator (Active/Idle/Stale) based on the age of the last update.
|
|
95
|
+
|
|
96
|
+
## Debugging tips
|
|
97
|
+
|
|
98
|
+
- To see the raw list, call `system-presence` against the Gateway.
|
|
99
|
+
- If you see duplicates:
|
|
100
|
+
- confirm clients send a stable `client.instanceId` in the handshake
|
|
101
|
+
- confirm periodic beacons use the same `instanceId`
|
|
102
|
+
- check whether the connection‑derived entry is missing `instanceId` (duplicates are expected)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Command queue design that serializes inbound auto-reply runs"
|
|
3
|
+
read_when:
|
|
4
|
+
- Changing auto-reply execution or concurrency
|
|
5
|
+
title: "Command Queue"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Command Queue (2026-01-16)
|
|
9
|
+
|
|
10
|
+
We serialize inbound auto-reply runs (all channels) through a tiny in-process queue to prevent multiple agent runs from colliding, while still allowing safe parallelism across sessions.
|
|
11
|
+
|
|
12
|
+
## Why
|
|
13
|
+
|
|
14
|
+
- Auto-reply runs can be expensive (LLM calls) and can collide when multiple inbound messages arrive close together.
|
|
15
|
+
- Serializing avoids competing for shared resources (session files, logs, CLI stdin) and reduces the chance of upstream rate limits.
|
|
16
|
+
|
|
17
|
+
## How it works
|
|
18
|
+
|
|
19
|
+
- A lane-aware FIFO queue drains each lane with a configurable concurrency cap (default 1 for unconfigured lanes; main defaults to 4, subagent to 8).
|
|
20
|
+
- `runEmbeddedPiAgent` enqueues by **session key** (lane `session:<key>`) to guarantee only one active run per session.
|
|
21
|
+
- Each session run is then queued into a **global lane** (`main` by default) so overall parallelism is capped by `agents.defaults.maxConcurrent`.
|
|
22
|
+
- When verbose logging is enabled, queued runs emit a short notice if they waited more than ~2s before starting.
|
|
23
|
+
- Typing indicators still fire immediately on enqueue (when supported by the channel) so user experience is unchanged while we wait our turn.
|
|
24
|
+
|
|
25
|
+
## Queue modes (per channel)
|
|
26
|
+
|
|
27
|
+
Inbound messages can steer the current run, wait for a followup turn, or do both:
|
|
28
|
+
|
|
29
|
+
- `steer`: inject immediately into the current run (cancels pending tool calls after the next tool boundary). If not streaming, falls back to followup.
|
|
30
|
+
- `followup`: enqueue for the next agent turn after the current run ends.
|
|
31
|
+
- `collect`: coalesce all queued messages into a **single** followup turn (default). If messages target different channels/threads, they drain individually to preserve routing.
|
|
32
|
+
- `steer-backlog` (aka `steer+backlog`): steer now **and** preserve the message for a followup turn.
|
|
33
|
+
- `interrupt` (legacy): abort the active run for that session, then run the newest message.
|
|
34
|
+
- `queue` (legacy alias): same as `steer`.
|
|
35
|
+
|
|
36
|
+
Steer-backlog means you can get a followup response after the steered run, so
|
|
37
|
+
streaming surfaces can look like duplicates. Prefer `collect`/`steer` if you want
|
|
38
|
+
one response per inbound message.
|
|
39
|
+
Send `/queue collect` as a standalone command (per-session) or set `messages.queue.byChannel.discord: "collect"`.
|
|
40
|
+
|
|
41
|
+
Defaults (when unset in config):
|
|
42
|
+
|
|
43
|
+
- All surfaces → `collect`
|
|
44
|
+
|
|
45
|
+
Configure globally or per channel via `messages.queue`:
|
|
46
|
+
|
|
47
|
+
```json5
|
|
48
|
+
{
|
|
49
|
+
messages: {
|
|
50
|
+
queue: {
|
|
51
|
+
mode: "collect",
|
|
52
|
+
debounceMs: 1000,
|
|
53
|
+
cap: 20,
|
|
54
|
+
drop: "summarize",
|
|
55
|
+
byChannel: { discord: "collect" },
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Queue options
|
|
62
|
+
|
|
63
|
+
Options apply to `followup`, `collect`, and `steer-backlog` (and to `steer` when it falls back to followup):
|
|
64
|
+
|
|
65
|
+
- `debounceMs`: wait for quiet before starting a followup turn (prevents “continue, continue”).
|
|
66
|
+
- `cap`: max queued messages per session.
|
|
67
|
+
- `drop`: overflow policy (`old`, `new`, `summarize`).
|
|
68
|
+
|
|
69
|
+
Summarize keeps a short bullet list of dropped messages and injects it as a synthetic followup prompt.
|
|
70
|
+
Defaults: `debounceMs: 1000`, `cap: 20`, `drop: summarize`.
|
|
71
|
+
|
|
72
|
+
## Per-session overrides
|
|
73
|
+
|
|
74
|
+
- Send `/queue <mode>` as a standalone command to store the mode for the current session.
|
|
75
|
+
- Options can be combined: `/queue collect debounce:2s cap:25 drop:summarize`
|
|
76
|
+
- `/queue default` or `/queue reset` clears the session override.
|
|
77
|
+
|
|
78
|
+
## Scope and guarantees
|
|
79
|
+
|
|
80
|
+
- Applies to auto-reply agent runs across all inbound channels that use the gateway reply pipeline (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, etc.).
|
|
81
|
+
- Default lane (`main`) is process-wide for inbound + main heartbeats; set `agents.defaults.maxConcurrent` to allow multiple sessions in parallel.
|
|
82
|
+
- Additional lanes may exist (e.g. `cron`, `subagent`) so background jobs can run in parallel without blocking inbound replies. These detached runs are tracked as [background tasks](/automation/tasks).
|
|
83
|
+
- Per-session lanes guarantee that only one agent run touches a given session at a time.
|
|
84
|
+
- No external dependencies or background worker threads; pure TypeScript + promises.
|
|
85
|
+
|
|
86
|
+
## Troubleshooting
|
|
87
|
+
|
|
88
|
+
- If commands seem stuck, enable verbose logs and look for “queued for …ms” lines to confirm the queue is draining.
|
|
89
|
+
- If you need queue depth, enable verbose logs and watch for queue timing lines.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Retry policy for outbound provider calls"
|
|
3
|
+
read_when:
|
|
4
|
+
- Updating provider retry behavior or defaults
|
|
5
|
+
- Debugging provider send errors or rate limits
|
|
6
|
+
title: "Retry Policy"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Retry policy
|
|
10
|
+
|
|
11
|
+
## Goals
|
|
12
|
+
|
|
13
|
+
- Retry per HTTP request, not per multi-step flow.
|
|
14
|
+
- Preserve ordering by retrying only the current step.
|
|
15
|
+
- Avoid duplicating non-idempotent operations.
|
|
16
|
+
|
|
17
|
+
## Defaults
|
|
18
|
+
|
|
19
|
+
- Attempts: 3
|
|
20
|
+
- Max delay cap: 30000 ms
|
|
21
|
+
- Jitter: 0.1 (10 percent)
|
|
22
|
+
- Provider defaults:
|
|
23
|
+
- Telegram min delay: 400 ms
|
|
24
|
+
- Discord min delay: 500 ms
|
|
25
|
+
|
|
26
|
+
## Behavior
|
|
27
|
+
|
|
28
|
+
### Discord
|
|
29
|
+
|
|
30
|
+
- Retries only on rate-limit errors (HTTP 429).
|
|
31
|
+
- Uses Discord `retry_after` when available, otherwise exponential backoff.
|
|
32
|
+
|
|
33
|
+
### Telegram
|
|
34
|
+
|
|
35
|
+
- Retries on transient errors (429, timeout, connect/reset/closed, temporarily unavailable).
|
|
36
|
+
- Uses `retry_after` when available, otherwise exponential backoff.
|
|
37
|
+
- Markdown parse errors are not retried; they fall back to plain text.
|
|
38
|
+
|
|
39
|
+
## Configuration
|
|
40
|
+
|
|
41
|
+
Set retry policy per provider in `~/.Durar/Durar.json`:
|
|
42
|
+
|
|
43
|
+
```json5
|
|
44
|
+
{
|
|
45
|
+
channels: {
|
|
46
|
+
telegram: {
|
|
47
|
+
retry: {
|
|
48
|
+
attempts: 3,
|
|
49
|
+
minDelayMs: 400,
|
|
50
|
+
maxDelayMs: 30000,
|
|
51
|
+
jitter: 0.1,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
discord: {
|
|
55
|
+
retry: {
|
|
56
|
+
attempts: 3,
|
|
57
|
+
minDelayMs: 500,
|
|
58
|
+
maxDelayMs: 30000,
|
|
59
|
+
jitter: 0.1,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Notes
|
|
67
|
+
|
|
68
|
+
- Retries apply per request (message send, media upload, reaction, poll, sticker).
|
|
69
|
+
- Composite flows do not retry completed steps.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Session Pruning"
|
|
3
|
+
summary: "Trimming old tool results to keep context lean and caching efficient"
|
|
4
|
+
read_when:
|
|
5
|
+
- You want to reduce context growth from tool outputs
|
|
6
|
+
- You want to understand Anthropic prompt cache optimization
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Session Pruning
|
|
10
|
+
|
|
11
|
+
Session pruning trims **old tool results** from the context before each LLM
|
|
12
|
+
call. It reduces context bloat from accumulated tool outputs (exec results, file
|
|
13
|
+
reads, search results) without rewriting normal conversation text.
|
|
14
|
+
|
|
15
|
+
<Info>
|
|
16
|
+
Pruning is in-memory only -- it does not modify the on-disk session transcript.
|
|
17
|
+
Your full history is always preserved.
|
|
18
|
+
</Info>
|
|
19
|
+
|
|
20
|
+
## Why it matters
|
|
21
|
+
|
|
22
|
+
Long sessions accumulate tool output that inflates the context window. This
|
|
23
|
+
increases cost and can force [compaction](/concepts/compaction) sooner than
|
|
24
|
+
necessary.
|
|
25
|
+
|
|
26
|
+
Pruning is especially valuable for **Anthropic prompt caching**. After the cache
|
|
27
|
+
TTL expires, the next request re-caches the full prompt. Pruning reduces the
|
|
28
|
+
cache-write size, directly lowering cost.
|
|
29
|
+
|
|
30
|
+
## How it works
|
|
31
|
+
|
|
32
|
+
1. Wait for the cache TTL to expire (default 5 minutes).
|
|
33
|
+
2. Find old tool results for normal pruning (conversation text is left alone).
|
|
34
|
+
3. **Soft-trim** oversized results -- keep the head and tail, insert `...`.
|
|
35
|
+
4. **Hard-clear** the rest -- replace with a placeholder.
|
|
36
|
+
5. Reset the TTL so follow-up requests reuse the fresh cache.
|
|
37
|
+
|
|
38
|
+
## Legacy image cleanup
|
|
39
|
+
|
|
40
|
+
Durar also runs a separate idempotent cleanup for older legacy sessions that
|
|
41
|
+
persisted raw image blocks in history.
|
|
42
|
+
|
|
43
|
+
- It preserves the **3 most recent completed turns** byte-for-byte so prompt
|
|
44
|
+
cache prefixes for recent follow-ups stay stable.
|
|
45
|
+
- Older already-processed image blocks in `user` or `toolResult` history can be
|
|
46
|
+
replaced with `[image data removed - already processed by model]`.
|
|
47
|
+
- This is separate from normal cache-TTL pruning. It exists to stop repeated
|
|
48
|
+
image payloads from busting prompt caches on later turns.
|
|
49
|
+
|
|
50
|
+
## Smart defaults
|
|
51
|
+
|
|
52
|
+
Durar auto-enables pruning for Anthropic profiles:
|
|
53
|
+
|
|
54
|
+
| Profile type | Pruning enabled | Heartbeat |
|
|
55
|
+
| ------------------------------------------------------- | --------------- | --------- |
|
|
56
|
+
| Anthropic OAuth/token auth (including Claude CLI reuse) | Yes | 1 hour |
|
|
57
|
+
| API key | Yes | 30 min |
|
|
58
|
+
|
|
59
|
+
If you set explicit values, Durar does not override them.
|
|
60
|
+
|
|
61
|
+
## Enable or disable
|
|
62
|
+
|
|
63
|
+
Pruning is off by default for non-Anthropic providers. To enable:
|
|
64
|
+
|
|
65
|
+
```json5
|
|
66
|
+
{
|
|
67
|
+
agents: {
|
|
68
|
+
defaults: {
|
|
69
|
+
contextPruning: { mode: "cache-ttl", ttl: "5m" },
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
To disable: set `mode: "off"`.
|
|
76
|
+
|
|
77
|
+
## Pruning vs compaction
|
|
78
|
+
|
|
79
|
+
| | Pruning | Compaction |
|
|
80
|
+
| ---------- | ------------------ | ----------------------- |
|
|
81
|
+
| **What** | Trims tool results | Summarizes conversation |
|
|
82
|
+
| **Saved?** | No (per-request) | Yes (in transcript) |
|
|
83
|
+
| **Scope** | Tool results only | Entire conversation |
|
|
84
|
+
|
|
85
|
+
They complement each other -- pruning keeps tool output lean between
|
|
86
|
+
compaction cycles.
|
|
87
|
+
|
|
88
|
+
## Further reading
|
|
89
|
+
|
|
90
|
+
- [Compaction](/concepts/compaction) -- summarization-based context reduction
|
|
91
|
+
- [Gateway Configuration](/gateway/configuration) -- all pruning config knobs
|
|
92
|
+
(`contextPruning.*`)
|