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,319 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Summarize CodexBar local cost usage by model.
|
|
4
|
+
|
|
5
|
+
Defaults to current model (most recent daily entry), or list all models.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import json
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
from datetime import date, datetime, timedelta
|
|
16
|
+
from typing import Any, Dict, Iterable, List, Optional, Tuple
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def positive_int(value: str) -> int:
|
|
20
|
+
try:
|
|
21
|
+
parsed = int(value)
|
|
22
|
+
except ValueError as exc:
|
|
23
|
+
raise argparse.ArgumentTypeError("must be an integer") from exc
|
|
24
|
+
if parsed < 1:
|
|
25
|
+
raise argparse.ArgumentTypeError("must be >= 1")
|
|
26
|
+
return parsed
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def eprint(msg: str) -> None:
|
|
30
|
+
print(msg, file=sys.stderr)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def run_codexbar_cost(provider: str) -> List[Dict[str, Any]]:
|
|
34
|
+
cmd = ["codexbar", "cost", "--format", "json", "--provider", provider]
|
|
35
|
+
try:
|
|
36
|
+
output = subprocess.check_output(cmd, text=True)
|
|
37
|
+
except FileNotFoundError:
|
|
38
|
+
raise RuntimeError("codexbar not found on PATH. Install CodexBar CLI first.")
|
|
39
|
+
except subprocess.CalledProcessError as exc:
|
|
40
|
+
raise RuntimeError(f"codexbar cost failed (exit {exc.returncode}).")
|
|
41
|
+
try:
|
|
42
|
+
payload = json.loads(output)
|
|
43
|
+
except json.JSONDecodeError as exc:
|
|
44
|
+
raise RuntimeError(f"Failed to parse codexbar JSON output: {exc}")
|
|
45
|
+
if not isinstance(payload, list):
|
|
46
|
+
raise RuntimeError("Expected codexbar cost JSON array.")
|
|
47
|
+
return payload
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def load_payload(input_path: Optional[str], provider: str) -> Dict[str, Any]:
|
|
51
|
+
if input_path:
|
|
52
|
+
if input_path == "-":
|
|
53
|
+
raw = sys.stdin.read()
|
|
54
|
+
else:
|
|
55
|
+
with open(input_path, "r", encoding="utf-8") as handle:
|
|
56
|
+
raw = handle.read()
|
|
57
|
+
data = json.loads(raw)
|
|
58
|
+
else:
|
|
59
|
+
data = run_codexbar_cost(provider)
|
|
60
|
+
|
|
61
|
+
if isinstance(data, dict):
|
|
62
|
+
return data
|
|
63
|
+
|
|
64
|
+
if isinstance(data, list):
|
|
65
|
+
for entry in data:
|
|
66
|
+
if isinstance(entry, dict) and entry.get("provider") == provider:
|
|
67
|
+
return entry
|
|
68
|
+
raise RuntimeError(f"Provider '{provider}' not found in codexbar payload.")
|
|
69
|
+
|
|
70
|
+
raise RuntimeError("Unsupported JSON input format.")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass
|
|
74
|
+
class ModelCost:
|
|
75
|
+
model: str
|
|
76
|
+
cost: float
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def parse_daily_entries(payload: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
80
|
+
daily = payload.get("daily")
|
|
81
|
+
if not daily:
|
|
82
|
+
return []
|
|
83
|
+
if not isinstance(daily, list):
|
|
84
|
+
return []
|
|
85
|
+
return [entry for entry in daily if isinstance(entry, dict)]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def parse_date(value: str) -> Optional[date]:
|
|
89
|
+
try:
|
|
90
|
+
return datetime.strptime(value, "%Y-%m-%d").date()
|
|
91
|
+
except Exception:
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def filter_by_days(entries: List[Dict[str, Any]], days: Optional[int]) -> List[Dict[str, Any]]:
|
|
96
|
+
if not days:
|
|
97
|
+
return entries
|
|
98
|
+
cutoff = date.today() - timedelta(days=days - 1)
|
|
99
|
+
filtered: List[Dict[str, Any]] = []
|
|
100
|
+
for entry in entries:
|
|
101
|
+
day = entry.get("date")
|
|
102
|
+
if not isinstance(day, str):
|
|
103
|
+
continue
|
|
104
|
+
parsed = parse_date(day)
|
|
105
|
+
if parsed and parsed >= cutoff:
|
|
106
|
+
filtered.append(entry)
|
|
107
|
+
return filtered
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def aggregate_costs(entries: Iterable[Dict[str, Any]]) -> Dict[str, float]:
|
|
111
|
+
totals: Dict[str, float] = {}
|
|
112
|
+
for entry in entries:
|
|
113
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
114
|
+
if not breakdowns:
|
|
115
|
+
continue
|
|
116
|
+
if not isinstance(breakdowns, list):
|
|
117
|
+
continue
|
|
118
|
+
for item in breakdowns:
|
|
119
|
+
if not isinstance(item, dict):
|
|
120
|
+
continue
|
|
121
|
+
model = item.get("modelName")
|
|
122
|
+
cost = item.get("cost")
|
|
123
|
+
if not isinstance(model, str):
|
|
124
|
+
continue
|
|
125
|
+
if not isinstance(cost, (int, float)):
|
|
126
|
+
continue
|
|
127
|
+
totals[model] = totals.get(model, 0.0) + float(cost)
|
|
128
|
+
return totals
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def pick_current_model(entries: List[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str]]:
|
|
132
|
+
if not entries:
|
|
133
|
+
return None, None
|
|
134
|
+
sorted_entries = sorted(
|
|
135
|
+
entries,
|
|
136
|
+
key=lambda entry: entry.get("date") or "",
|
|
137
|
+
)
|
|
138
|
+
for entry in reversed(sorted_entries):
|
|
139
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
140
|
+
if isinstance(breakdowns, list) and breakdowns:
|
|
141
|
+
scored: List[ModelCost] = []
|
|
142
|
+
for item in breakdowns:
|
|
143
|
+
if not isinstance(item, dict):
|
|
144
|
+
continue
|
|
145
|
+
model = item.get("modelName")
|
|
146
|
+
cost = item.get("cost")
|
|
147
|
+
if isinstance(model, str) and isinstance(cost, (int, float)):
|
|
148
|
+
scored.append(ModelCost(model=model, cost=float(cost)))
|
|
149
|
+
if scored:
|
|
150
|
+
scored.sort(key=lambda item: item.cost, reverse=True)
|
|
151
|
+
return scored[0].model, entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
152
|
+
models_used = entry.get("modelsUsed")
|
|
153
|
+
if isinstance(models_used, list) and models_used:
|
|
154
|
+
last = models_used[-1]
|
|
155
|
+
if isinstance(last, str):
|
|
156
|
+
return last, entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
157
|
+
return None, None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def usd(value: Optional[float]) -> str:
|
|
161
|
+
if value is None:
|
|
162
|
+
return "—"
|
|
163
|
+
return f"${value:,.2f}"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def latest_day_cost(entries: List[Dict[str, Any]], model: str) -> Tuple[Optional[str], Optional[float]]:
|
|
167
|
+
if not entries:
|
|
168
|
+
return None, None
|
|
169
|
+
sorted_entries = sorted(
|
|
170
|
+
entries,
|
|
171
|
+
key=lambda entry: entry.get("date") or "",
|
|
172
|
+
)
|
|
173
|
+
for entry in reversed(sorted_entries):
|
|
174
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
175
|
+
if not isinstance(breakdowns, list):
|
|
176
|
+
continue
|
|
177
|
+
for item in breakdowns:
|
|
178
|
+
if not isinstance(item, dict):
|
|
179
|
+
continue
|
|
180
|
+
if item.get("modelName") == model:
|
|
181
|
+
cost = item.get("cost") if isinstance(item.get("cost"), (int, float)) else None
|
|
182
|
+
day = entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
183
|
+
return day, float(cost) if cost is not None else None
|
|
184
|
+
return None, None
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def render_text_current(
|
|
188
|
+
provider: str,
|
|
189
|
+
model: str,
|
|
190
|
+
latest_date: Optional[str],
|
|
191
|
+
total_cost: Optional[float],
|
|
192
|
+
latest_cost: Optional[float],
|
|
193
|
+
latest_cost_date: Optional[str],
|
|
194
|
+
entry_count: int,
|
|
195
|
+
) -> str:
|
|
196
|
+
lines = [f"Provider: {provider}", f"Current model: {model}"]
|
|
197
|
+
if latest_date:
|
|
198
|
+
lines.append(f"Latest model date: {latest_date}")
|
|
199
|
+
lines.append(f"Total cost (rows): {usd(total_cost)}")
|
|
200
|
+
if latest_cost_date:
|
|
201
|
+
lines.append(f"Latest day cost: {usd(latest_cost)} ({latest_cost_date})")
|
|
202
|
+
lines.append(f"Daily rows: {entry_count}")
|
|
203
|
+
return "\n".join(lines)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def render_text_all(provider: str, totals: Dict[str, float]) -> str:
|
|
207
|
+
lines = [f"Provider: {provider}", "Models:"]
|
|
208
|
+
for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True):
|
|
209
|
+
lines.append(f"- {model}: {usd(cost)}")
|
|
210
|
+
return "\n".join(lines)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def build_json_current(
|
|
214
|
+
provider: str,
|
|
215
|
+
model: str,
|
|
216
|
+
latest_date: Optional[str],
|
|
217
|
+
total_cost: Optional[float],
|
|
218
|
+
latest_cost: Optional[float],
|
|
219
|
+
latest_cost_date: Optional[str],
|
|
220
|
+
entry_count: int,
|
|
221
|
+
) -> Dict[str, Any]:
|
|
222
|
+
return {
|
|
223
|
+
"provider": provider,
|
|
224
|
+
"mode": "current",
|
|
225
|
+
"model": model,
|
|
226
|
+
"latestModelDate": latest_date,
|
|
227
|
+
"totalCostUSD": total_cost,
|
|
228
|
+
"latestDayCostUSD": latest_cost,
|
|
229
|
+
"latestDayCostDate": latest_cost_date,
|
|
230
|
+
"dailyRowCount": entry_count,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def build_json_all(provider: str, totals: Dict[str, float]) -> Dict[str, Any]:
|
|
235
|
+
return {
|
|
236
|
+
"provider": provider,
|
|
237
|
+
"mode": "all",
|
|
238
|
+
"models": [
|
|
239
|
+
{"model": model, "totalCostUSD": cost}
|
|
240
|
+
for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True)
|
|
241
|
+
],
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def main() -> int:
|
|
246
|
+
parser = argparse.ArgumentParser(description="Summarize CodexBar model usage from local cost logs.")
|
|
247
|
+
parser.add_argument("--provider", choices=["codex", "claude"], default="codex")
|
|
248
|
+
parser.add_argument("--mode", choices=["current", "all"], default="current")
|
|
249
|
+
parser.add_argument("--model", help="Explicit model name to report instead of auto-current.")
|
|
250
|
+
parser.add_argument("--input", help="Path to codexbar cost JSON (or '-' for stdin).")
|
|
251
|
+
parser.add_argument("--days", type=positive_int, help="Limit to last N days (based on daily rows).")
|
|
252
|
+
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
253
|
+
parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON output.")
|
|
254
|
+
|
|
255
|
+
args = parser.parse_args()
|
|
256
|
+
|
|
257
|
+
try:
|
|
258
|
+
payload = load_payload(args.input, args.provider)
|
|
259
|
+
except Exception as exc:
|
|
260
|
+
eprint(str(exc))
|
|
261
|
+
return 1
|
|
262
|
+
|
|
263
|
+
entries = parse_daily_entries(payload)
|
|
264
|
+
entries = filter_by_days(entries, args.days)
|
|
265
|
+
|
|
266
|
+
if args.mode == "current":
|
|
267
|
+
model = args.model
|
|
268
|
+
latest_date = None
|
|
269
|
+
if not model:
|
|
270
|
+
model, latest_date = pick_current_model(entries)
|
|
271
|
+
if not model:
|
|
272
|
+
eprint("No model data found in codexbar cost payload.")
|
|
273
|
+
return 2
|
|
274
|
+
totals = aggregate_costs(entries)
|
|
275
|
+
total_cost = totals.get(model)
|
|
276
|
+
latest_cost_date, latest_cost = latest_day_cost(entries, model)
|
|
277
|
+
|
|
278
|
+
if args.format == "json":
|
|
279
|
+
payload_out = build_json_current(
|
|
280
|
+
provider=args.provider,
|
|
281
|
+
model=model,
|
|
282
|
+
latest_date=latest_date,
|
|
283
|
+
total_cost=total_cost,
|
|
284
|
+
latest_cost=latest_cost,
|
|
285
|
+
latest_cost_date=latest_cost_date,
|
|
286
|
+
entry_count=len(entries),
|
|
287
|
+
)
|
|
288
|
+
indent = 2 if args.pretty else None
|
|
289
|
+
print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
|
|
290
|
+
else:
|
|
291
|
+
print(
|
|
292
|
+
render_text_current(
|
|
293
|
+
provider=args.provider,
|
|
294
|
+
model=model,
|
|
295
|
+
latest_date=latest_date,
|
|
296
|
+
total_cost=total_cost,
|
|
297
|
+
latest_cost=latest_cost,
|
|
298
|
+
latest_cost_date=latest_cost_date,
|
|
299
|
+
entry_count=len(entries),
|
|
300
|
+
)
|
|
301
|
+
)
|
|
302
|
+
return 0
|
|
303
|
+
|
|
304
|
+
totals = aggregate_costs(entries)
|
|
305
|
+
if not totals:
|
|
306
|
+
eprint("No model breakdowns found in codexbar cost payload.")
|
|
307
|
+
return 2
|
|
308
|
+
|
|
309
|
+
if args.format == "json":
|
|
310
|
+
payload_out = build_json_all(provider=args.provider, totals=totals)
|
|
311
|
+
indent = 2 if args.pretty else None
|
|
312
|
+
print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
|
|
313
|
+
else:
|
|
314
|
+
print(render_text_all(provider=args.provider, totals=totals))
|
|
315
|
+
return 0
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
if __name__ == "__main__":
|
|
319
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Tests for model_usage helpers.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
from datetime import date, timedelta
|
|
8
|
+
from unittest import TestCase, main
|
|
9
|
+
|
|
10
|
+
from model_usage import filter_by_days, positive_int
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestModelUsage(TestCase):
|
|
14
|
+
def test_positive_int_accepts_valid_numbers(self):
|
|
15
|
+
self.assertEqual(positive_int("1"), 1)
|
|
16
|
+
self.assertEqual(positive_int("7"), 7)
|
|
17
|
+
|
|
18
|
+
def test_positive_int_rejects_zero_and_negative(self):
|
|
19
|
+
with self.assertRaises(argparse.ArgumentTypeError):
|
|
20
|
+
positive_int("0")
|
|
21
|
+
with self.assertRaises(argparse.ArgumentTypeError):
|
|
22
|
+
positive_int("-3")
|
|
23
|
+
|
|
24
|
+
def test_filter_by_days_keeps_recent_entries(self):
|
|
25
|
+
today = date.today()
|
|
26
|
+
entries = [
|
|
27
|
+
{"date": (today - timedelta(days=5)).strftime("%Y-%m-%d"), "modelBreakdowns": []},
|
|
28
|
+
{"date": (today - timedelta(days=1)).strftime("%Y-%m-%d"), "modelBreakdowns": []},
|
|
29
|
+
{"date": today.strftime("%Y-%m-%d"), "modelBreakdowns": []},
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
filtered = filter_by_days(entries, 2)
|
|
33
|
+
|
|
34
|
+
self.assertEqual(len(filtered), 2)
|
|
35
|
+
self.assertEqual(filtered[0]["date"], (today - timedelta(days=1)).strftime("%Y-%m-%d"))
|
|
36
|
+
self.assertEqual(filtered[1]["date"], today.strftime("%Y-%m-%d"))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
if __name__ == "__main__":
|
|
40
|
+
main()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-pdf
|
|
3
|
+
description: "Edit PDFs with natural-language instructions using the nano-pdf CLI."
|
|
4
|
+
homepage: https://pypi.org/project/nano-pdf/
|
|
5
|
+
metadata:
|
|
6
|
+
{
|
|
7
|
+
"nodmix":
|
|
8
|
+
{
|
|
9
|
+
"emoji": "📄",
|
|
10
|
+
"requires": { "bins": ["nano-pdf"] },
|
|
11
|
+
"install":
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "uv",
|
|
15
|
+
"kind": "uv",
|
|
16
|
+
"package": "nano-pdf",
|
|
17
|
+
"bins": ["nano-pdf"],
|
|
18
|
+
"label": "Install nano-pdf (uv)",
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# nano-pdf
|
|
26
|
+
|
|
27
|
+
Use `nano-pdf` to apply edits to a specific page in a PDF using a natural-language instruction.
|
|
28
|
+
|
|
29
|
+
## Quick start
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
nano-pdf edit deck.pdf 1 "Change the title to 'Q3 Results' and fix the typo in the subtitle"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Notes:
|
|
36
|
+
|
|
37
|
+
- Page numbers are 0-based or 1-based depending on the tool's version/config; if the result looks off by one, retry with the other.
|
|
38
|
+
- Always sanity-check the output PDF before sending it out.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: node-connect
|
|
3
|
+
description: "Diagnose Nodmix Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Node Connect
|
|
7
|
+
|
|
8
|
+
Goal: find the one real route from node -> gateway, verify Nodmix is advertising that route, then fix pairing/auth.
|
|
9
|
+
|
|
10
|
+
## Topology first
|
|
11
|
+
|
|
12
|
+
Decide which case you are in before proposing fixes:
|
|
13
|
+
|
|
14
|
+
- same machine / emulator / USB tunnel
|
|
15
|
+
- same LAN / local Wi-Fi
|
|
16
|
+
- same Tailscale tailnet
|
|
17
|
+
- public URL / reverse proxy
|
|
18
|
+
|
|
19
|
+
Do not mix them.
|
|
20
|
+
|
|
21
|
+
- Local Wi-Fi problem: do not switch to Tailscale unless remote access is actually needed.
|
|
22
|
+
- VPS / remote gateway problem: do not keep debugging `localhost` or LAN IPs.
|
|
23
|
+
|
|
24
|
+
## If ambiguous, ask first
|
|
25
|
+
|
|
26
|
+
If the setup is unclear or the failure report is vague, ask short clarifying questions before diagnosing.
|
|
27
|
+
|
|
28
|
+
Ask for:
|
|
29
|
+
|
|
30
|
+
- which route they intend: same machine, same LAN, Tailscale tailnet, or public URL
|
|
31
|
+
- whether they used QR/setup code or manual host/port
|
|
32
|
+
- the exact app text/status/error, quoted exactly if possible
|
|
33
|
+
- whether `nodmix devices list` shows a pending pairing request
|
|
34
|
+
|
|
35
|
+
Do not guess from `can't connect`.
|
|
36
|
+
|
|
37
|
+
## Canonical checks
|
|
38
|
+
|
|
39
|
+
Prefer `nodmix qr --json`. It uses the same setup-code payload Android scans.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
nodmix config get gateway.mode
|
|
43
|
+
nodmix config get gateway.bind
|
|
44
|
+
nodmix config get gateway.tailscale.mode
|
|
45
|
+
nodmix config get gateway.remote.url
|
|
46
|
+
nodmix config get gateway.auth.mode
|
|
47
|
+
nodmix config get gateway.auth.allowTailscale
|
|
48
|
+
nodmix config get plugins.entries.device-pair.config.publicUrl
|
|
49
|
+
nodmix qr --json
|
|
50
|
+
nodmix devices list
|
|
51
|
+
nodmix nodes status
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
If this Nodmix instance is pointed at a remote gateway, also run:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
nodmix qr --remote --json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
If Tailscale is part of the story:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
tailscale status --json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Read the result, not guesses
|
|
67
|
+
|
|
68
|
+
`nodmix qr --json` success means:
|
|
69
|
+
|
|
70
|
+
- `gatewayUrl`: this is the actual endpoint the app should use.
|
|
71
|
+
- `urlSource`: this tells you which config path won.
|
|
72
|
+
|
|
73
|
+
Common good sources:
|
|
74
|
+
|
|
75
|
+
- `gateway.bind=lan`: same Wi-Fi / LAN only
|
|
76
|
+
- `gateway.bind=tailnet`: direct tailnet access
|
|
77
|
+
- `gateway.tailscale.mode=serve` or `gateway.tailscale.mode=funnel`: Tailscale route
|
|
78
|
+
- `plugins.entries.device-pair.config.publicUrl`: explicit public/reverse-proxy route
|
|
79
|
+
- `gateway.remote.url`: remote gateway route
|
|
80
|
+
|
|
81
|
+
## Root-cause map
|
|
82
|
+
|
|
83
|
+
If `nodmix qr --json` says `Gateway is only bound to loopback`:
|
|
84
|
+
|
|
85
|
+
- remote node cannot connect yet
|
|
86
|
+
- fix the route, then generate a fresh setup code
|
|
87
|
+
- `gateway.bind=auto` is not enough if the effective QR route is still loopback
|
|
88
|
+
- same LAN: use `gateway.bind=lan`
|
|
89
|
+
- same tailnet: prefer `gateway.tailscale.mode=serve` or use `gateway.bind=tailnet`
|
|
90
|
+
- public internet: set a real `plugins.entries.device-pair.config.publicUrl` or `gateway.remote.url`
|
|
91
|
+
|
|
92
|
+
If `gateway.bind=tailnet set, but no tailnet IP was found`:
|
|
93
|
+
|
|
94
|
+
- gateway host is not actually on Tailscale
|
|
95
|
+
|
|
96
|
+
If `qr --remote requires gateway.remote.url`:
|
|
97
|
+
|
|
98
|
+
- remote-mode config is incomplete
|
|
99
|
+
|
|
100
|
+
If the app says `pairing required`:
|
|
101
|
+
|
|
102
|
+
- network route and auth worked
|
|
103
|
+
- approve the pending device
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
nodmix devices list
|
|
107
|
+
nodmix devices approve --latest
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
If the app says `bootstrap token invalid or expired`:
|
|
111
|
+
|
|
112
|
+
- old setup code
|
|
113
|
+
- generate a fresh one and rescan
|
|
114
|
+
- do this after any URL/auth fix too
|
|
115
|
+
|
|
116
|
+
If the app says `unauthorized`:
|
|
117
|
+
|
|
118
|
+
- wrong token/password, or wrong Tailscale expectation
|
|
119
|
+
- for Tailscale Serve, `gateway.auth.allowTailscale` must match the intended flow
|
|
120
|
+
- otherwise use explicit token/password
|
|
121
|
+
|
|
122
|
+
## Fast heuristics
|
|
123
|
+
|
|
124
|
+
- Same Wi-Fi setup + gateway advertises `127.0.0.1`, `localhost`, or loopback-only config: wrong.
|
|
125
|
+
- Remote setup + setup/manual uses private LAN IP: wrong.
|
|
126
|
+
- Tailnet setup + gateway advertises LAN IP instead of MagicDNS / tailnet route: wrong.
|
|
127
|
+
- Public URL set but QR still advertises something else: inspect `urlSource`; config is not what you think.
|
|
128
|
+
- `nodmix devices list` shows pending requests: stop changing network config and approve first.
|
|
129
|
+
|
|
130
|
+
## Fix style
|
|
131
|
+
|
|
132
|
+
Reply with one concrete diagnosis and one route.
|
|
133
|
+
|
|
134
|
+
If there is not enough signal yet, ask for setup + exact app text instead of guessing.
|
|
135
|
+
|
|
136
|
+
Good:
|
|
137
|
+
|
|
138
|
+
- `The gateway is still loopback-only, so a node on another network can never reach it. Enable Tailscale Serve, restart the gateway, run nodmix qr again, rescan, then approve the pending device pairing.`
|
|
139
|
+
|
|
140
|
+
Bad:
|
|
141
|
+
|
|
142
|
+
- `Maybe LAN, maybe Tailscale, maybe port forwarding, maybe public URL.`
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: node-inspect-debugger
|
|
3
|
+
description: Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.
|
|
4
|
+
metadata: { "nodmix": { "emoji": "🪲", "requires": { "bins": ["node"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Node Inspect Debugger
|
|
8
|
+
|
|
9
|
+
Use for Node.js debugging that needs inspector access: hidden locals, async hangs, flaky tests, child processes, startup races, memory growth, or CPU hot paths.
|
|
10
|
+
|
|
11
|
+
Default to `node inspect` first. Use Chrome DevTools Protocol only when you need scripted breakpoints, automated state capture, heap snapshots, or CPU profiles.
|
|
12
|
+
|
|
13
|
+
Quick start
|
|
14
|
+
|
|
15
|
+
- Pause on entry: `node inspect path/to/script.js`
|
|
16
|
+
- TypeScript: `node --inspect-brk --import tsx path/to/script.ts`
|
|
17
|
+
- Existing PID: `kill -SIGUSR1 <pid>` then `node inspect -p <pid>`
|
|
18
|
+
- Inspect target list: `curl -s http://127.0.0.1:9229/json/list | jq`
|
|
19
|
+
- Nodmix CLI path: `node --inspect-brk nodmix.mjs ...`
|
|
20
|
+
- Nodmix test path: `NODMIX_VITEST_MAX_WORKERS=1 node --inspect-brk scripts/run-vitest.mjs <file>`
|
|
21
|
+
|
|
22
|
+
Debugger REPL
|
|
23
|
+
|
|
24
|
+
- Continue/step: `cont`, `next`, `step`, `out`, `pause`
|
|
25
|
+
- Breakpoints: `sb('file.js', 42)`, `sb(42)`, `sb('functionName')`, `breakpoints`, `cb('file.js', 42)`
|
|
26
|
+
- Inspect: `bt`, `list(8)`, `watch('expr')`, `exec expr`
|
|
27
|
+
- Current scope: `repl`, then evaluate locals directly; `Ctrl+C` exits repl mode.
|
|
28
|
+
- Exit safely: `cont` before quitting if the process should continue; otherwise `kill`.
|
|
29
|
+
|
|
30
|
+
Nodmix tips
|
|
31
|
+
|
|
32
|
+
- Prefer `127.0.0.1` inspector binds. Do not expose `--inspect=0.0.0.0` unless the network is isolated.
|
|
33
|
+
- For Vitest, debug one file with one worker. Avoid worker pools while stepping.
|
|
34
|
+
- For TS source breakpoints, use `--enable-source-maps` when useful; `node inspect` can still show emitted paths.
|
|
35
|
+
- For child processes, `NODE_OPTIONS=--inspect-brk` can propagate the inspector, but each child needs its own port.
|
|
36
|
+
- For long-lived gateway or dev processes, attach by PID after confirming the target with `/json/list`.
|
|
37
|
+
|
|
38
|
+
Programmatic CDP
|
|
39
|
+
|
|
40
|
+
Install tooling outside the repo unless the project already depends on it:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
mkdir -p /tmp/cdp-tools
|
|
44
|
+
npm --prefix /tmp/cdp-tools i chrome-remote-interface
|
|
45
|
+
NODE_PATH=/tmp/cdp-tools/node_modules node /tmp/cdp-debug.cjs
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Minimal driver:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
const CDP = require("chrome-remote-interface");
|
|
52
|
+
|
|
53
|
+
(async () => {
|
|
54
|
+
const client = await CDP({ port: 9229 });
|
|
55
|
+
const { Debugger, Runtime } = client;
|
|
56
|
+
|
|
57
|
+
Debugger.paused(async ({ callFrames, reason }) => {
|
|
58
|
+
const top = callFrames[0];
|
|
59
|
+
console.log("paused", reason, top.url, top.location.lineNumber + 1);
|
|
60
|
+
const { result } = await Debugger.evaluateOnCallFrame({
|
|
61
|
+
callFrameId: top.callFrameId,
|
|
62
|
+
expression: "JSON.stringify({ pid: process.pid })",
|
|
63
|
+
});
|
|
64
|
+
console.log(result.value ?? result.description);
|
|
65
|
+
await Debugger.resume();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await Runtime.enable();
|
|
69
|
+
await Debugger.enable();
|
|
70
|
+
await Debugger.setBreakpointByUrl({ urlRegex: ".*target\\.js$", lineNumber: 41 });
|
|
71
|
+
await Runtime.runIfWaitingForDebugger();
|
|
72
|
+
})();
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Profiles
|
|
76
|
+
|
|
77
|
+
- CPU: enable `Profiler`, `start`, wait, `stop`, write `/tmp/profile.cpuprofile`, open in Chrome DevTools.
|
|
78
|
+
- Heap: enable `HeapProfiler`, collect `addHeapSnapshotChunk`, call `takeHeapSnapshot`, write `/tmp/heap.heapsnapshot`.
|
|
79
|
+
|
|
80
|
+
Pitfalls
|
|
81
|
+
|
|
82
|
+
- `--inspect` does not pause; use `--inspect-brk` when setup must happen before code runs.
|
|
83
|
+
- Default port is `9229`; use `--inspect=0` or a unique port for parallel targets.
|
|
84
|
+
- If a breakpoint misses, confirm file path, source map behavior, and whether execution already passed the line.
|
|
85
|
+
- If the process appears frozen after detaching, it may still be paused in the debugger.
|