nodmix 2026.5.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11573 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/docs/.i18n/README.md +81 -0
- package/docs/.i18n/ar-navigation.json +18 -0
- package/docs/.i18n/de-navigation.json +18 -0
- package/docs/.i18n/es-navigation.json +18 -0
- package/docs/.i18n/fr-navigation.json +18 -0
- package/docs/.i18n/glossary.ar.json +78 -0
- package/docs/.i18n/glossary.de.json +78 -0
- package/docs/.i18n/glossary.es.json +78 -0
- package/docs/.i18n/glossary.fa.json +78 -0
- package/docs/.i18n/glossary.fr.json +78 -0
- package/docs/.i18n/glossary.id.json +78 -0
- package/docs/.i18n/glossary.it.json +78 -0
- package/docs/.i18n/glossary.ja-JP.json +98 -0
- package/docs/.i18n/glossary.ko.json +78 -0
- package/docs/.i18n/glossary.nl.json +78 -0
- package/docs/.i18n/glossary.pl.json +78 -0
- package/docs/.i18n/glossary.pt-BR.json +78 -0
- package/docs/.i18n/glossary.th.json +78 -0
- package/docs/.i18n/glossary.tr.json +78 -0
- package/docs/.i18n/glossary.uk.json +78 -0
- package/docs/.i18n/glossary.vi.json +78 -0
- package/docs/.i18n/glossary.zh-CN.json +1002 -0
- package/docs/.i18n/glossary.zh-TW.json +78 -0
- package/docs/.i18n/id-navigation.json +18 -0
- package/docs/.i18n/it-navigation.json +18 -0
- package/docs/.i18n/ja-navigation.json +18 -0
- package/docs/.i18n/ko-navigation.json +18 -0
- package/docs/.i18n/pl-navigation.json +18 -0
- package/docs/.i18n/pt-BR-navigation.json +18 -0
- package/docs/.i18n/tr-navigation.json +18 -0
- package/docs/.i18n/translation-workflow.md +111 -0
- package/docs/.i18n/zh-Hans-navigation.json +542 -0
- package/docs/AGENTS.md +36 -0
- package/docs/announcements/bluebubbles-imessage.md +79 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.svg +418 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/openclaw-logo-text.svg +418 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/pr/quick-settings-browser-tools.png +0 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith-light.svg +14 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex-light.svg +16 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/github-light.svg +3 -0
- package/docs/assets/sponsors/github.svg +3 -0
- package/docs/assets/sponsors/nvidia-dark.svg +9 -0
- package/docs/assets/sponsors/nvidia.svg +9 -0
- package/docs/assets/sponsors/openai-light.svg +3 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel-light.svg +5 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +124 -0
- package/docs/automation/auth-monitoring.md +11 -0
- package/docs/automation/clawflow.md +12 -0
- package/docs/automation/cron-jobs.md +500 -0
- package/docs/automation/cron-vs-heartbeat.md +11 -0
- package/docs/automation/gmail-pubsub.md +11 -0
- package/docs/automation/hooks.md +365 -0
- package/docs/automation/index.md +135 -0
- package/docs/automation/poll.md +12 -0
- package/docs/automation/standing-orders.md +250 -0
- package/docs/automation/taskflow.md +155 -0
- package/docs/automation/tasks.md +374 -0
- package/docs/automation/troubleshooting.md +12 -0
- package/docs/automation/webhook.md +12 -0
- package/docs/brave-search.md +11 -0
- package/docs/channels/access-groups.md +201 -0
- package/docs/channels/ambient-room-events.md +214 -0
- package/docs/channels/bot-loop-protection.md +131 -0
- package/docs/channels/broadcast-groups.md +472 -0
- package/docs/channels/channel-routing.md +162 -0
- package/docs/channels/clickclack.md +138 -0
- package/docs/channels/discord.md +1762 -0
- package/docs/channels/feishu.md +502 -0
- package/docs/channels/googlechat.md +284 -0
- package/docs/channels/group-messages.md +95 -0
- package/docs/channels/groups.md +519 -0
- package/docs/channels/imessage-from-bluebubbles.md +259 -0
- package/docs/channels/imessage.md +813 -0
- package/docs/channels/index.md +64 -0
- package/docs/channels/irc.md +253 -0
- package/docs/channels/line.md +243 -0
- package/docs/channels/location.md +71 -0
- package/docs/channels/matrix-migration.md +370 -0
- package/docs/channels/matrix-presentation.md +77 -0
- package/docs/channels/matrix-push-rules.md +150 -0
- package/docs/channels/matrix.md +921 -0
- package/docs/channels/mattermost.md +542 -0
- package/docs/channels/msteams.md +1042 -0
- package/docs/channels/nextcloud-talk.md +176 -0
- package/docs/channels/nostr.md +253 -0
- package/docs/channels/pairing.md +214 -0
- package/docs/channels/qqbot.md +309 -0
- package/docs/channels/signal.md +400 -0
- package/docs/channels/slack.md +1564 -0
- package/docs/channels/synology-chat.md +187 -0
- package/docs/channels/telegram.md +1107 -0
- package/docs/channels/tlon.md +296 -0
- package/docs/channels/troubleshooting.md +161 -0
- package/docs/channels/twitch.md +431 -0
- package/docs/channels/wechat.md +171 -0
- package/docs/channels/whatsapp.md +739 -0
- package/docs/channels/yuanbao.md +416 -0
- package/docs/channels/zalo.md +253 -0
- package/docs/channels/zalouser.md +199 -0
- package/docs/ci.md +612 -0
- package/docs/clawhub/publishing.md +96 -0
- package/docs/cli/acp.md +370 -0
- package/docs/cli/agent.md +103 -0
- package/docs/cli/agents.md +232 -0
- package/docs/cli/approvals.md +190 -0
- package/docs/cli/backup.md +97 -0
- package/docs/cli/browser.md +307 -0
- package/docs/cli/channels.md +154 -0
- package/docs/cli/clawbot.md +25 -0
- package/docs/cli/commitments.md +90 -0
- package/docs/cli/completion.md +39 -0
- package/docs/cli/config.md +504 -0
- package/docs/cli/configure.md +77 -0
- package/docs/cli/crestodian.md +332 -0
- package/docs/cli/cron.md +281 -0
- package/docs/cli/daemon.md +67 -0
- package/docs/cli/dashboard.md +33 -0
- package/docs/cli/devices.md +204 -0
- package/docs/cli/directory.md +68 -0
- package/docs/cli/dns.md +53 -0
- package/docs/cli/docs.md +73 -0
- package/docs/cli/doctor.md +237 -0
- package/docs/cli/flows.md +52 -0
- package/docs/cli/gateway.md +567 -0
- package/docs/cli/health.md +43 -0
- package/docs/cli/hooks.md +345 -0
- package/docs/cli/index.md +396 -0
- package/docs/cli/infer.md +364 -0
- package/docs/cli/logs.md +65 -0
- package/docs/cli/mcp.md +529 -0
- package/docs/cli/memory.md +183 -0
- package/docs/cli/message.md +317 -0
- package/docs/cli/migrate.md +290 -0
- package/docs/cli/models.md +224 -0
- package/docs/cli/node.md +177 -0
- package/docs/cli/nodes.md +76 -0
- package/docs/cli/onboard.md +245 -0
- package/docs/cli/pairing.md +77 -0
- package/docs/cli/path.md +502 -0
- package/docs/cli/plugins.md +454 -0
- package/docs/cli/policy.md +418 -0
- package/docs/cli/proxy.md +89 -0
- package/docs/cli/qr.md +56 -0
- package/docs/cli/reset.md +39 -0
- package/docs/cli/sandbox.md +208 -0
- package/docs/cli/secrets.md +202 -0
- package/docs/cli/security.md +124 -0
- package/docs/cli/sessions.md +164 -0
- package/docs/cli/setup.md +59 -0
- package/docs/cli/skills.md +102 -0
- package/docs/cli/status.md +45 -0
- package/docs/cli/system.md +89 -0
- package/docs/cli/tasks.md +111 -0
- package/docs/cli/tui.md +89 -0
- package/docs/cli/uninstall.md +44 -0
- package/docs/cli/update.md +242 -0
- package/docs/cli/voicecall.md +204 -0
- package/docs/cli/webhooks.md +117 -0
- package/docs/cli/wiki.md +256 -0
- package/docs/concepts/active-memory.md +856 -0
- package/docs/concepts/agent-loop.md +185 -0
- package/docs/concepts/agent-runtimes.md +243 -0
- package/docs/concepts/agent-workspace.md +230 -0
- package/docs/concepts/agent.md +136 -0
- package/docs/concepts/architecture.md +154 -0
- package/docs/concepts/channel-docking.md +145 -0
- package/docs/concepts/commitments.md +150 -0
- package/docs/concepts/compaction.md +203 -0
- package/docs/concepts/context-engine.md +306 -0
- package/docs/concepts/context.md +199 -0
- package/docs/concepts/delegate-architecture.md +319 -0
- package/docs/concepts/dreaming.md +261 -0
- package/docs/concepts/experimental-features.md +108 -0
- package/docs/concepts/features.md +91 -0
- package/docs/concepts/mantis-slack-desktop-runbook.md +202 -0
- package/docs/concepts/mantis.md +740 -0
- package/docs/concepts/markdown-formatting.md +139 -0
- package/docs/concepts/memory-builtin.md +146 -0
- package/docs/concepts/memory-honcho.md +144 -0
- package/docs/concepts/memory-qmd.md +271 -0
- package/docs/concepts/memory-search.md +166 -0
- package/docs/concepts/memory.md +258 -0
- package/docs/concepts/message-lifecycle-refactor.md +1128 -0
- package/docs/concepts/messages.md +214 -0
- package/docs/concepts/model-failover.md +385 -0
- package/docs/concepts/model-providers.md +715 -0
- package/docs/concepts/models.md +370 -0
- package/docs/concepts/multi-agent.md +619 -0
- package/docs/concepts/oauth.md +198 -0
- package/docs/concepts/openclaw-sdk.md +323 -0
- package/docs/concepts/parallel-specialist-lanes.md +127 -0
- package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
- package/docs/concepts/presence.md +117 -0
- package/docs/concepts/progress-drafts.md +362 -0
- package/docs/concepts/qa-e2e-automation.md +820 -0
- package/docs/concepts/qa-matrix.md +139 -0
- package/docs/concepts/queue-steering.md +90 -0
- package/docs/concepts/queue.md +122 -0
- package/docs/concepts/retry.md +86 -0
- package/docs/concepts/session-pruning.md +104 -0
- package/docs/concepts/session-tool.md +190 -0
- package/docs/concepts/session.md +164 -0
- package/docs/concepts/soul.md +116 -0
- package/docs/concepts/streaming.md +251 -0
- package/docs/concepts/system-prompt.md +310 -0
- package/docs/concepts/timezone.md +47 -0
- package/docs/concepts/typebox.md +309 -0
- package/docs/concepts/typing-indicators.md +88 -0
- package/docs/concepts/usage-tracking.md +66 -0
- package/docs/date-time.md +126 -0
- package/docs/debug/node-issue.md +90 -0
- package/docs/diagnostics/flags.md +138 -0
- package/docs/docs.json +1832 -0
- package/docs/gateway/authentication.md +239 -0
- package/docs/gateway/background-process.md +147 -0
- package/docs/gateway/bonjour.md +303 -0
- package/docs/gateway/bridge-protocol.md +94 -0
- package/docs/gateway/cli-backends.md +420 -0
- package/docs/gateway/config-agents.md +1514 -0
- package/docs/gateway/config-channels.md +945 -0
- package/docs/gateway/config-tools.md +769 -0
- package/docs/gateway/configuration-examples.md +705 -0
- package/docs/gateway/configuration-reference.md +1393 -0
- package/docs/gateway/configuration.md +737 -0
- package/docs/gateway/diagnostics.md +213 -0
- package/docs/gateway/discovery.md +154 -0
- package/docs/gateway/doctor.md +574 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +73 -0
- package/docs/gateway/heartbeat.md +493 -0
- package/docs/gateway/index.md +383 -0
- package/docs/gateway/local-model-services.md +205 -0
- package/docs/gateway/local-models.md +355 -0
- package/docs/gateway/logging.md +149 -0
- package/docs/gateway/multiple-gateways.md +178 -0
- package/docs/gateway/network-model.md +15 -0
- package/docs/gateway/openai-http-api.md +350 -0
- package/docs/gateway/openresponses-http-api.md +347 -0
- package/docs/gateway/openshell.md +316 -0
- package/docs/gateway/opentelemetry.md +404 -0
- package/docs/gateway/operator-scopes.md +111 -0
- package/docs/gateway/pairing.md +207 -0
- package/docs/gateway/prometheus.md +230 -0
- package/docs/gateway/protocol.md +803 -0
- package/docs/gateway/remote-gateway-readme.md +169 -0
- package/docs/gateway/remote.md +280 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +146 -0
- package/docs/gateway/sandboxing.md +545 -0
- package/docs/gateway/secrets-plan-contract.md +114 -0
- package/docs/gateway/secrets.md +609 -0
- package/docs/gateway/security/audit-checks.md +127 -0
- package/docs/gateway/security/index.md +1326 -0
- package/docs/gateway/security/secure-file-operations.md +76 -0
- package/docs/gateway/tailscale.md +156 -0
- package/docs/gateway/tools-invoke-http-api.md +169 -0
- package/docs/gateway/troubleshooting.md +772 -0
- package/docs/gateway/trusted-proxy-auth.md +451 -0
- package/docs/help/debugging.md +344 -0
- package/docs/help/environment.md +214 -0
- package/docs/help/faq-first-run.md +867 -0
- package/docs/help/faq-models.md +553 -0
- package/docs/help/faq.md +1975 -0
- package/docs/help/gpt55-codex-agentic-parity-maintainers.md +196 -0
- package/docs/help/gpt55-codex-agentic-parity.md +230 -0
- package/docs/help/index.md +39 -0
- package/docs/help/scripts.md +56 -0
- package/docs/help/testing-live.md +580 -0
- package/docs/help/testing-updates-plugins.md +291 -0
- package/docs/help/testing.md +928 -0
- package/docs/help/troubleshooting.md +424 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-get-group-id.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +233 -0
- package/docs/install/azure.md +315 -0
- package/docs/install/bun.md +59 -0
- package/docs/install/clawdock.md +112 -0
- package/docs/install/development-channels.md +135 -0
- package/docs/install/digitalocean.md +174 -0
- package/docs/install/docker-vm-runtime.md +154 -0
- package/docs/install/docker.md +562 -0
- package/docs/install/exe-dev.md +201 -0
- package/docs/install/fly.md +524 -0
- package/docs/install/gcp.md +418 -0
- package/docs/install/hetzner.md +285 -0
- package/docs/install/hostinger.md +98 -0
- package/docs/install/index.md +221 -0
- package/docs/install/installer.md +455 -0
- package/docs/install/kubernetes.md +196 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-claude.md +165 -0
- package/docs/install/migrating-hermes.md +177 -0
- package/docs/install/migrating.md +137 -0
- package/docs/install/nix.md +112 -0
- package/docs/install/node.md +142 -0
- package/docs/install/northflank.mdx +44 -0
- package/docs/install/oracle.md +218 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +92 -0
- package/docs/install/raspberry-pi.md +234 -0
- package/docs/install/render.mdx +167 -0
- package/docs/install/uninstall.md +131 -0
- package/docs/install/updating.md +280 -0
- package/docs/logging.md +318 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +72 -0
- package/docs/nodes/audio.md +215 -0
- package/docs/nodes/camera.md +166 -0
- package/docs/nodes/images.md +77 -0
- package/docs/nodes/index.md +439 -0
- package/docs/nodes/location-command.md +102 -0
- package/docs/nodes/media-understanding.md +469 -0
- package/docs/nodes/talk.md +154 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +93 -0
- package/docs/perplexity.md +11 -0
- package/docs/pi-dev.md +82 -0
- package/docs/pi.md +573 -0
- package/docs/plan/codex-context-engine-harness.md +624 -0
- package/docs/plan/ui-channels.md +284 -0
- package/docs/platforms/android.md +285 -0
- package/docs/platforms/digitalocean.md +12 -0
- package/docs/platforms/index.md +60 -0
- package/docs/platforms/ios.md +283 -0
- package/docs/platforms/linux.md +141 -0
- package/docs/platforms/mac/bundled-gateway.md +79 -0
- package/docs/platforms/mac/canvas.md +128 -0
- package/docs/platforms/mac/child-process.md +72 -0
- package/docs/platforms/mac/dev-setup.md +112 -0
- package/docs/platforms/mac/health.md +39 -0
- package/docs/platforms/mac/icon.md +36 -0
- package/docs/platforms/mac/logging.md +62 -0
- package/docs/platforms/mac/menu-bar.md +93 -0
- package/docs/platforms/mac/peekaboo.md +92 -0
- package/docs/platforms/mac/permissions.md +53 -0
- package/docs/platforms/mac/remote.md +123 -0
- package/docs/platforms/mac/signing.md +52 -0
- package/docs/platforms/mac/skills.md +43 -0
- package/docs/platforms/mac/voice-overlay.md +66 -0
- package/docs/platforms/mac/voicewake.md +73 -0
- package/docs/platforms/mac/webchat.md +54 -0
- package/docs/platforms/mac/xpc.md +66 -0
- package/docs/platforms/macos.md +226 -0
- package/docs/platforms/oracle.md +12 -0
- package/docs/platforms/raspberry-pi.md +13 -0
- package/docs/platforms/windows.md +286 -0
- package/docs/plugins/adding-capabilities.md +133 -0
- package/docs/plugins/admin-http-rpc.md +216 -0
- package/docs/plugins/agent-tools.md +13 -0
- package/docs/plugins/architecture-internals.md +1195 -0
- package/docs/plugins/architecture.md +481 -0
- package/docs/plugins/building-extensions.md +13 -0
- package/docs/plugins/building-plugins.md +330 -0
- package/docs/plugins/bundles.md +310 -0
- package/docs/plugins/cli-backend-plugins.md +310 -0
- package/docs/plugins/codex-computer-use.md +293 -0
- package/docs/plugins/codex-harness-reference.md +409 -0
- package/docs/plugins/codex-harness-runtime.md +247 -0
- package/docs/plugins/codex-harness.md +746 -0
- package/docs/plugins/codex-native-plugins.md +276 -0
- package/docs/plugins/community.md +77 -0
- package/docs/plugins/compatibility.md +164 -0
- package/docs/plugins/dependency-resolution.md +143 -0
- package/docs/plugins/google-meet.md +1737 -0
- package/docs/plugins/hooks.md +459 -0
- package/docs/plugins/install-overrides.md +80 -0
- package/docs/plugins/manage-plugins.md +210 -0
- package/docs/plugins/manifest.md +1359 -0
- package/docs/plugins/memory-lancedb.md +385 -0
- package/docs/plugins/memory-wiki.md +529 -0
- package/docs/plugins/message-presentation.md +473 -0
- package/docs/plugins/oc-path.md +166 -0
- package/docs/plugins/plugin-inventory.md +182 -0
- package/docs/plugins/reference/acpx.md +23 -0
- package/docs/plugins/reference/admin-http-rpc.md +23 -0
- package/docs/plugins/reference/alibaba.md +23 -0
- package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
- package/docs/plugins/reference/amazon-bedrock.md +23 -0
- package/docs/plugins/reference/anthropic-vertex.md +19 -0
- package/docs/plugins/reference/anthropic.md +23 -0
- package/docs/plugins/reference/arcee.md +23 -0
- package/docs/plugins/reference/azure-speech.md +23 -0
- package/docs/plugins/reference/bonjour.md +19 -0
- package/docs/plugins/reference/brave.md +23 -0
- package/docs/plugins/reference/browser.md +23 -0
- package/docs/plugins/reference/byteplus.md +19 -0
- package/docs/plugins/reference/canvas.md +19 -0
- package/docs/plugins/reference/cerebras.md +23 -0
- package/docs/plugins/reference/chutes.md +23 -0
- package/docs/plugins/reference/clickclack.md +23 -0
- package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
- package/docs/plugins/reference/codex.md +23 -0
- package/docs/plugins/reference/comfy.md +23 -0
- package/docs/plugins/reference/copilot-proxy.md +19 -0
- package/docs/plugins/reference/deepgram.md +23 -0
- package/docs/plugins/reference/deepinfra.md +23 -0
- package/docs/plugins/reference/deepseek.md +23 -0
- package/docs/plugins/reference/diagnostics-otel.md +19 -0
- package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
- package/docs/plugins/reference/diffs.md +19 -0
- package/docs/plugins/reference/discord.md +23 -0
- package/docs/plugins/reference/document-extract.md +23 -0
- package/docs/plugins/reference/duckduckgo.md +23 -0
- package/docs/plugins/reference/elevenlabs.md +23 -0
- package/docs/plugins/reference/exa.md +23 -0
- package/docs/plugins/reference/fal.md +23 -0
- package/docs/plugins/reference/feishu.md +23 -0
- package/docs/plugins/reference/file-transfer.md +19 -0
- package/docs/plugins/reference/firecrawl.md +23 -0
- package/docs/plugins/reference/fireworks.md +23 -0
- package/docs/plugins/reference/github-copilot.md +23 -0
- package/docs/plugins/reference/google-meet.md +23 -0
- package/docs/plugins/reference/google.md +23 -0
- package/docs/plugins/reference/googlechat.md +23 -0
- package/docs/plugins/reference/gradium.md +23 -0
- package/docs/plugins/reference/groq.md +23 -0
- package/docs/plugins/reference/huggingface.md +23 -0
- package/docs/plugins/reference/imessage.md +23 -0
- package/docs/plugins/reference/inworld.md +23 -0
- package/docs/plugins/reference/irc.md +23 -0
- package/docs/plugins/reference/kilocode.md +23 -0
- package/docs/plugins/reference/kimi.md +23 -0
- package/docs/plugins/reference/line.md +23 -0
- package/docs/plugins/reference/litellm.md +23 -0
- package/docs/plugins/reference/llm-task.md +19 -0
- package/docs/plugins/reference/lmstudio.md +23 -0
- package/docs/plugins/reference/lobster.md +19 -0
- package/docs/plugins/reference/matrix.md +23 -0
- package/docs/plugins/reference/mattermost.md +23 -0
- package/docs/plugins/reference/memory-core.md +19 -0
- package/docs/plugins/reference/memory-lancedb.md +23 -0
- package/docs/plugins/reference/memory-wiki.md +23 -0
- package/docs/plugins/reference/microsoft-foundry.md +19 -0
- package/docs/plugins/reference/microsoft.md +19 -0
- package/docs/plugins/reference/migrate-claude.md +19 -0
- package/docs/plugins/reference/migrate-hermes.md +19 -0
- package/docs/plugins/reference/minimax.md +23 -0
- package/docs/plugins/reference/mistral.md +23 -0
- package/docs/plugins/reference/moonshot.md +23 -0
- package/docs/plugins/reference/msteams.md +23 -0
- package/docs/plugins/reference/nextcloud-talk.md +23 -0
- package/docs/plugins/reference/nostr.md +23 -0
- package/docs/plugins/reference/nvidia.md +23 -0
- package/docs/plugins/reference/oc-path.md +23 -0
- package/docs/plugins/reference/ollama.md +23 -0
- package/docs/plugins/reference/open-prose.md +19 -0
- package/docs/plugins/reference/openai.md +23 -0
- package/docs/plugins/reference/opencode-go.md +23 -0
- package/docs/plugins/reference/opencode.md +23 -0
- package/docs/plugins/reference/openrouter.md +23 -0
- package/docs/plugins/reference/openshell.md +19 -0
- package/docs/plugins/reference/perplexity.md +23 -0
- package/docs/plugins/reference/policy.md +23 -0
- package/docs/plugins/reference/qa-channel.md +23 -0
- package/docs/plugins/reference/qa-lab.md +19 -0
- package/docs/plugins/reference/qa-matrix.md +19 -0
- package/docs/plugins/reference/qianfan.md +23 -0
- package/docs/plugins/reference/qqbot.md +23 -0
- package/docs/plugins/reference/qwen.md +23 -0
- package/docs/plugins/reference/runway.md +23 -0
- package/docs/plugins/reference/searxng.md +19 -0
- package/docs/plugins/reference/senseaudio.md +23 -0
- package/docs/plugins/reference/sglang.md +23 -0
- package/docs/plugins/reference/signal.md +23 -0
- package/docs/plugins/reference/skill-workshop.md +23 -0
- package/docs/plugins/reference/slack.md +23 -0
- package/docs/plugins/reference/stepfun.md +23 -0
- package/docs/plugins/reference/synology-chat.md +23 -0
- package/docs/plugins/reference/synthetic.md +23 -0
- package/docs/plugins/reference/tavily.md +23 -0
- package/docs/plugins/reference/telegram.md +23 -0
- package/docs/plugins/reference/tencent.md +23 -0
- package/docs/plugins/reference/tlon.md +23 -0
- package/docs/plugins/reference/together.md +23 -0
- package/docs/plugins/reference/tokenjuice.md +23 -0
- package/docs/plugins/reference/tts-local-cli.md +19 -0
- package/docs/plugins/reference/twitch.md +23 -0
- package/docs/plugins/reference/venice.md +23 -0
- package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
- package/docs/plugins/reference/vllm.md +23 -0
- package/docs/plugins/reference/voice-call.md +23 -0
- package/docs/plugins/reference/volcengine.md +23 -0
- package/docs/plugins/reference/voyage.md +19 -0
- package/docs/plugins/reference/vydra.md +23 -0
- package/docs/plugins/reference/web-readability.md +19 -0
- package/docs/plugins/reference/webhooks.md +23 -0
- package/docs/plugins/reference/whatsapp.md +23 -0
- package/docs/plugins/reference/xai.md +23 -0
- package/docs/plugins/reference/xiaomi.md +23 -0
- package/docs/plugins/reference/zai.md +23 -0
- package/docs/plugins/reference/zalo.md +23 -0
- package/docs/plugins/reference/zalouser.md +24 -0
- package/docs/plugins/reference.md +138 -0
- package/docs/plugins/sdk-agent-harness.md +339 -0
- package/docs/plugins/sdk-channel-ingress.md +137 -0
- package/docs/plugins/sdk-channel-message.md +458 -0
- package/docs/plugins/sdk-channel-plugins.md +762 -0
- package/docs/plugins/sdk-channel-turn.md +580 -0
- package/docs/plugins/sdk-entrypoints.md +333 -0
- package/docs/plugins/sdk-migration.md +949 -0
- package/docs/plugins/sdk-overview.md +501 -0
- package/docs/plugins/sdk-provider-plugins.md +807 -0
- package/docs/plugins/sdk-runtime.md +676 -0
- package/docs/plugins/sdk-setup.md +550 -0
- package/docs/plugins/sdk-subpaths.md +396 -0
- package/docs/plugins/sdk-testing.md +401 -0
- package/docs/plugins/skill-workshop.md +713 -0
- package/docs/plugins/tool-plugins.md +411 -0
- package/docs/plugins/voice-call.md +943 -0
- package/docs/plugins/webhooks.md +192 -0
- package/docs/plugins/zalouser.md +86 -0
- package/docs/prose.md +137 -0
- package/docs/providers/alibaba.md +158 -0
- package/docs/providers/anthropic.md +344 -0
- package/docs/providers/arcee.md +144 -0
- package/docs/providers/azure-speech.md +119 -0
- package/docs/providers/bedrock-mantle.md +211 -0
- package/docs/providers/bedrock.md +414 -0
- package/docs/providers/cerebras.md +130 -0
- package/docs/providers/chutes.md +153 -0
- package/docs/providers/claude-max-api-proxy.md +188 -0
- package/docs/providers/cloudflare-ai-gateway.md +119 -0
- package/docs/providers/comfy.md +362 -0
- package/docs/providers/deepgram.md +184 -0
- package/docs/providers/deepinfra.md +87 -0
- package/docs/providers/deepseek.md +146 -0
- package/docs/providers/ds4.md +309 -0
- package/docs/providers/elevenlabs.md +130 -0
- package/docs/providers/fal.md +204 -0
- package/docs/providers/fireworks.md +144 -0
- package/docs/providers/github-copilot.md +225 -0
- package/docs/providers/glm.md +137 -0
- package/docs/providers/google.md +472 -0
- package/docs/providers/gradium.md +123 -0
- package/docs/providers/groq.md +180 -0
- package/docs/providers/huggingface.md +235 -0
- package/docs/providers/index.md +102 -0
- package/docs/providers/inferrs.md +272 -0
- package/docs/providers/inworld.md +120 -0
- package/docs/providers/kilocode.md +135 -0
- package/docs/providers/litellm.md +234 -0
- package/docs/providers/lmstudio.md +224 -0
- package/docs/providers/minimax.md +505 -0
- package/docs/providers/mistral.md +235 -0
- package/docs/providers/models.md +65 -0
- package/docs/providers/moonshot.md +413 -0
- package/docs/providers/nvidia.md +140 -0
- package/docs/providers/ollama.md +1180 -0
- package/docs/providers/openai.md +1057 -0
- package/docs/providers/opencode-go.md +123 -0
- package/docs/providers/opencode.md +149 -0
- package/docs/providers/openrouter.md +349 -0
- package/docs/providers/perplexity-provider.md +123 -0
- package/docs/providers/qianfan.md +132 -0
- package/docs/providers/qwen.md +332 -0
- package/docs/providers/runway.md +103 -0
- package/docs/providers/senseaudio.md +68 -0
- package/docs/providers/sglang.md +161 -0
- package/docs/providers/stepfun.md +229 -0
- package/docs/providers/synthetic.md +154 -0
- package/docs/providers/tencent.md +130 -0
- package/docs/providers/together.md +141 -0
- package/docs/providers/venice.md +315 -0
- package/docs/providers/vercel-ai-gateway.md +128 -0
- package/docs/providers/vllm.md +383 -0
- package/docs/providers/volcengine.md +199 -0
- package/docs/providers/vydra.md +180 -0
- package/docs/providers/xai.md +560 -0
- package/docs/providers/xiaomi.md +188 -0
- package/docs/providers/zai.md +203 -0
- package/docs/refactor/access.md +9 -0
- package/docs/refactor/acp.md +298 -0
- package/docs/refactor/canvas.md +131 -0
- package/docs/refactor/ingress-core.md +341 -0
- package/docs/reference/AGENTS.default.md +129 -0
- package/docs/reference/RELEASING.md +767 -0
- package/docs/reference/api-usage-costs.md +202 -0
- package/docs/reference/application-modernization-plan.md +208 -0
- package/docs/reference/code-mode.md +757 -0
- package/docs/reference/credits.md +33 -0
- package/docs/reference/device-models.md +50 -0
- package/docs/reference/full-release-validation.md +202 -0
- package/docs/reference/memory-config.md +630 -0
- package/docs/reference/openclaw-sdk-api-design.md +390 -0
- package/docs/reference/prompt-caching.md +358 -0
- package/docs/reference/rich-output-protocol.md +79 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +159 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +663 -0
- package/docs/reference/session-management-compaction.md +461 -0
- package/docs/reference/templates/AGENTS.dev.md +89 -0
- package/docs/reference/templates/AGENTS.md +225 -0
- package/docs/reference/templates/BOOT.md +16 -0
- package/docs/reference/templates/BOOTSTRAP.md +66 -0
- package/docs/reference/templates/HEARTBEAT.md +16 -0
- package/docs/reference/templates/IDENTITY.dev.md +52 -0
- package/docs/reference/templates/IDENTITY.md +34 -0
- package/docs/reference/templates/SOUL.dev.md +82 -0
- package/docs/reference/templates/SOUL.md +49 -0
- package/docs/reference/templates/TOOLS.dev.md +29 -0
- package/docs/reference/templates/TOOLS.md +51 -0
- package/docs/reference/templates/USER.dev.md +23 -0
- package/docs/reference/templates/USER.md +28 -0
- package/docs/reference/test.md +239 -0
- package/docs/reference/token-use.md +233 -0
- package/docs/reference/transcript-hygiene.md +214 -0
- package/docs/reference/wizard.md +252 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
- package/docs/security/formal-verification.md +170 -0
- package/docs/security/incident-response.md +59 -0
- package/docs/security/network-proxy.md +268 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +49 -0
- package/docs/start/docs-directory.md +69 -0
- package/docs/start/getting-started.md +152 -0
- package/docs/start/hubs.md +201 -0
- package/docs/start/lore.md +223 -0
- package/docs/start/onboarding-overview.md +72 -0
- package/docs/start/onboarding.md +95 -0
- package/docs/start/openclaw.md +244 -0
- package/docs/start/quickstart.md +25 -0
- package/docs/start/setup.md +178 -0
- package/docs/start/showcase.md +383 -0
- package/docs/start/wizard-cli-automation.md +232 -0
- package/docs/start/wizard-cli-reference.md +331 -0
- package/docs/start/wizard.md +141 -0
- package/docs/style.css +184 -0
- package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +316 -0
- package/docs/tools/acp-agents-setup.md +352 -0
- package/docs/tools/acp-agents.md +847 -0
- package/docs/tools/agent-send.md +112 -0
- package/docs/tools/apply-patch.md +64 -0
- package/docs/tools/brave-search.md +139 -0
- package/docs/tools/browser-control.md +391 -0
- package/docs/tools/browser-linux-troubleshooting.md +173 -0
- package/docs/tools/browser-login.md +77 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
- package/docs/tools/browser.md +769 -0
- package/docs/tools/btw.md +159 -0
- package/docs/tools/capability-cookbook.md +12 -0
- package/docs/tools/clawhub.md +5 -0
- package/docs/tools/code-execution.md +173 -0
- package/docs/tools/creating-skills.md +120 -0
- package/docs/tools/diffs.md +506 -0
- package/docs/tools/duckduckgo-search.md +109 -0
- package/docs/tools/elevated.md +128 -0
- package/docs/tools/exa-search.md +152 -0
- package/docs/tools/exec-approvals-advanced.md +360 -0
- package/docs/tools/exec-approvals.md +474 -0
- package/docs/tools/exec.md +282 -0
- package/docs/tools/firecrawl.md +155 -0
- package/docs/tools/gemini-search.md +114 -0
- package/docs/tools/grok-search.md +113 -0
- package/docs/tools/image-generation.md +433 -0
- package/docs/tools/index.md +178 -0
- package/docs/tools/kimi-search.md +105 -0
- package/docs/tools/llm-task.md +137 -0
- package/docs/tools/lobster.md +365 -0
- package/docs/tools/loop-detection.md +154 -0
- package/docs/tools/media-overview.md +157 -0
- package/docs/tools/minimax-search.md +102 -0
- package/docs/tools/multi-agent-sandbox-tools.md +409 -0
- package/docs/tools/music-generation.md +371 -0
- package/docs/tools/ollama-search.md +153 -0
- package/docs/tools/pdf.md +195 -0
- package/docs/tools/perplexity-search.md +220 -0
- package/docs/tools/plugin.md +327 -0
- package/docs/tools/reactions.md +100 -0
- package/docs/tools/searxng-search.md +141 -0
- package/docs/tools/skills-config.md +195 -0
- package/docs/tools/skills.md +535 -0
- package/docs/tools/slash-commands.md +488 -0
- package/docs/tools/steer.md +84 -0
- package/docs/tools/subagents.md +650 -0
- package/docs/tools/tavily.md +162 -0
- package/docs/tools/thinking.md +140 -0
- package/docs/tools/tokenjuice.md +81 -0
- package/docs/tools/tool-search.md +269 -0
- package/docs/tools/trajectory.md +229 -0
- package/docs/tools/tts.md +1004 -0
- package/docs/tools/video-generation.md +552 -0
- package/docs/tools/web-fetch.md +195 -0
- package/docs/tools/web.md +459 -0
- package/docs/tts.md +11 -0
- package/docs/vps.md +139 -0
- package/docs/web/control-ui.md +503 -0
- package/docs/web/dashboard.md +107 -0
- package/docs/web/index.md +133 -0
- package/docs/web/tui.md +246 -0
- package/docs/web/webchat.md +99 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/nodmix.mjs +487 -0
- package/package.json +1852 -0
- package/patches/.gitkeep +0 -0
- package/patches/@agentclientprotocol__claude-agent-acp@0.36.1.patch +41 -0
- package/pnpm-workspace.yaml +63 -0
- package/scripts/crabbox-wrapper.mjs +353 -0
- package/scripts/lib/official-external-channel-catalog.json +559 -0
- package/scripts/lib/official-external-plugin-catalog.json +192 -0
- package/scripts/lib/official-external-provider-catalog.json +117 -0
- package/scripts/lib/package-dist-imports.mjs +171 -0
- package/scripts/npm-runner.mjs +91 -0
- package/scripts/postinstall-bundled-plugins.mjs +978 -0
- package/scripts/preinstall-package-manager-warning.mjs +64 -0
- package/scripts/windows-cmd-helpers.mjs +20 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +78 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +149 -0
- package/skills/diagram-maker/SKILL.md +53 -0
- package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
- package/skills/diagram-maker/references/svg-template.md +112 -0
- package/skills/discord/SKILL.md +136 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +47 -0
- package/skills/gh-issues/SKILL.md +213 -0
- package/skills/gifgrep/SKILL.md +85 -0
- package/skills/github/SKILL.md +84 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +105 -0
- package/skills/himalaya/SKILL.md +80 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/meme-maker/SKILL.md +42 -0
- package/skills/meme-maker/references/templates.json +358 -0
- package/skills/meme-maker/scripts/meme.mjs +398 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +319 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/node-inspect-debugger/SKILL.md +85 -0
- package/skills/notion/SKILL.md +150 -0
- package/skills/obsidian/SKILL.md +119 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +71 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +126 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/pyproject.toml +10 -0
- package/skills/python-debugpy/SKILL.md +73 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +151 -0
- package/skills/sherpa-onnx-tts/SKILL.md +109 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +78 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +169 -0
- package/skills/skill-creator/scripts/test_package_skill.py +161 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
- package/skills/slack/SKILL.md +78 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spike/SKILL.md +51 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/taskflow/SKILL.md +149 -0
- package/skills/taskflow/examples/inbox-triage.lobster +33 -0
- package/skills/taskflow/examples/pr-intake.lobster +32 -0
- package/skills/taskflow-inbox-triage/SKILL.md +119 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +91 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +108 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +64 -0
- package/skills/xurl/SKILL.md +120 -0
|
@@ -0,0 +1,740 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Mantis is the visual end-to-end verification system for reproducing Nodmix bugs on live transports, capturing before and after evidence, and attaching artifacts to PRs."
|
|
3
|
+
title: "Mantis"
|
|
4
|
+
read_when:
|
|
5
|
+
- Building or running live visual QA for Nodmix bugs
|
|
6
|
+
- Adding before and after verification for a pull request
|
|
7
|
+
- Adding Discord, Slack, WhatsApp, or other live transport scenarios
|
|
8
|
+
- Debugging QA runs that need screenshots, browser automation, or VNC access
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Mantis is the Nodmix end-to-end verification system for bugs that need a real
|
|
12
|
+
runtime, a real transport, and visible proof. It runs a scenario against a known
|
|
13
|
+
bad ref, captures evidence, runs the same scenario against a candidate ref, and
|
|
14
|
+
publishes the comparison as artifacts that a maintainer can inspect from a PR or
|
|
15
|
+
from a local command.
|
|
16
|
+
|
|
17
|
+
Mantis starts with Discord because Discord gives us a high-value first lane:
|
|
18
|
+
real bot auth, real guild channels, reactions, threads, native commands, and a
|
|
19
|
+
browser UI where humans can visually confirm what the transport showed.
|
|
20
|
+
|
|
21
|
+
## Goals
|
|
22
|
+
|
|
23
|
+
- Reproduce a bug from a GitHub issue or PR with the same transport shape users
|
|
24
|
+
see.
|
|
25
|
+
- Capture a **before** artifact on the baseline ref before applying the fix.
|
|
26
|
+
- Capture an **after** artifact on the candidate ref after applying the fix.
|
|
27
|
+
- Use a deterministic oracle whenever possible, such as a Discord REST reaction
|
|
28
|
+
read or channel transcript check.
|
|
29
|
+
- Capture screenshots when the bug has a visible UI surface.
|
|
30
|
+
- Run locally from an agent-controlled CLI and remotely from GitHub.
|
|
31
|
+
- Preserve enough machine state for VNC rescue when login, browser automation, or
|
|
32
|
+
provider auth gets stuck.
|
|
33
|
+
- Post concise status to an operator Discord channel when the run is blocked,
|
|
34
|
+
needs manual VNC help, or finishes.
|
|
35
|
+
|
|
36
|
+
## Non goals
|
|
37
|
+
|
|
38
|
+
- Mantis is not a replacement for unit tests. A Mantis run should usually become
|
|
39
|
+
a smaller regression test after the fix is understood.
|
|
40
|
+
- Mantis is not the normal fast CI gate. It is slower, uses live credentials, and
|
|
41
|
+
is reserved for bugs where the live environment matters.
|
|
42
|
+
- Mantis should not require a human for normal operation. Manual VNC is a rescue
|
|
43
|
+
path, not the happy path.
|
|
44
|
+
- Mantis does not store raw secrets in artifacts, logs, screenshots, Markdown
|
|
45
|
+
reports, or PR comments.
|
|
46
|
+
|
|
47
|
+
## Ownership
|
|
48
|
+
|
|
49
|
+
Mantis lives in the Nodmix QA stack.
|
|
50
|
+
|
|
51
|
+
- Nodmix owns the scenario runtime, transport adapters, evidence schema, and
|
|
52
|
+
local CLI under `pnpm nodmix qa mantis`.
|
|
53
|
+
- QA Lab owns the live transport harness pieces, browser capture helpers, and
|
|
54
|
+
artifact writers.
|
|
55
|
+
- Crabbox owns warmed Linux machines when a remote VM is needed.
|
|
56
|
+
- GitHub Actions owns the remote workflow entrypoint and artifact retention.
|
|
57
|
+
- ClawSweeper owns GitHub comment routing: parsing maintainer commands,
|
|
58
|
+
dispatching the workflow, and posting the final PR comment.
|
|
59
|
+
- Nodmix agents drive Mantis through Codex when a scenario needs agentic setup,
|
|
60
|
+
debugging, or stuck-state reporting.
|
|
61
|
+
|
|
62
|
+
This boundary keeps transport knowledge in Nodmix, machine scheduling in
|
|
63
|
+
Crabbox, and maintainer workflow glue in ClawSweeper.
|
|
64
|
+
|
|
65
|
+
## Command shape
|
|
66
|
+
|
|
67
|
+
The first local command verifies the Discord bot, guild, channel, message send,
|
|
68
|
+
reaction send, and artifact path:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pnpm nodmix qa mantis discord-smoke \
|
|
72
|
+
--output-dir .artifacts/qa-e2e/mantis/discord-smoke
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The local before and after runner accepts this shape:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm nodmix qa mantis run \
|
|
79
|
+
--transport discord \
|
|
80
|
+
--scenario discord-status-reactions-tool-only \
|
|
81
|
+
--baseline origin/main \
|
|
82
|
+
--candidate HEAD \
|
|
83
|
+
--output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The runner creates detached baseline and candidate worktrees under the output
|
|
87
|
+
directory, installs dependencies, builds each ref, runs the scenario with
|
|
88
|
+
`--allow-failures`, then writes `baseline/`, `candidate/`, `comparison.json`,
|
|
89
|
+
and `mantis-report.md`. For the first Discord scenario, a successful verification
|
|
90
|
+
means baseline status is `fail` and candidate status is `pass`.
|
|
91
|
+
|
|
92
|
+
The second Discord before/after probe targets thread attachments:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pnpm nodmix qa mantis run \
|
|
96
|
+
--transport discord \
|
|
97
|
+
--scenario discord-thread-reply-filepath-attachment \
|
|
98
|
+
--baseline <bug-ref> \
|
|
99
|
+
--candidate <fix-ref> \
|
|
100
|
+
--output-dir .artifacts/qa-e2e/mantis/local-discord-thread-attachment
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
That scenario posts a parent message with the driver bot, creates a real Discord
|
|
104
|
+
thread, calls Nodmix's `message.thread-reply` action with a repo-local
|
|
105
|
+
`filePath`, then polls the thread for the SUT reply and attachment filename. The
|
|
106
|
+
baseline screenshot shows the reply with no attachment; the candidate screenshot
|
|
107
|
+
shows the expected `mantis-thread-report.md` attachment.
|
|
108
|
+
|
|
109
|
+
The first VM/browser primitive is the desktop smoke:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pnpm nodmix qa mantis desktop-browser-smoke \
|
|
113
|
+
--output-dir .artifacts/qa-e2e/mantis/desktop-browser
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
It leases or reuses a Crabbox desktop machine, starts a visible browser inside the
|
|
117
|
+
VNC session, captures the desktop, pulls artifacts back to the local output
|
|
118
|
+
directory, and writes the reconnect command into the report. The command defaults
|
|
119
|
+
to the Hetzner provider because it is the first provider with working desktop/VNC
|
|
120
|
+
coverage in the Mantis lane. Override it with `--provider`, `--crabbox-bin`, or
|
|
121
|
+
`NODMIX_MANTIS_CRABBOX_PROVIDER` when running against another Crabbox fleet.
|
|
122
|
+
|
|
123
|
+
Useful desktop smoke flags:
|
|
124
|
+
|
|
125
|
+
- `--lease-id <cbx_...>` or `NODMIX_MANTIS_CRABBOX_LEASE_ID` reuses a warmed desktop.
|
|
126
|
+
- `--browser-url <url>` changes the page opened in the visible browser.
|
|
127
|
+
- `--html-file <path>` renders a repo-local HTML artifact in the visible browser. Mantis uses this to capture the generated Discord status-reaction timeline through a real Crabbox desktop.
|
|
128
|
+
- `--browser-profile-dir <remote-path>` reuses a remote Chrome user-data-dir so a persistent Mantis desktop can stay logged in between runs. Use this for the long-lived Discord Web viewer profile.
|
|
129
|
+
- `--browser-profile-archive-env <name>` restores a base64 `.tgz` Chrome user-data-dir archive from the named environment variable before launching the browser. Use this for logged-in witnesses such as Discord Web. The default env var is `NODMIX_MANTIS_BROWSER_PROFILE_TGZ_B64`.
|
|
130
|
+
- `--video-duration <seconds>` controls the MP4 capture length. Use a longer duration for slow logged-in web apps that need time to settle.
|
|
131
|
+
- `--keep-lease` or `NODMIX_MANTIS_KEEP_VM=1` keeps a newly created passing lease open for VNC inspection. Failed runs keep the lease by default when one was created so an operator can reconnect.
|
|
132
|
+
- `--class`, `--idle-timeout`, and `--ttl` tune machine size and lease lifetime.
|
|
133
|
+
|
|
134
|
+
For Discord Web evidence, Mantis uses a dedicated viewer account instead of a
|
|
135
|
+
bot token. The live Discord API scenario remains the oracle: it creates the real
|
|
136
|
+
thread, sends the SUT `thread-reply`, and checks the attachment through Discord
|
|
137
|
+
REST. When `NODMIX_QA_DISCORD_CAPTURE_UI_METADATA=1` is set, the scenario also
|
|
138
|
+
writes a Discord Web URL artifact. When `NODMIX_QA_DISCORD_KEEP_THREADS=1` is
|
|
139
|
+
set, it leaves that thread available long enough for a logged-in browser to open
|
|
140
|
+
and record it.
|
|
141
|
+
|
|
142
|
+
The GitHub workflow opens the candidate thread URL in Discord Web, captures a
|
|
143
|
+
screenshot, records an MP4, and generates a trimmed GIF preview when Crabbox
|
|
144
|
+
media tooling is available. Prefer a persistent viewer profile path configured
|
|
145
|
+
through `MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR`, because full Chrome profile
|
|
146
|
+
archives can outgrow GitHub's secret-size limit. For small/bootstrap profiles,
|
|
147
|
+
the workflow can also restore a base64 `.tgz` archive from
|
|
148
|
+
`MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64`. If neither profile source is
|
|
149
|
+
configured, the workflow still publishes the deterministic baseline/candidate
|
|
150
|
+
attachment screenshots and logs a notice that the logged-in Discord Web witness
|
|
151
|
+
was skipped.
|
|
152
|
+
|
|
153
|
+
The first full desktop transport primitive is the Slack desktop smoke:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
pnpm nodmix qa mantis slack-desktop-smoke \
|
|
157
|
+
--output-dir .artifacts/qa-e2e/mantis/slack-desktop \
|
|
158
|
+
--gateway-setup \
|
|
159
|
+
--scenario slack-canary \
|
|
160
|
+
--keep-lease
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
It leases or reuses a Crabbox desktop machine, syncs the current checkout into
|
|
164
|
+
the VM, runs `pnpm nodmix qa slack` inside that VM, opens Slack Web in the VNC
|
|
165
|
+
browser, captures the visible desktop, and copies both the Slack QA artifacts and
|
|
166
|
+
the VNC screenshot back to the local output directory. This is the first Mantis
|
|
167
|
+
shape where the SUT Nodmix gateway and the browser both live inside the same
|
|
168
|
+
Linux desktop VM.
|
|
169
|
+
|
|
170
|
+
With `--gateway-setup`, the command prepares a persistent disposable Nodmix
|
|
171
|
+
home at `$HOME/.nodmix-mantis/slack-nodmix`, patches Slack Socket Mode
|
|
172
|
+
configuration for the selected channel, starts `nodmix gateway run` on port
|
|
173
|
+
`38973`, and keeps Chrome running in the VNC session. This is the "leave me a
|
|
174
|
+
Linux desktop with Slack and a claw running" mode; the bot-to-bot Slack QA lane
|
|
175
|
+
remains the default when `--gateway-setup` is omitted.
|
|
176
|
+
|
|
177
|
+
Required inputs for `--credential-source env`:
|
|
178
|
+
|
|
179
|
+
- `NODMIX_QA_SLACK_CHANNEL_ID`
|
|
180
|
+
- `NODMIX_QA_SLACK_DRIVER_BOT_TOKEN`
|
|
181
|
+
- `NODMIX_QA_SLACK_SUT_BOT_TOKEN`
|
|
182
|
+
- `NODMIX_QA_SLACK_SUT_APP_TOKEN`
|
|
183
|
+
- `NODMIX_LIVE_OPENAI_KEY` for the remote model lane. If only
|
|
184
|
+
`OPENAI_API_KEY` is set locally, Mantis maps it to `NODMIX_LIVE_OPENAI_KEY`
|
|
185
|
+
before invoking Crabbox so Crabbox's `NODMIX_*` env forwarding can carry it
|
|
186
|
+
into the VM.
|
|
187
|
+
|
|
188
|
+
With `--gateway-setup --credential-source convex`, Mantis leases the Slack SUT
|
|
189
|
+
credential from the shared pool before creating the VM and forwards the leased
|
|
190
|
+
channel id, Socket Mode app token, and bot token as the `NODMIX_MANTIS_SLACK_*`
|
|
191
|
+
runtime env inside the desktop. That keeps GitHub workflows thin: they only need
|
|
192
|
+
the Convex broker secret, not raw Slack bot or app tokens.
|
|
193
|
+
|
|
194
|
+
Useful Slack desktop flags:
|
|
195
|
+
|
|
196
|
+
- `--lease-id <cbx_...>` reruns against a machine where an operator already logged in to Slack Web through VNC.
|
|
197
|
+
- `--gateway-setup` starts a persistent Nodmix Slack gateway in the VM instead of only running the bot-to-bot QA lane.
|
|
198
|
+
- `--keep-lease` keeps the gateway VM open for VNC inspection after success; `--no-keep-lease` stops it after collecting artifacts.
|
|
199
|
+
- `--slack-url <url>` opens a specific Slack Web URL. Without it, Mantis derives `https://app.slack.com/client/<team>/<channel>` from Slack `auth.test` when the SUT bot token is available.
|
|
200
|
+
- `--slack-channel-id <id>` controls the Slack channel allowlist used by gateway setup.
|
|
201
|
+
- `NODMIX_MANTIS_SLACK_BROWSER_PROFILE_DIR` controls the persistent Chrome profile inside the VM. The default is `$HOME/.config/nodmix-mantis/slack-chrome-profile`, so a manual Slack Web login survives reruns on the same lease.
|
|
202
|
+
- `--credential-source convex --credential-role ci` uses the shared credential pool instead of direct Slack env tokens.
|
|
203
|
+
- `--provider-mode`, `--model`, `--alt-model`, and `--fast` pass through to the Slack live lane.
|
|
204
|
+
|
|
205
|
+
The GitHub smoke workflow is `Mantis Discord Smoke`. The before and after GitHub
|
|
206
|
+
workflow for the first real scenario is `Mantis Discord Status Reactions`. It
|
|
207
|
+
accepts:
|
|
208
|
+
|
|
209
|
+
- `baseline_ref`: the ref expected to reproduce queued-only behavior.
|
|
210
|
+
- `candidate_ref`: the ref expected to show `queued -> thinking -> done`.
|
|
211
|
+
|
|
212
|
+
It checks out the workflow harness ref, builds separate baseline and candidate
|
|
213
|
+
worktrees, runs `discord-status-reactions-tool-only` against each worktree, and
|
|
214
|
+
uploads `baseline/`, `candidate/`, `comparison.json`, and `mantis-report.md` as
|
|
215
|
+
Actions artifacts. It also renders each lane's timeline HTML in a Crabbox
|
|
216
|
+
desktop browser and publishes those VNC screenshots beside the deterministic
|
|
217
|
+
timeline PNGs in the PR comment. The same PR comment embeds lightweight
|
|
218
|
+
motion-trimmed GIF previews generated by `crabbox media preview`, links to the
|
|
219
|
+
matching motion-trimmed MP4 clips, and keeps the full desktop MP4 files for deep
|
|
220
|
+
inspection. Screenshots stay inline for quick review. The workflow builds the
|
|
221
|
+
Crabbox CLI from
|
|
222
|
+
`nodmix/crabbox` main so it can use the current desktop/browser lease flags
|
|
223
|
+
before the next Crabbox binary release is cut.
|
|
224
|
+
|
|
225
|
+
`Mantis Scenario` is the generic manual entrypoint. It takes a `scenario_id`,
|
|
226
|
+
`candidate_ref`, optional `baseline_ref`, and optional `pr_number`, then
|
|
227
|
+
dispatches the scenario-owned workflow. The wrapper is intentionally thin:
|
|
228
|
+
scenario workflows still own their transport setup, credentials, VM class,
|
|
229
|
+
expected oracle, and artifact manifest.
|
|
230
|
+
|
|
231
|
+
`Mantis Slack Desktop Smoke` is the first Slack VM workflow. It checks out the
|
|
232
|
+
trusted candidate ref in a separate worktree, leases a Crabbox Linux desktop,
|
|
233
|
+
runs `pnpm nodmix qa mantis slack-desktop-smoke --gateway-setup` against that
|
|
234
|
+
candidate, opens Slack Web in the VNC browser, records the desktop, generates a
|
|
235
|
+
motion-trimmed preview with `crabbox media preview`, uploads the full artifact
|
|
236
|
+
directory, and optionally posts the inline evidence comment on the target PR.
|
|
237
|
+
It defaults to AWS for the desktop lease and exposes a manual provider input so
|
|
238
|
+
operators can switch to Hetzner when AWS capacity is slow or unavailable. Use
|
|
239
|
+
this lane when you want "a Linux desktop with Slack and a claw running" instead
|
|
240
|
+
of only a bot-to-bot Slack transcript.
|
|
241
|
+
|
|
242
|
+
`Mantis Telegram Live` wraps the existing Telegram live QA lane in the same PR
|
|
243
|
+
evidence pipeline. It checks out the trusted candidate ref in a separate
|
|
244
|
+
worktree, runs `pnpm nodmix qa telegram --credential-source convex
|
|
245
|
+
--credential-role ci`, writes a `mantis-evidence.json` manifest from the
|
|
246
|
+
Telegram QA summary and observed-message artifact, renders the redacted
|
|
247
|
+
transcript HTML through a Crabbox desktop browser, generates a motion-trimmed GIF
|
|
248
|
+
with `crabbox media preview`, and posts the inline PR evidence comment when a PR
|
|
249
|
+
number is available. This lane is transcript-visual rather than logged-in
|
|
250
|
+
Telegram Web proof: the Telegram Bot API gives stable live message evidence, but
|
|
251
|
+
Telegram Web login state is not required for normal Mantis automation.
|
|
252
|
+
|
|
253
|
+
`Mantis Telegram Desktop Proof` is the agentic native Telegram Desktop
|
|
254
|
+
before/after wrapper. A maintainer can trigger it from a PR comment with
|
|
255
|
+
`@nodmix-mantis telegram desktop proof`, from the Actions UI with freeform
|
|
256
|
+
instructions, or through the generic `Mantis Scenario` dispatcher. The workflow
|
|
257
|
+
hands the PR, baseline ref, candidate ref, and maintainer instructions to Codex.
|
|
258
|
+
The agent reads the PR, decides what Telegram-visible behavior proves the
|
|
259
|
+
change, runs the real-user Crabbox Telegram Desktop proof lane for baseline and
|
|
260
|
+
candidate, iterates until the native GIFs are useful, writes paired
|
|
261
|
+
`motionPreview` artifacts into `mantis-evidence.json`, uploads the bundle, and
|
|
262
|
+
posts a 2-column PR evidence table when a PR number is available.
|
|
263
|
+
|
|
264
|
+
For human-in-the-loop Telegram desktop setup, use the scenario builder:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
pnpm nodmix qa mantis telegram-desktop-builder \
|
|
268
|
+
--credential-source convex \
|
|
269
|
+
--credential-role maintainer \
|
|
270
|
+
--keep-lease
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
The builder leases or reuses a Crabbox desktop, installs the native Linux
|
|
274
|
+
Telegram Desktop binary, optionally restores a user-session archive, configures
|
|
275
|
+
Nodmix with the leased Telegram SUT bot token, starts `nodmix gateway run`
|
|
276
|
+
on port `38974`, posts a driver-bot readiness message to the leased private
|
|
277
|
+
group, then captures a screenshot and MP4 from the visible VNC desktop. A bot
|
|
278
|
+
token never logs Telegram Desktop in; it only configures Nodmix. The desktop
|
|
279
|
+
viewer is a separate Telegram user session restored from
|
|
280
|
+
`--telegram-profile-archive-env <name>` or created manually through VNC and kept
|
|
281
|
+
alive with `--keep-lease`.
|
|
282
|
+
|
|
283
|
+
Useful Telegram desktop builder flags:
|
|
284
|
+
|
|
285
|
+
- `--lease-id <cbx_...>` reruns against a VM where an operator already logged in to Telegram Desktop.
|
|
286
|
+
- `--telegram-profile-archive-env <name>` reads a base64 `.tgz` Telegram Desktop profile archive from that env var and restores it before launch.
|
|
287
|
+
- `--telegram-profile-dir <remote-path>` controls the remote Telegram Desktop profile directory. The default is `$HOME/.local/share/TelegramDesktop`.
|
|
288
|
+
- `--no-gateway-setup` installs and opens Telegram Desktop without configuring Nodmix.
|
|
289
|
+
- `--credential-source convex --credential-role ci` uses the shared credential broker instead of direct Telegram env tokens.
|
|
290
|
+
|
|
291
|
+
Every PR-publishing scenario writes `mantis-evidence.json` next to its report.
|
|
292
|
+
This schema is the handoff between scenario code and GitHub comments:
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
{
|
|
296
|
+
"schemaVersion": 1,
|
|
297
|
+
"id": "discord-status-reactions",
|
|
298
|
+
"title": "Mantis Discord Status Reactions QA",
|
|
299
|
+
"summary": "Human-readable top summary for the PR comment.",
|
|
300
|
+
"scenario": "discord-status-reactions-tool-only",
|
|
301
|
+
"comparison": {
|
|
302
|
+
"baseline": { "sha": "...", "status": "fail", "expected": "queued-only" },
|
|
303
|
+
"candidate": { "sha": "...", "status": "pass", "expected": "queued -> thinking -> done" },
|
|
304
|
+
"pass": true
|
|
305
|
+
},
|
|
306
|
+
"artifacts": [
|
|
307
|
+
{
|
|
308
|
+
"kind": "timeline",
|
|
309
|
+
"lane": "baseline",
|
|
310
|
+
"label": "Baseline queued-only",
|
|
311
|
+
"path": "baseline/timeline.png",
|
|
312
|
+
"targetPath": "baseline.png",
|
|
313
|
+
"alt": "Baseline Discord timeline",
|
|
314
|
+
"width": 420
|
|
315
|
+
}
|
|
316
|
+
]
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Artifact `path` values are relative to the manifest directory. `targetPath`
|
|
321
|
+
values are relative paths under the configured Mantis R2/S3 artifact prefix. The
|
|
322
|
+
publisher rejects path traversal and skips entries marked `"required": false`
|
|
323
|
+
when optional previews or videos are unavailable.
|
|
324
|
+
|
|
325
|
+
Supported artifact kinds:
|
|
326
|
+
|
|
327
|
+
- `timeline`: deterministic scenario screenshot, usually before/after.
|
|
328
|
+
- `desktopScreenshot`: VNC/browser desktop screenshot.
|
|
329
|
+
- `motionPreview`: inline animated GIF generated from the desktop recording.
|
|
330
|
+
- `motionClip`: motion-trimmed MP4 that removes static lead-in and tail.
|
|
331
|
+
- `fullVideo`: full MP4 recording for deep inspection.
|
|
332
|
+
- `metadata`: JSON/log sidecar.
|
|
333
|
+
- `report`: Markdown report.
|
|
334
|
+
|
|
335
|
+
The reusable publisher is `scripts/mantis/publish-pr-evidence.mjs`. Workflows
|
|
336
|
+
call it with the manifest, target PR, artifact target root, comment marker,
|
|
337
|
+
Actions artifact URL, run URL, and request source. It uploads declared artifacts
|
|
338
|
+
to the configured Mantis R2/S3 bucket, builds a summary-first PR comment with
|
|
339
|
+
inline images/previews and linked videos, then updates the existing marker
|
|
340
|
+
comment or creates one. The workflows publish to `nodmix-crabbox-artifacts`
|
|
341
|
+
with public URLs under `https://artifacts.nodmix.ai`. They provide bucket,
|
|
342
|
+
region, and public URL values directly. The reusable publisher requires:
|
|
343
|
+
|
|
344
|
+
- `MANTIS_ARTIFACT_R2_ACCESS_KEY_ID`
|
|
345
|
+
- `MANTIS_ARTIFACT_R2_SECRET_ACCESS_KEY`
|
|
346
|
+
- `MANTIS_ARTIFACT_R2_BUCKET`
|
|
347
|
+
- `MANTIS_ARTIFACT_R2_ENDPOINT`
|
|
348
|
+
- `MANTIS_ARTIFACT_R2_REGION`
|
|
349
|
+
- `MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL`
|
|
350
|
+
|
|
351
|
+
You can also trigger the status-reactions run directly from a PR comment:
|
|
352
|
+
|
|
353
|
+
```text
|
|
354
|
+
@nodmix-mantis discord status reactions
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
The comment trigger is intentionally narrow. It only runs on pull request
|
|
358
|
+
comments from users with write, maintain, or admin access, and it only recognizes
|
|
359
|
+
Discord status-reaction requests. By default it uses the known bad baseline ref
|
|
360
|
+
and the current PR head SHA as the candidate. Maintainers can override either
|
|
361
|
+
ref:
|
|
362
|
+
|
|
363
|
+
```text
|
|
364
|
+
@nodmix-mantis discord status reactions baseline=origin/main candidate=HEAD
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Telegram live QA can also be triggered from a PR comment:
|
|
368
|
+
|
|
369
|
+
```text
|
|
370
|
+
@nodmix-mantis telegram
|
|
371
|
+
@nodmix-mantis telegram scenario=telegram-status-command
|
|
372
|
+
@nodmix-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-reply
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
By default it uses the current PR head SHA as the candidate and runs
|
|
376
|
+
`telegram-status-command`. Maintainers can override `candidate=...`,
|
|
377
|
+
`provider=aws|hetzner`, and `lease=<cbx_...>` when they need a specific ref or a
|
|
378
|
+
pre-warmed Crabbox desktop.
|
|
379
|
+
|
|
380
|
+
ClawSweeper command examples:
|
|
381
|
+
|
|
382
|
+
```text
|
|
383
|
+
@clawsweeper mantis discord discord-status-reactions-tool-only
|
|
384
|
+
@clawsweeper verify e2e discord
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
The first command is explicit and scenario-focused. The second can later map a PR
|
|
388
|
+
or issue to recommended Mantis scenarios from labels, changed files, and
|
|
389
|
+
ClawSweeper review findings.
|
|
390
|
+
|
|
391
|
+
## Run lifecycle
|
|
392
|
+
|
|
393
|
+
1. Acquire credentials.
|
|
394
|
+
2. Allocate or reuse a VM.
|
|
395
|
+
3. Prepare the desktop/browser profile when the scenario needs UI evidence.
|
|
396
|
+
4. Prepare a clean checkout for the baseline ref.
|
|
397
|
+
5. Install dependencies and build only what the scenario needs.
|
|
398
|
+
6. Start a child Nodmix Gateway with an isolated state directory.
|
|
399
|
+
7. Configure the live transport, provider, model, and browser profile.
|
|
400
|
+
8. Run the scenario and capture baseline evidence.
|
|
401
|
+
9. Stop the gateway and preserve logs.
|
|
402
|
+
10. Prepare the candidate ref in the same VM.
|
|
403
|
+
11. Run the same scenario and capture candidate evidence.
|
|
404
|
+
12. Compare the oracle results and visual evidence.
|
|
405
|
+
13. Write Markdown, JSON, logs, screenshots, and optional trace artifacts.
|
|
406
|
+
14. Upload GitHub Actions artifacts.
|
|
407
|
+
15. Post a concise PR or Discord status message.
|
|
408
|
+
|
|
409
|
+
The scenario should be able to fail in two different ways:
|
|
410
|
+
|
|
411
|
+
- **Bug reproduced**: baseline failed in the expected way.
|
|
412
|
+
- **Harness failure**: environment setup, credentials, Discord API, browser, or
|
|
413
|
+
provider failed before the bug oracle was meaningful.
|
|
414
|
+
|
|
415
|
+
The final report must separate these cases so maintainers do not confuse a flaky
|
|
416
|
+
environment with product behavior.
|
|
417
|
+
|
|
418
|
+
## Discord MVP
|
|
419
|
+
|
|
420
|
+
The first scenario should target Discord status reactions in guild channels where
|
|
421
|
+
the source reply delivery mode is `message_tool_only`.
|
|
422
|
+
|
|
423
|
+
Why it is a good Mantis seed:
|
|
424
|
+
|
|
425
|
+
- It is visible in Discord as reactions on the triggering message.
|
|
426
|
+
- It has a strong REST oracle through Discord message reaction state.
|
|
427
|
+
- It exercises a real Nodmix Gateway, Discord bot auth, message dispatch,
|
|
428
|
+
source reply delivery mode, status reaction state, and model turn lifecycle.
|
|
429
|
+
- It is narrow enough to keep the first implementation honest.
|
|
430
|
+
|
|
431
|
+
Expected scenario shape:
|
|
432
|
+
|
|
433
|
+
```yaml
|
|
434
|
+
id: discord-status-reactions-tool-only
|
|
435
|
+
transport: discord
|
|
436
|
+
baseline:
|
|
437
|
+
expect:
|
|
438
|
+
reproduced: true
|
|
439
|
+
candidate:
|
|
440
|
+
expect:
|
|
441
|
+
fixed: true
|
|
442
|
+
config:
|
|
443
|
+
messages:
|
|
444
|
+
ackReaction: "👀"
|
|
445
|
+
ackReactionScope: "group-mentions"
|
|
446
|
+
groupChat:
|
|
447
|
+
visibleReplies: "message_tool"
|
|
448
|
+
statusReactions:
|
|
449
|
+
enabled: true
|
|
450
|
+
timing:
|
|
451
|
+
debounceMs: 0
|
|
452
|
+
discord:
|
|
453
|
+
requireMention: true
|
|
454
|
+
notifyChannel: operator-notify
|
|
455
|
+
evidence:
|
|
456
|
+
rest:
|
|
457
|
+
messageReactions: true
|
|
458
|
+
browser:
|
|
459
|
+
screenshotMessageRow: true
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
Baseline evidence should show the queued acknowledgement reaction but no
|
|
463
|
+
lifecycle transition in tool-only mode. Candidate evidence should show lifecycle
|
|
464
|
+
status reactions running when `messages.statusReactions.enabled` is explicitly
|
|
465
|
+
true.
|
|
466
|
+
|
|
467
|
+
The executable first slice is the opt-in Discord live QA scenario:
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
pnpm nodmix qa discord \
|
|
471
|
+
--scenario discord-status-reactions-tool-only \
|
|
472
|
+
--provider-mode live-frontier \
|
|
473
|
+
--model openai/gpt-5.4 \
|
|
474
|
+
--alt-model openai/gpt-5.4 \
|
|
475
|
+
--fast \
|
|
476
|
+
--output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
It configures the SUT with always-on guild handling, `visibleReplies:
|
|
480
|
+
"message_tool"`, `ackReaction: "👀"`, and explicit status reactions. The oracle
|
|
481
|
+
polls the real Discord triggering message and expects the observed sequence
|
|
482
|
+
`👀 -> 🤔 -> 👍`. Artifacts include `discord-qa-reaction-timelines.json`,
|
|
483
|
+
`discord-status-reactions-tool-only-timeline.html`, and
|
|
484
|
+
`discord-status-reactions-tool-only-timeline.png`.
|
|
485
|
+
|
|
486
|
+
## Existing QA pieces
|
|
487
|
+
|
|
488
|
+
Mantis should build on the existing private QA stack instead of starting from
|
|
489
|
+
zero:
|
|
490
|
+
|
|
491
|
+
- `pnpm nodmix qa discord` already runs a live Discord lane with driver and
|
|
492
|
+
SUT bots.
|
|
493
|
+
- The live transport runner already writes reports and observed-message
|
|
494
|
+
artifacts under `.artifacts/qa-e2e/`.
|
|
495
|
+
- Convex credential leases already provide exclusive access to shared live
|
|
496
|
+
transport credentials.
|
|
497
|
+
- The browser control service already supports screenshots, snapshots,
|
|
498
|
+
headless managed profiles, and remote CDP profiles.
|
|
499
|
+
- QA Lab already has a debugger UI and bus for transport-shaped testing.
|
|
500
|
+
|
|
501
|
+
The first Mantis implementation can be a thin before/after runner over these
|
|
502
|
+
pieces, plus one visual evidence layer.
|
|
503
|
+
|
|
504
|
+
## Evidence model
|
|
505
|
+
|
|
506
|
+
Every run writes a stable artifact directory:
|
|
507
|
+
|
|
508
|
+
```text
|
|
509
|
+
.artifacts/qa-e2e/mantis/<run-id>/
|
|
510
|
+
mantis-report.md
|
|
511
|
+
mantis-summary.json
|
|
512
|
+
baseline/
|
|
513
|
+
summary.json
|
|
514
|
+
discord-message.json
|
|
515
|
+
screenshot-message-row.png
|
|
516
|
+
gateway-debug/
|
|
517
|
+
candidate/
|
|
518
|
+
summary.json
|
|
519
|
+
discord-message.json
|
|
520
|
+
screenshot-message-row.png
|
|
521
|
+
gateway-debug/
|
|
522
|
+
comparison.json
|
|
523
|
+
run.log
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
`mantis-summary.json` should be the machine-readable source of truth. The
|
|
527
|
+
Markdown report is for PR comments and human review.
|
|
528
|
+
|
|
529
|
+
The summary must include:
|
|
530
|
+
|
|
531
|
+
- refs and SHAs tested
|
|
532
|
+
- transport and scenario id
|
|
533
|
+
- machine provider and machine id or lease id
|
|
534
|
+
- credential source without secret values
|
|
535
|
+
- baseline result
|
|
536
|
+
- candidate result
|
|
537
|
+
- whether the bug reproduced on baseline
|
|
538
|
+
- whether the candidate fixed it
|
|
539
|
+
- artifact paths
|
|
540
|
+
- sanitized setup or cleanup issues
|
|
541
|
+
|
|
542
|
+
Screenshots are evidence, not secrets. They still need redaction discipline:
|
|
543
|
+
private channel names, user names, or message content may appear. For public PRs,
|
|
544
|
+
prefer GitHub Actions artifact links over inline images until the redaction story
|
|
545
|
+
is stronger.
|
|
546
|
+
|
|
547
|
+
## Browser and VNC
|
|
548
|
+
|
|
549
|
+
The browser lane has two modes:
|
|
550
|
+
|
|
551
|
+
- **Headless automation**: default for CI. Chrome runs with CDP enabled, and
|
|
552
|
+
Playwright or Nodmix browser control captures screenshots.
|
|
553
|
+
- **VNC rescue**: enabled on the same VM when login, MFA, Discord anti-automation,
|
|
554
|
+
or visual debugging needs a human.
|
|
555
|
+
|
|
556
|
+
The Discord observer browser profile should be persistent enough to avoid
|
|
557
|
+
logging in for every run, but isolated from personal browser state. A profile
|
|
558
|
+
belongs to the Mantis machine pool, not to a developer laptop.
|
|
559
|
+
|
|
560
|
+
When Mantis gets stuck, it posts a Discord status message with:
|
|
561
|
+
|
|
562
|
+
- run id
|
|
563
|
+
- scenario id
|
|
564
|
+
- machine provider
|
|
565
|
+
- artifact directory
|
|
566
|
+
- VNC or noVNC connection instructions if available
|
|
567
|
+
- short blocker text
|
|
568
|
+
|
|
569
|
+
The first private deployment can post these messages to the existing operator
|
|
570
|
+
channel and move to a dedicated Mantis channel later.
|
|
571
|
+
|
|
572
|
+
## Machines
|
|
573
|
+
|
|
574
|
+
Mantis should prefer AWS through Crabbox for the first remote implementation.
|
|
575
|
+
Crabbox gives us warmed machines, lease tracking, hydration, logs, results, and
|
|
576
|
+
cleanup. If AWS capacity is too slow or unavailable, add a Hetzner provider
|
|
577
|
+
behind the same machine interface.
|
|
578
|
+
|
|
579
|
+
Minimum VM requirements:
|
|
580
|
+
|
|
581
|
+
- Linux with a desktop-capable Chrome or Chromium install
|
|
582
|
+
- CDP access for browser automation
|
|
583
|
+
- VNC or noVNC for rescue
|
|
584
|
+
- Node 22 and pnpm
|
|
585
|
+
- Nodmix checkout and dependency cache
|
|
586
|
+
- Playwright Chromium browser cache when Playwright is used
|
|
587
|
+
- enough CPU and memory for one Nodmix Gateway, one browser, and one model run
|
|
588
|
+
- outbound access to Discord, GitHub, model providers, and the credential broker
|
|
589
|
+
|
|
590
|
+
The VM should not keep long-lived raw secrets outside the expected credential or
|
|
591
|
+
browser profile stores.
|
|
592
|
+
|
|
593
|
+
## Secrets
|
|
594
|
+
|
|
595
|
+
Secrets live in GitHub organization or repository secrets for remote runs, and in
|
|
596
|
+
a local operator-controlled secret file for local runs.
|
|
597
|
+
|
|
598
|
+
Recommended secret names:
|
|
599
|
+
|
|
600
|
+
- `NODMIX_QA_DISCORD_MANTIS_BOT_TOKEN`
|
|
601
|
+
- `NODMIX_QA_DISCORD_DRIVER_BOT_TOKEN`
|
|
602
|
+
- `NODMIX_QA_DISCORD_SUT_BOT_TOKEN`
|
|
603
|
+
- `NODMIX_QA_DISCORD_GUILD_ID`
|
|
604
|
+
- `NODMIX_QA_DISCORD_CHANNEL_ID`
|
|
605
|
+
- `NODMIX_QA_DISCORD_NOTIFY_CHANNEL_ID`
|
|
606
|
+
- `NODMIX_QA_REDACT_PUBLIC_METADATA=1` for public GitHub artifact uploads
|
|
607
|
+
- `NODMIX_QA_CONVEX_SITE_URL`
|
|
608
|
+
- `NODMIX_QA_CONVEX_SECRET_CI`
|
|
609
|
+
- `NODMIX_QA_MANTIS_CRABBOX_COORDINATOR`
|
|
610
|
+
- `NODMIX_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN`
|
|
611
|
+
|
|
612
|
+
Long term, the Convex credential pool should remain the normal source for live
|
|
613
|
+
transport credentials. GitHub secrets bootstrap the broker and fallback lanes.
|
|
614
|
+
The Discord status-reactions workflow maps the Mantis Crabbox secrets back to
|
|
615
|
+
the `CRABBOX_COORDINATOR` and `CRABBOX_COORDINATOR_TOKEN` environment variables
|
|
616
|
+
that the Crabbox CLI expects. The plain `CRABBOX_*` GitHub secret names remain
|
|
617
|
+
accepted as a compatibility fallback.
|
|
618
|
+
|
|
619
|
+
The Mantis runner must never print:
|
|
620
|
+
|
|
621
|
+
- Discord bot tokens
|
|
622
|
+
- provider API keys
|
|
623
|
+
- browser cookies
|
|
624
|
+
- auth profile contents
|
|
625
|
+
- VNC passwords
|
|
626
|
+
- raw credential payloads
|
|
627
|
+
|
|
628
|
+
Public artifact uploads should also redact Discord target metadata such as bot,
|
|
629
|
+
guild, channel, and message ids. The GitHub smoke workflow enables
|
|
630
|
+
`NODMIX_QA_REDACT_PUBLIC_METADATA=1` for this reason.
|
|
631
|
+
|
|
632
|
+
If a token is accidentally pasted into an issue, PR, chat, or log, rotate it
|
|
633
|
+
after the new secret has been stored.
|
|
634
|
+
|
|
635
|
+
## GitHub artifacts and PR comments
|
|
636
|
+
|
|
637
|
+
Mantis workflows should upload the full evidence bundle as a short-lived Actions
|
|
638
|
+
artifact. When the workflow is run for a bug report or fix PR, it should also
|
|
639
|
+
publish redacted inline media to the configured Mantis R2/S3 bucket and upsert a
|
|
640
|
+
comment on that bug or fix PR with inline before/after screenshots. Do not post
|
|
641
|
+
the primary proof only on a generic QA automation PR. Raw logs, observed
|
|
642
|
+
messages, and other bulky evidence stay in the Actions artifact.
|
|
643
|
+
|
|
644
|
+
Production workflows should post those comments with the Mantis GitHub App, not
|
|
645
|
+
with `github-actions[bot]`. Store the app id and private key as
|
|
646
|
+
`MANTIS_GITHUB_APP_ID` and `MANTIS_GITHUB_APP_PRIVATE_KEY` GitHub Actions
|
|
647
|
+
secrets. The workflow uses a hidden marker as the upsert key, updates that
|
|
648
|
+
comment when the token can edit it, and creates a new Mantis-owned comment when
|
|
649
|
+
an older bot-owned marker cannot be edited.
|
|
650
|
+
|
|
651
|
+
The PR comment should be short and visual:
|
|
652
|
+
|
|
653
|
+
```md
|
|
654
|
+
Mantis Discord Status Reactions QA
|
|
655
|
+
|
|
656
|
+
Summary: Mantis reran the reported Discord status-reaction bug against the known
|
|
657
|
+
bad baseline and the candidate fix. The baseline reproduced the bug, while the
|
|
658
|
+
candidate showed the expected queued -> thinking -> done sequence.
|
|
659
|
+
|
|
660
|
+
- Scenario: `discord-status-reactions-tool-only`
|
|
661
|
+
- Run: <workflow run link>
|
|
662
|
+
- Artifact: <artifact link>
|
|
663
|
+
- Baseline: `<status>` at `<sha>`
|
|
664
|
+
- Candidate: `<status>` at `<sha>`
|
|
665
|
+
|
|
666
|
+
| Baseline | Candidate |
|
|
667
|
+
| ------------------- | ------------------- |
|
|
668
|
+
| <inline screenshot> | <inline screenshot> |
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
When the run fails because the harness failed, the comment must say that instead
|
|
672
|
+
of implying the candidate failed.
|
|
673
|
+
|
|
674
|
+
## Private deployment notes
|
|
675
|
+
|
|
676
|
+
A private deployment may already have a Mantis Discord application. Reuse that
|
|
677
|
+
application instead of creating another app when it has the right bot
|
|
678
|
+
permissions and can be safely rotated.
|
|
679
|
+
|
|
680
|
+
Set the initial operator notification channel through secrets or deployment
|
|
681
|
+
configuration. It can point at an existing maintainer or operations channel
|
|
682
|
+
first, then move to a dedicated Mantis channel once one exists.
|
|
683
|
+
|
|
684
|
+
Do not put guild ids, channel ids, bot tokens, browser cookies, or VNC passwords
|
|
685
|
+
in this document. Store them in GitHub secrets, the credential broker, or the
|
|
686
|
+
operator's local secret store.
|
|
687
|
+
|
|
688
|
+
## Adding a scenario
|
|
689
|
+
|
|
690
|
+
A Mantis scenario should declare:
|
|
691
|
+
|
|
692
|
+
- id and title
|
|
693
|
+
- transport
|
|
694
|
+
- required credentials
|
|
695
|
+
- baseline ref policy
|
|
696
|
+
- candidate ref policy
|
|
697
|
+
- Nodmix config patch
|
|
698
|
+
- setup steps
|
|
699
|
+
- stimulus
|
|
700
|
+
- expected baseline oracle
|
|
701
|
+
- expected candidate oracle
|
|
702
|
+
- visual capture targets
|
|
703
|
+
- timeout budget
|
|
704
|
+
- cleanup steps
|
|
705
|
+
|
|
706
|
+
Scenarios should prefer small, typed oracles:
|
|
707
|
+
|
|
708
|
+
- Discord reaction state for reaction bugs
|
|
709
|
+
- Discord message references for threading bugs
|
|
710
|
+
- Slack thread ts and reaction API state for Slack bugs
|
|
711
|
+
- email message ids and headers for email bugs
|
|
712
|
+
- browser screenshots when UI is the only reliable observable
|
|
713
|
+
|
|
714
|
+
Vision checks should be additive. If a platform API can prove the bug, use the
|
|
715
|
+
API as the pass/fail oracle and keep screenshots for human confidence.
|
|
716
|
+
|
|
717
|
+
## Provider expansion
|
|
718
|
+
|
|
719
|
+
After Discord, the same runner can add:
|
|
720
|
+
|
|
721
|
+
- Slack: reactions, threads, app mentions, modals, file uploads.
|
|
722
|
+
- Email: Gmail auth and message threading using `gog` where connectors are not
|
|
723
|
+
enough.
|
|
724
|
+
- WhatsApp: QR login, re-identification, message delivery, media, reactions.
|
|
725
|
+
- Telegram: group mention gating, commands, reactions where available.
|
|
726
|
+
- Matrix: encrypted rooms, thread or reply relations, restart resume.
|
|
727
|
+
|
|
728
|
+
Each transport should have one cheap smoke scenario and one or more bug-class
|
|
729
|
+
scenarios. Expensive visual scenarios should stay opt-in.
|
|
730
|
+
|
|
731
|
+
## Open questions
|
|
732
|
+
|
|
733
|
+
- Which Discord bot should be the driver, and which should be the SUT, when the
|
|
734
|
+
existing Mantis bot is reused?
|
|
735
|
+
- Should the observer browser login use a human Discord account, a test account,
|
|
736
|
+
or only bot-readable REST evidence for the first phase?
|
|
737
|
+
- How long should GitHub retain Mantis artifacts for PRs?
|
|
738
|
+
- When should ClawSweeper automatically recommend Mantis instead of waiting for a
|
|
739
|
+
maintainer command?
|
|
740
|
+
- Should screenshots be redacted or cropped before upload for public PRs?
|