clawdbot 2026.1.4-1
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 +120 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +297 -0
- package/dist/agents/agent-paths.js +17 -0
- package/dist/agents/bash-process-registry.js +126 -0
- package/dist/agents/bash-tools.js +837 -0
- package/dist/agents/clawdbot-tools.js +30 -0
- package/dist/agents/clawdis-tools.js +27 -0
- package/dist/agents/context.js +34 -0
- package/dist/agents/defaults.js +6 -0
- package/dist/agents/model-auth.js +112 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +191 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +116 -0
- package/dist/agents/models-config.js +49 -0
- package/dist/agents/pi-embedded-helpers.js +74 -0
- package/dist/agents/pi-embedded-runner.js +407 -0
- package/dist/agents/pi-embedded-subscribe.js +568 -0
- package/dist/agents/pi-embedded-utils.js +20 -0
- package/dist/agents/pi-embedded.js +1 -0
- package/dist/agents/pi-oauth.js +88 -0
- package/dist/agents/pi-tools.js +433 -0
- package/dist/agents/sandbox-paths.js +68 -0
- package/dist/agents/sandbox.js +644 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +157 -0
- package/dist/agents/skills.js +470 -0
- package/dist/agents/steerable-agent-loop.js +338 -0
- package/dist/agents/steerable-provider-transport.js +48 -0
- package/dist/agents/system-prompt.js +104 -0
- package/dist/agents/tool-display.js +162 -0
- package/dist/agents/tool-images.js +138 -0
- package/dist/agents/tools/browser-tool.js +339 -0
- package/dist/agents/tools/canvas-tool.js +193 -0
- package/dist/agents/tools/common.js +88 -0
- package/dist/agents/tools/cron-tool.js +124 -0
- package/dist/agents/tools/discord-actions-guild.js +186 -0
- package/dist/agents/tools/discord-actions-messaging.js +285 -0
- package/dist/agents/tools/discord-actions-moderation.js +70 -0
- package/dist/agents/tools/discord-actions.js +56 -0
- package/dist/agents/tools/discord-schema.js +199 -0
- package/dist/agents/tools/discord-tool.js +16 -0
- package/dist/agents/tools/gateway-tool.js +46 -0
- package/dist/agents/tools/gateway.js +27 -0
- package/dist/agents/tools/image-tool.js +132 -0
- package/dist/agents/tools/nodes-tool.js +413 -0
- package/dist/agents/tools/nodes-utils.js +92 -0
- package/dist/agents/tools/sessions-helpers.js +88 -0
- package/dist/agents/tools/sessions-history-tool.js +53 -0
- package/dist/agents/tools/sessions-list-tool.js +143 -0
- package/dist/agents/tools/sessions-send-helpers.js +100 -0
- package/dist/agents/tools/sessions-send-tool.js +347 -0
- package/dist/agents/tools/slack-actions.js +129 -0
- package/dist/agents/tools/slack-schema.js +59 -0
- package/dist/agents/tools/slack-tool.js +16 -0
- package/dist/agents/usage.js +39 -0
- package/dist/agents/workspace.js +241 -0
- package/dist/auto-reply/chunk.js +76 -0
- package/dist/auto-reply/envelope.js +38 -0
- package/dist/auto-reply/group-activation.js +20 -0
- package/dist/auto-reply/heartbeat.js +57 -0
- package/dist/auto-reply/model.js +14 -0
- package/dist/auto-reply/reply/abort.js +14 -0
- package/dist/auto-reply/reply/agent-runner.js +371 -0
- package/dist/auto-reply/reply/block-streaming.js +34 -0
- package/dist/auto-reply/reply/body.js +29 -0
- package/dist/auto-reply/reply/commands.js +207 -0
- package/dist/auto-reply/reply/directive-handling.js +361 -0
- package/dist/auto-reply/reply/directives.js +47 -0
- package/dist/auto-reply/reply/followup-runner.js +149 -0
- package/dist/auto-reply/reply/groups.js +91 -0
- package/dist/auto-reply/reply/mentions.js +38 -0
- package/dist/auto-reply/reply/model-selection.js +114 -0
- package/dist/auto-reply/reply/queue.js +399 -0
- package/dist/auto-reply/reply/reply-tags.js +26 -0
- package/dist/auto-reply/reply/session-updates.js +87 -0
- package/dist/auto-reply/reply/session.js +160 -0
- package/dist/auto-reply/reply/typing.js +75 -0
- package/dist/auto-reply/reply.js +535 -0
- package/dist/auto-reply/send-policy.js +28 -0
- package/dist/auto-reply/status.js +158 -0
- package/dist/auto-reply/templating.js +9 -0
- package/dist/auto-reply/thinking.js +49 -0
- package/dist/auto-reply/tokens.js +2 -0
- package/dist/auto-reply/tool-meta.js +74 -0
- package/dist/auto-reply/transcription.js +57 -0
- package/dist/auto-reply/types.js +1 -0
- package/dist/browser/bridge-server.js +37 -0
- package/dist/browser/cdp.js +382 -0
- package/dist/browser/chrome.js +432 -0
- package/dist/browser/client-actions-core.js +67 -0
- package/dist/browser/client-actions-observe.js +24 -0
- package/dist/browser/client-actions-types.js +1 -0
- package/dist/browser/client-actions.js +3 -0
- package/dist/browser/client-fetch.js +43 -0
- package/dist/browser/client.js +105 -0
- package/dist/browser/config.js +140 -0
- package/dist/browser/constants.js +4 -0
- package/dist/browser/profiles-service.js +122 -0
- package/dist/browser/profiles.js +85 -0
- package/dist/browser/pw-ai.js +2 -0
- package/dist/browser/pw-session.js +144 -0
- package/dist/browser/pw-tools-core.js +363 -0
- package/dist/browser/routes/agent.js +535 -0
- package/dist/browser/routes/basic.js +155 -0
- package/dist/browser/routes/index.js +8 -0
- package/dist/browser/routes/tabs.js +105 -0
- package/dist/browser/routes/utils.js +62 -0
- package/dist/browser/screenshot.js +40 -0
- package/dist/browser/server-context.js +377 -0
- package/dist/browser/server.js +81 -0
- package/dist/browser/target-id.js +18 -0
- package/dist/browser/trash.js +21 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
- package/dist/canvas-host/a2ui/index.html +246 -0
- package/dist/canvas-host/a2ui.js +187 -0
- package/dist/canvas-host/server.js +382 -0
- package/dist/cli/browser-cli-actions-input.js +459 -0
- package/dist/cli/browser-cli-actions-observe.js +56 -0
- package/dist/cli/browser-cli-examples.js +31 -0
- package/dist/cli/browser-cli-inspect.js +97 -0
- package/dist/cli/browser-cli-manage.js +286 -0
- package/dist/cli/browser-cli-shared.js +1 -0
- package/dist/cli/browser-cli.js +26 -0
- package/dist/cli/canvas-cli.js +416 -0
- package/dist/cli/cron-cli.js +454 -0
- package/dist/cli/deps.js +17 -0
- package/dist/cli/dns-cli.js +180 -0
- package/dist/cli/gateway-cli.js +489 -0
- package/dist/cli/gateway-rpc.js +20 -0
- package/dist/cli/hooks-cli.js +135 -0
- package/dist/cli/models-cli.js +248 -0
- package/dist/cli/nodes-camera.js +57 -0
- package/dist/cli/nodes-canvas.js +26 -0
- package/dist/cli/nodes-cli.js +946 -0
- package/dist/cli/nodes-screen.js +37 -0
- package/dist/cli/parse-duration.js +20 -0
- package/dist/cli/ports.js +97 -0
- package/dist/cli/program.js +406 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/wait.js +8 -0
- package/dist/commands/agent.js +645 -0
- package/dist/commands/antigravity-oauth.js +327 -0
- package/dist/commands/configure.js +480 -0
- package/dist/commands/doctor.js +484 -0
- package/dist/commands/health.js +108 -0
- package/dist/commands/models/aliases.js +64 -0
- package/dist/commands/models/fallbacks.js +99 -0
- package/dist/commands/models/image-fallbacks.js +99 -0
- package/dist/commands/models/list.js +323 -0
- package/dist/commands/models/scan.js +266 -0
- package/dist/commands/models/set-image.js +23 -0
- package/dist/commands/models/set.js +23 -0
- package/dist/commands/models/shared.js +72 -0
- package/dist/commands/models.js +7 -0
- package/dist/commands/onboard-auth.js +70 -0
- package/dist/commands/onboard-helpers.js +295 -0
- package/dist/commands/onboard-interactive.js +17 -0
- package/dist/commands/onboard-non-interactive.js +202 -0
- package/dist/commands/onboard-providers.js +634 -0
- package/dist/commands/onboard-remote.js +120 -0
- package/dist/commands/onboard-skills.js +148 -0
- package/dist/commands/onboard-types.js +1 -0
- package/dist/commands/onboard.js +12 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +58 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/status.js +207 -0
- package/dist/commands/update.js +16 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +61 -0
- package/dist/config/io.js +147 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +159 -0
- package/dist/config/paths.js +71 -0
- package/dist/config/schema.js +150 -0
- package/dist/config/sessions.js +282 -0
- package/dist/config/talk.js +31 -0
- package/dist/config/types.js +1 -0
- package/dist/config/validation.js +29 -0
- package/dist/config/zod-schema.js +831 -0
- package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
- package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
- package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
- package/dist/control-ui/index.html +15 -0
- package/dist/cron/isolated-agent.js +499 -0
- package/dist/cron/run-log.js +72 -0
- package/dist/cron/schedule.js +24 -0
- package/dist/cron/service.js +471 -0
- package/dist/cron/store.js +43 -0
- package/dist/cron/types.js +1 -0
- package/dist/daemon/constants.js +10 -0
- package/dist/daemon/launchd.js +276 -0
- package/dist/daemon/legacy.js +63 -0
- package/dist/daemon/program-args.js +76 -0
- package/dist/daemon/schtasks.js +257 -0
- package/dist/daemon/service.js +60 -0
- package/dist/daemon/systemd.js +266 -0
- package/dist/discord/index.js +2 -0
- package/dist/discord/monitor.js +1188 -0
- package/dist/discord/probe.js +54 -0
- package/dist/discord/send.js +577 -0
- package/dist/discord/token.js +8 -0
- package/dist/gateway/auth.js +121 -0
- package/dist/gateway/call.js +94 -0
- package/dist/gateway/chat-attachments.js +41 -0
- package/dist/gateway/client.js +180 -0
- package/dist/gateway/config-reload.js +274 -0
- package/dist/gateway/control-ui.js +184 -0
- package/dist/gateway/hooks-mapping.js +282 -0
- package/dist/gateway/hooks.js +168 -0
- package/dist/gateway/net.js +29 -0
- package/dist/gateway/protocol/index.js +61 -0
- package/dist/gateway/protocol/schema.js +560 -0
- package/dist/gateway/server-bridge-subscriptions.js +93 -0
- package/dist/gateway/server-bridge.js +1013 -0
- package/dist/gateway/server-browser.js +12 -0
- package/dist/gateway/server-chat.js +159 -0
- package/dist/gateway/server-constants.js +8 -0
- package/dist/gateway/server-discovery.js +62 -0
- package/dist/gateway/server-http.js +165 -0
- package/dist/gateway/server-methods/agent-job.js +125 -0
- package/dist/gateway/server-methods/agent.js +250 -0
- package/dist/gateway/server-methods/chat.js +200 -0
- package/dist/gateway/server-methods/config.js +50 -0
- package/dist/gateway/server-methods/connect.js +6 -0
- package/dist/gateway/server-methods/cron.js +83 -0
- package/dist/gateway/server-methods/health.js +28 -0
- package/dist/gateway/server-methods/models.js +16 -0
- package/dist/gateway/server-methods/nodes.js +294 -0
- package/dist/gateway/server-methods/providers.js +217 -0
- package/dist/gateway/server-methods/send.js +166 -0
- package/dist/gateway/server-methods/sessions.js +305 -0
- package/dist/gateway/server-methods/skills.js +83 -0
- package/dist/gateway/server-methods/system.js +118 -0
- package/dist/gateway/server-methods/talk.js +22 -0
- package/dist/gateway/server-methods/types.js +1 -0
- package/dist/gateway/server-methods/voicewake.js +30 -0
- package/dist/gateway/server-methods/web.js +58 -0
- package/dist/gateway/server-methods/wizard.js +100 -0
- package/dist/gateway/server-methods.js +53 -0
- package/dist/gateway/server-providers.js +644 -0
- package/dist/gateway/server-shared.js +1 -0
- package/dist/gateway/server-utils.js +35 -0
- package/dist/gateway/server.js +1437 -0
- package/dist/gateway/session-utils.js +216 -0
- package/dist/gateway/ws-log.js +349 -0
- package/dist/gateway/ws-logging.js +8 -0
- package/dist/globals.js +41 -0
- package/dist/hooks/gmail-ops.js +236 -0
- package/dist/hooks/gmail-setup-utils.js +278 -0
- package/dist/hooks/gmail-watcher.js +175 -0
- package/dist/hooks/gmail.js +177 -0
- package/dist/imessage/client.js +165 -0
- package/dist/imessage/index.js +3 -0
- package/dist/imessage/monitor.js +272 -0
- package/dist/imessage/probe.js +26 -0
- package/dist/imessage/send.js +83 -0
- package/dist/imessage/targets.js +176 -0
- package/dist/index.js +50 -0
- package/dist/infra/agent-events.js +46 -0
- package/dist/infra/binaries.js +9 -0
- package/dist/infra/bonjour-discovery.js +163 -0
- package/dist/infra/bonjour.js +200 -0
- package/dist/infra/bridge/server.js +562 -0
- package/dist/infra/canvas-host-url.js +54 -0
- package/dist/infra/env.js +8 -0
- package/dist/infra/errors.js +28 -0
- package/dist/infra/gateway-lock.js +8 -0
- package/dist/infra/heartbeat-events.js +21 -0
- package/dist/infra/heartbeat-runner.js +453 -0
- package/dist/infra/heartbeat-wake.js +61 -0
- package/dist/infra/is-main.js +37 -0
- package/dist/infra/machine-name.js +40 -0
- package/dist/infra/node-pairing.js +211 -0
- package/dist/infra/pam.js +42 -0
- package/dist/infra/path-env.js +92 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/restart.js +29 -0
- package/dist/infra/retry.js +16 -0
- package/dist/infra/runtime-guard.js +59 -0
- package/dist/infra/system-events.js +44 -0
- package/dist/infra/system-presence.js +216 -0
- package/dist/infra/tailnet.js +46 -0
- package/dist/infra/tailscale.js +149 -0
- package/dist/infra/voicewake.js +77 -0
- package/dist/infra/widearea-dns.js +123 -0
- package/dist/infra/ws.js +13 -0
- package/dist/logger.js +52 -0
- package/dist/logging.js +490 -0
- package/dist/macos/gateway-daemon.js +141 -0
- package/dist/macos/relay.js +46 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +121 -0
- package/dist/media/mime.js +115 -0
- package/dist/media/parse.js +81 -0
- package/dist/media/server.js +64 -0
- package/dist/media/store.js +139 -0
- package/dist/process/command-queue.js +97 -0
- package/dist/process/exec.js +75 -0
- package/dist/protocol.schema.json +2918 -0
- package/dist/provider-web.js +8 -0
- package/dist/providers/web/index.js +2 -0
- package/dist/runtime.js +8 -0
- package/dist/sessions/send-policy.js +68 -0
- package/dist/signal/client.js +134 -0
- package/dist/signal/daemon.js +69 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/monitor.js +336 -0
- package/dist/signal/probe.js +46 -0
- package/dist/signal/send.js +91 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1029 -0
- package/dist/slack/probe.js +47 -0
- package/dist/slack/send.js +131 -0
- package/dist/slack/token.js +10 -0
- package/dist/telegram/bot.js +394 -0
- package/dist/telegram/download.js +34 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/monitor.js +47 -0
- package/dist/telegram/probe.js +63 -0
- package/dist/telegram/proxy.js +9 -0
- package/dist/telegram/send.js +138 -0
- package/dist/telegram/token.js +30 -0
- package/dist/telegram/webhook-set.js +12 -0
- package/dist/telegram/webhook.js +56 -0
- package/dist/tui/commands.js +74 -0
- package/dist/tui/components/assistant-message.js +16 -0
- package/dist/tui/components/chat-log.js +92 -0
- package/dist/tui/components/custom-editor.js +53 -0
- package/dist/tui/components/selectors.js +8 -0
- package/dist/tui/components/tool-execution.js +111 -0
- package/dist/tui/components/user-message.js +17 -0
- package/dist/tui/gateway-chat.js +140 -0
- package/dist/tui/layout.js +41 -0
- package/dist/tui/message-list.js +57 -0
- package/dist/tui/theme/theme.js +80 -0
- package/dist/tui/theme.js +25 -0
- package/dist/tui/tui.js +708 -0
- package/dist/utils.js +133 -0
- package/dist/version.js +18 -0
- package/dist/web/active-listener.js +7 -0
- package/dist/web/auto-reply.js +1203 -0
- package/dist/web/inbound.js +481 -0
- package/dist/web/login-qr.js +204 -0
- package/dist/web/login.js +59 -0
- package/dist/web/media.js +148 -0
- package/dist/web/outbound.js +67 -0
- package/dist/web/qr-image.js +97 -0
- package/dist/web/reconnect.js +60 -0
- package/dist/web/reply-heartbeat-wake.js +61 -0
- package/dist/web/session.js +346 -0
- package/dist/wizard/clack-prompter.js +56 -0
- package/dist/wizard/onboarding.js +452 -0
- package/dist/wizard/prompts.js +6 -0
- package/dist/wizard/session.js +203 -0
- package/docs/AGENTS.default.md +116 -0
- package/docs/CNAME +1 -0
- package/docs/RELEASING.md +64 -0
- package/docs/_config.yml +51 -0
- package/docs/_layouts/default.html +145 -0
- package/docs/agent-send.md +21 -0
- package/docs/agent.md +104 -0
- package/docs/android/connect.md +131 -0
- package/docs/architecture.md +89 -0
- package/docs/assets/markdown.css +130 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/terminal.css +497 -0
- package/docs/assets/theme.js +55 -0
- package/docs/audio.md +50 -0
- package/docs/background-process.md +74 -0
- package/docs/bash.md +32 -0
- package/docs/bonjour.md +159 -0
- package/docs/browser.md +289 -0
- package/docs/camera.md +152 -0
- package/docs/clawd.md +199 -0
- package/docs/clawdbot-mac.md +104 -0
- package/docs/configuration.md +1177 -0
- package/docs/control-api.md +49 -0
- package/docs/control-ui.md +83 -0
- package/docs/cron.md +374 -0
- package/docs/dashboard.md +17 -0
- package/docs/device-models.md +46 -0
- package/docs/discord.md +293 -0
- package/docs/discovery.md +112 -0
- package/docs/docker.md +251 -0
- package/docs/docs.json +86 -0
- package/docs/doctor.md +47 -0
- package/docs/elevated.md +31 -0
- package/docs/faq.md +640 -0
- package/docs/gateway/pairing.md +109 -0
- package/docs/gateway-lock.md +28 -0
- package/docs/gateway.md +174 -0
- package/docs/gmail-pubsub.md +191 -0
- package/docs/grammy.md +27 -0
- package/docs/group-messages.md +71 -0
- package/docs/groups.md +78 -0
- package/docs/health.md +28 -0
- package/docs/heartbeat.md +64 -0
- package/docs/images.md +52 -0
- package/docs/imessage.md +63 -0
- package/docs/index.md +182 -0
- package/docs/ios/connect.md +177 -0
- package/docs/ios/spec.md +236 -0
- package/docs/location-command.md +95 -0
- package/docs/logging.md +99 -0
- package/docs/lore.md +131 -0
- package/docs/mac/bun.md +133 -0
- package/docs/mac/canvas.md +161 -0
- package/docs/mac/child-process.md +72 -0
- package/docs/mac/dev-setup.md +81 -0
- package/docs/mac/health.md +28 -0
- package/docs/mac/icon.md +26 -0
- package/docs/mac/logging.md +51 -0
- package/docs/mac/menu-bar.md +69 -0
- package/docs/mac/peekaboo.md +170 -0
- package/docs/mac/permissions.md +40 -0
- package/docs/mac/release.md +76 -0
- package/docs/mac/remote.md +57 -0
- package/docs/mac/signing.md +41 -0
- package/docs/mac/skills.md +27 -0
- package/docs/mac/voice-overlay.md +52 -0
- package/docs/mac/voicewake.md +56 -0
- package/docs/mac/webchat.md +27 -0
- package/docs/mac/xpc.md +40 -0
- package/docs/models.md +90 -0
- package/docs/nix.md +49 -0
- package/docs/nodes.md +157 -0
- package/docs/onboarding-config-protocol.md +29 -0
- package/docs/onboarding.md +185 -0
- package/docs/presence.md +133 -0
- package/docs/queue.md +78 -0
- package/docs/refactor/browser-control-simplification.md +58 -0
- package/docs/refactor/canvas-a2ui.md +93 -0
- package/docs/refactor/cli-unification.md +64 -0
- package/docs/refactor/gateway-client.md +31 -0
- package/docs/refactor/gateway.md +99 -0
- package/docs/refactor/new-arch.md +171 -0
- package/docs/refactor/tui.md +26 -0
- package/docs/refactor/web-gateway-troubleshooting.md +37 -0
- package/docs/refactor/webagent-session.md +46 -0
- package/docs/remote-gateway-readme.md +148 -0
- package/docs/remote.md +66 -0
- package/docs/research/memory.md +227 -0
- package/docs/rpc.md +35 -0
- package/docs/security.md +168 -0
- package/docs/session-tool.md +119 -0
- package/docs/session.md +84 -0
- package/docs/sessions.md +8 -0
- package/docs/setup.md +118 -0
- package/docs/signal.md +113 -0
- package/docs/skills-config.md +58 -0
- package/docs/skills.md +149 -0
- package/docs/slack.md +158 -0
- package/docs/surface.md +20 -0
- package/docs/tailscale.md +71 -0
- package/docs/talk.md +79 -0
- package/docs/telegram.md +90 -0
- package/docs/templates/AGENTS.md +126 -0
- package/docs/templates/BOOTSTRAP.md +53 -0
- package/docs/templates/IDENTITY.md +17 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +22 -0
- package/docs/test.md +35 -0
- package/docs/thinking.md +46 -0
- package/docs/tools.md +248 -0
- package/docs/troubleshooting.md +227 -0
- package/docs/tui.md +69 -0
- package/docs/typebox.md +42 -0
- package/docs/voicewake.md +61 -0
- package/docs/web.md +115 -0
- package/docs/webchat.md +34 -0
- package/docs/webhook.md +132 -0
- package/docs/whatsapp-clawd.jpg +0 -0
- package/docs/whatsapp.md +142 -0
- package/docs/wizard.md +158 -0
- package/package.json +186 -0
- package/skills/apple-notes/SKILL.md +50 -0
- package/skills/apple-reminders/SKILL.md +67 -0
- package/skills/bear-notes/SKILL.md +79 -0
- package/skills/bird/SKILL.md +25 -0
- package/skills/blogwatcher/SKILL.md +46 -0
- package/skills/blucli/SKILL.md +27 -0
- package/skills/brave-search/SKILL.md +30 -0
- package/skills/brave-search/scripts/content.mjs +53 -0
- package/skills/brave-search/scripts/search.mjs +79 -0
- package/skills/camsnap/SKILL.md +25 -0
- package/skills/clawdhub/SKILL.md +53 -0
- package/skills/coding-agent/SKILL.md +275 -0
- package/skills/discord/SKILL.md +369 -0
- package/skills/eightctl/SKILL.md +29 -0
- package/skills/food-order/SKILL.md +41 -0
- package/skills/gemini/SKILL.md +23 -0
- package/skills/gifgrep/SKILL.md +47 -0
- package/skills/github/SKILL.md +47 -0
- package/skills/gog/SKILL.md +36 -0
- package/skills/goplaces/SKILL.md +30 -0
- package/skills/imsg/SKILL.md +25 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +91 -0
- package/skills/local-places/pyproject.toml +27 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +38 -0
- package/skills/nano-banana-pro/SKILL.md +29 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
- package/skills/nano-pdf/SKILL.md +20 -0
- package/skills/notion/SKILL.md +156 -0
- package/skills/obsidian/SKILL.md +55 -0
- package/skills/openai-image-gen/SKILL.md +31 -0
- package/skills/openai-image-gen/scripts/gen.py +173 -0
- package/skills/openai-whisper/SKILL.md +19 -0
- package/skills/openai-whisper-api/SKILL.md +43 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +30 -0
- package/skills/oracle/SKILL.md +105 -0
- package/skills/ordercli/SKILL.md +47 -0
- package/skills/peekaboo/SKILL.md +153 -0
- package/skills/qmd/SKILL.md +26 -0
- package/skills/sag/SKILL.md +62 -0
- package/skills/slack/SKILL.md +143 -0
- package/skills/songsee/SKILL.md +29 -0
- package/skills/sonoscli/SKILL.md +26 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/summarize/SKILL.md +49 -0
- package/skills/things-mac/SKILL.md +61 -0
- package/skills/tmux/SKILL.md +121 -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 +84 -0
- package/skills/video-frames/SKILL.md +29 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/wacli/SKILL.md +42 -0
- package/skills/weather/SKILL.md +49 -0
package/docs/bonjour.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Bonjour/mDNS discovery + debugging (Gateway beacons, clients, and common failure modes)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging Bonjour discovery issues on macOS/iOS
|
|
5
|
+
- Changing mDNS service types, TXT records, or discovery UX
|
|
6
|
+
---
|
|
7
|
+
# Bonjour / mDNS discovery
|
|
8
|
+
|
|
9
|
+
Clawdbot uses Bonjour (mDNS / DNS-SD) as a **LAN-only convenience** to discover a running Gateway bridge transport. It is best-effort and does **not** replace SSH or Tailnet-based connectivity.
|
|
10
|
+
|
|
11
|
+
## Wide-Area Bonjour (Unicast DNS-SD) over Tailscale
|
|
12
|
+
|
|
13
|
+
If you want iOS node auto-discovery while the Gateway is on another network (e.g. Vienna ⇄ London), you can keep the `NWBrowser` UX but switch discovery from multicast mDNS (`local.`) to **unicast DNS-SD** (“Wide-Area Bonjour”) over Tailscale.
|
|
14
|
+
|
|
15
|
+
High level:
|
|
16
|
+
|
|
17
|
+
1) Run a DNS server on the gateway host (reachable via tailnet IP).
|
|
18
|
+
2) Publish DNS-SD records for `_clawdbot-bridge._tcp` in a dedicated zone (example: `clawdbot.internal.`).
|
|
19
|
+
3) Configure Tailscale **split DNS** so `clawdbot.internal` resolves via that DNS server for clients (including iOS).
|
|
20
|
+
|
|
21
|
+
Clawdbot standardizes on the discovery domain `clawdbot.internal.` for this mode. iOS/Android nodes browse both `local.` and `clawdbot.internal.` automatically (no per-device knob).
|
|
22
|
+
|
|
23
|
+
### Gateway config (recommended)
|
|
24
|
+
|
|
25
|
+
On the gateway host (the machine running the Gateway bridge), add to `~/.clawdbot/clawdbot.json` (JSON5):
|
|
26
|
+
|
|
27
|
+
```json5
|
|
28
|
+
{
|
|
29
|
+
bridge: { bind: "tailnet" }, // tailnet-only (recommended)
|
|
30
|
+
discovery: { wideArea: { enabled: true } } // enables clawdbot.internal DNS-SD publishing
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### One-time DNS server setup (gateway host)
|
|
35
|
+
|
|
36
|
+
On the gateway host (macOS), run:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
clawdbot dns setup --apply
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This installs CoreDNS and configures it to:
|
|
43
|
+
- listen on port 53 **only** on the gateway’s Tailscale interface IPs
|
|
44
|
+
- serve the zone `clawdbot.internal.` from the gateway-owned zone file `~/.clawdbot/dns/clawdbot.internal.db`
|
|
45
|
+
|
|
46
|
+
The Gateway writes/updates that zone file when `discovery.wideArea.enabled` is true.
|
|
47
|
+
|
|
48
|
+
Validate from any tailnet-connected machine:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
dns-sd -B _clawdbot-bridge._tcp clawdbot.internal.
|
|
52
|
+
dig @<TAILNET_IPV4> -p 53 _clawdbot-bridge._tcp.clawdbot.internal PTR +short
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Tailscale DNS settings
|
|
56
|
+
|
|
57
|
+
In the Tailscale admin console:
|
|
58
|
+
|
|
59
|
+
- Add a nameserver pointing at the gateway’s tailnet IP (UDP/TCP 53).
|
|
60
|
+
- Add split DNS so the domain `clawdbot.internal` uses that nameserver.
|
|
61
|
+
|
|
62
|
+
Once clients accept tailnet DNS, iOS nodes can browse `_clawdbot-bridge._tcp` in `clawdbot.internal.` without multicast.
|
|
63
|
+
Wide-area beacons also include `tailnetDns` (when available) so the macOS app can auto-fill SSH targets off-LAN.
|
|
64
|
+
|
|
65
|
+
### Bridge listener security (recommended)
|
|
66
|
+
|
|
67
|
+
The bridge port (default `18790`) is a plain TCP service. By default it binds to `0.0.0.0`, which makes it reachable from *any* interface on the gateway machine (LAN/Wi‑Fi/Tailscale).
|
|
68
|
+
|
|
69
|
+
For a tailnet-only setup, bind it to the Tailscale IP instead:
|
|
70
|
+
|
|
71
|
+
- Set `bridge.bind: "tailnet"` in `~/.clawdbot/clawdbot.json`.
|
|
72
|
+
- Restart the Gateway (or restart the macOS menubar app via `./scripts/restart-mac.sh` on that machine).
|
|
73
|
+
|
|
74
|
+
This keeps the bridge reachable only from devices on your tailnet (while still listening on loopback for local/SSH port-forwards).
|
|
75
|
+
|
|
76
|
+
## What advertises
|
|
77
|
+
|
|
78
|
+
Only the **Node Gateway** (`clawd` / `clawdbot gateway`) advertises Bonjour beacons.
|
|
79
|
+
|
|
80
|
+
- Implementation: `src/infra/bonjour.ts`
|
|
81
|
+
- Gateway wiring: `src/gateway/server.ts`
|
|
82
|
+
|
|
83
|
+
## Service types
|
|
84
|
+
|
|
85
|
+
- `_clawdbot-bridge._tcp` — bridge transport beacon (used by macOS/iOS/Android nodes).
|
|
86
|
+
|
|
87
|
+
## TXT keys (non-secret hints)
|
|
88
|
+
|
|
89
|
+
The Gateway advertises small non-secret hints to make UI flows convenient:
|
|
90
|
+
|
|
91
|
+
- `role=gateway`
|
|
92
|
+
- `lanHost=<hostname>.local`
|
|
93
|
+
- `sshPort=<port>` (defaults to 22 when not overridden)
|
|
94
|
+
- `gatewayPort=<port>` (informational; the Gateway WS is typically loopback-only)
|
|
95
|
+
- `bridgePort=<port>` (only when bridge is enabled)
|
|
96
|
+
- `canvasPort=<port>` (only when the canvas host is enabled + reachable; default `18793`; serves `/__clawdbot__/canvas/`)
|
|
97
|
+
- `cliPath=<path>` (optional; absolute path to a runnable `clawdbot` entrypoint or binary)
|
|
98
|
+
- `tailnetDns=<magicdns>` (optional hint; auto-detected from Tailscale when available; may be absent)
|
|
99
|
+
|
|
100
|
+
## Debugging on macOS
|
|
101
|
+
|
|
102
|
+
Useful built-in tools:
|
|
103
|
+
|
|
104
|
+
- Browse instances:
|
|
105
|
+
- `dns-sd -B _clawdbot-bridge._tcp local.`
|
|
106
|
+
- Resolve one instance (replace `<instance>`):
|
|
107
|
+
- `dns-sd -L "<instance>" _clawdbot-bridge._tcp local.`
|
|
108
|
+
|
|
109
|
+
If browsing shows instances but resolving fails, you’re usually hitting a LAN policy / multicast issue.
|
|
110
|
+
|
|
111
|
+
## Debugging in Gateway logs
|
|
112
|
+
|
|
113
|
+
The Gateway writes a rolling log file (printed on startup as `gateway log file: ...`).
|
|
114
|
+
|
|
115
|
+
Look for `bonjour:` lines, especially:
|
|
116
|
+
|
|
117
|
+
- `bonjour: advertise failed ...` (probing/announce failure)
|
|
118
|
+
- `bonjour: ... name conflict resolved` / `hostname conflict resolved`
|
|
119
|
+
- `bonjour: watchdog detected non-announced service; attempting re-advertise ...` (self-heal attempt after sleep/interface churn)
|
|
120
|
+
|
|
121
|
+
## Debugging on iOS node
|
|
122
|
+
|
|
123
|
+
The iOS node app discovers bridges via `NWBrowser` browsing `_clawdbot-bridge._tcp`.
|
|
124
|
+
|
|
125
|
+
To capture what the browser is doing:
|
|
126
|
+
|
|
127
|
+
- Settings → Bridge → Advanced → enable **Discovery Debug Logs**
|
|
128
|
+
- Settings → Bridge → Advanced → open **Discovery Logs** → reproduce the “Searching…” / “No bridges found” case → **Copy**
|
|
129
|
+
|
|
130
|
+
The log includes browser state transitions (`ready`, `waiting`, `failed`, `cancelled`) and result-set changes (added/removed counts).
|
|
131
|
+
|
|
132
|
+
## Common failure modes
|
|
133
|
+
|
|
134
|
+
- **Bonjour doesn’t cross networks**: London/Vienna style setups require Tailnet (MagicDNS/IP) or SSH.
|
|
135
|
+
- **Multicast blocked**: some Wi‑Fi networks (enterprise/hotels) disable mDNS; expect “no results”.
|
|
136
|
+
- **Sleep / interface churn**: macOS may temporarily drop mDNS results when switching networks; retry.
|
|
137
|
+
- **Browse works but resolve fails (iOS “NoSuchRecord”)**: make sure the advertiser publishes a valid SRV target hostname.
|
|
138
|
+
- Implementation detail: `@homebridge/ciao` defaults `hostname` to the *service instance name* when `hostname` is omitted. If your instance name contains spaces/parentheses, some resolvers can fail to resolve the implied A/AAAA record.
|
|
139
|
+
- Fix: set an explicit DNS-safe `hostname` (single label; no `.local`) in `src/infra/bonjour.ts`.
|
|
140
|
+
|
|
141
|
+
## Escaped instance names (`\\032`)
|
|
142
|
+
Bonjour/DNS-SD often escapes bytes in service instance names as decimal `\\DDD` sequences (e.g. spaces become `\\032`).
|
|
143
|
+
|
|
144
|
+
- This is normal at the protocol level.
|
|
145
|
+
- UIs should decode for display (iOS uses `BonjourEscapes.decode` in `apps/shared/ClawdbotKit`).
|
|
146
|
+
|
|
147
|
+
## Disabling / configuration
|
|
148
|
+
|
|
149
|
+
- `CLAWDBOT_DISABLE_BONJOUR=1` disables advertising.
|
|
150
|
+
- `CLAWDBOT_BRIDGE_ENABLED=0` disables the bridge listener (and therefore the bridge beacon).
|
|
151
|
+
- `bridge.bind` / `bridge.port` in `~/.clawdbot/clawdbot.json` control bridge bind/port (preferred).
|
|
152
|
+
- `CLAWDBOT_BRIDGE_HOST` / `CLAWDBOT_BRIDGE_PORT` still work as a back-compat override when `bridge.bind` / `bridge.port` are not set.
|
|
153
|
+
- `CLAWDBOT_SSH_PORT` overrides the SSH port advertised in `_clawdbot-bridge._tcp`.
|
|
154
|
+
- `CLAWDBOT_TAILNET_DNS` publishes a `tailnetDns` hint (MagicDNS) in `_clawdbot-bridge._tcp`. If unset, the gateway auto-detects Tailscale and publishes the MagicDNS name when possible.
|
|
155
|
+
|
|
156
|
+
## Related docs
|
|
157
|
+
|
|
158
|
+
- Discovery policy and transport selection: `docs/discovery.md`
|
|
159
|
+
- Node pairing + approvals: `docs/gateway/pairing.md`
|
package/docs/browser.md
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Spec: integrated browser control server + action commands"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding agent-controlled browser automation
|
|
5
|
+
- Debugging why clawd is interfering with your own Chrome
|
|
6
|
+
- Implementing browser settings + lifecycle in the macOS app
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Browser (integrated) — clawd-managed Chrome
|
|
10
|
+
|
|
11
|
+
Status: draft spec · Date: 2025-12-20
|
|
12
|
+
|
|
13
|
+
Goal: give the **clawd** persona its own browser that is:
|
|
14
|
+
- Visually distinct (lobster-orange, profile labeled "clawd").
|
|
15
|
+
- Fully agent-manageable (start/stop, list tabs, focus/close tabs, open URLs, screenshot).
|
|
16
|
+
- Non-interfering with the user's own browser (separate profile + dedicated ports).
|
|
17
|
+
|
|
18
|
+
This doc covers the macOS app/gateway side. It intentionally does not mandate
|
|
19
|
+
Playwright vs Puppeteer; the key is the **contract** and the **separation guarantees**.
|
|
20
|
+
|
|
21
|
+
## User-facing settings
|
|
22
|
+
|
|
23
|
+
Add a dedicated settings section (preferably under **Skills** or its own "Browser" tab):
|
|
24
|
+
|
|
25
|
+
- **Enable clawd browser** (`default: on`)
|
|
26
|
+
- When off: no browser is launched, and browser tools return "disabled".
|
|
27
|
+
- **Browser control URL** (`default: http://127.0.0.1:18791`)
|
|
28
|
+
- Interpreted as the base URL of the local/remote browser-control server.
|
|
29
|
+
- If the URL host is not loopback, Clawdbot must **not** attempt to launch a local
|
|
30
|
+
browser; it only connects.
|
|
31
|
+
- **CDP URL** (`default: controlUrl + 1`)
|
|
32
|
+
- Base URL for Chrome DevTools Protocol (e.g. `http://127.0.0.1:18792`).
|
|
33
|
+
- Set this to a non-loopback host to attach the local control server to a remote
|
|
34
|
+
Chrome/Chromium CDP endpoint (SSH/Tailscale tunnel recommended).
|
|
35
|
+
- If the CDP URL host is non-loopback, clawd does **not** auto-launch a local browser.
|
|
36
|
+
- If you tunnel a remote CDP to `localhost`, set **Attach to existing only** to
|
|
37
|
+
avoid accidentally launching a local browser.
|
|
38
|
+
- **Accent color** (`default: #FF4500`, "lobster-orange")
|
|
39
|
+
- Used to theme the clawd browser profile (best-effort) and to tint UI indicators
|
|
40
|
+
in Clawdbot.
|
|
41
|
+
|
|
42
|
+
Optional (advanced, can be hidden behind Debug initially):
|
|
43
|
+
- **Use headless browser** (`default: off`)
|
|
44
|
+
- **Attach to existing only** (`default: off`) — if on, never launch; only connect if
|
|
45
|
+
already running.
|
|
46
|
+
- **Browser executable path** (override, optional)
|
|
47
|
+
- **No sandbox** (`default: off`) — adds `--no-sandbox` + `--disable-setuid-sandbox`
|
|
48
|
+
|
|
49
|
+
### Port convention
|
|
50
|
+
|
|
51
|
+
Clawdbot already uses:
|
|
52
|
+
- Gateway WebSocket: `18789`
|
|
53
|
+
- Bridge (voice/node): `18790`
|
|
54
|
+
|
|
55
|
+
For the clawd browser-control server, use "family" ports:
|
|
56
|
+
- Browser control HTTP API: `18791` (bridge + 1)
|
|
57
|
+
- Browser CDP/debugging port: `18792` (control + 1)
|
|
58
|
+
- Canvas host HTTP: `18793` by default, mounted at `/__clawdbot__/canvas/`
|
|
59
|
+
|
|
60
|
+
The user usually only configures the **control URL** (port `18791`). CDP is an
|
|
61
|
+
internal detail.
|
|
62
|
+
|
|
63
|
+
## Browser isolation guarantees (non-negotiable)
|
|
64
|
+
|
|
65
|
+
1) **Dedicated user data dir**
|
|
66
|
+
- Never attach to or reuse the user's default Chrome profile.
|
|
67
|
+
- Store clawd browser state under an app-owned directory, e.g.:
|
|
68
|
+
- `~/Library/Application Support/Clawdbot/browser/clawd/` (mac app)
|
|
69
|
+
- or `~/.clawdbot/browser/clawd/` (gateway/CLI)
|
|
70
|
+
|
|
71
|
+
2) **Dedicated ports**
|
|
72
|
+
- Never use `9222` (reserved for ad-hoc dev workflows; avoids colliding with
|
|
73
|
+
`agent-tools/browser-tools`).
|
|
74
|
+
- Default ports are `18791/18792` unless overridden.
|
|
75
|
+
|
|
76
|
+
3) **Named tab/page management**
|
|
77
|
+
- The agent must be able to enumerate and target tabs deterministically (by
|
|
78
|
+
stable `targetId` or equivalent), not "last tab".
|
|
79
|
+
|
|
80
|
+
## Browser selection (macOS + Linux)
|
|
81
|
+
|
|
82
|
+
On startup (when enabled + local URL), Clawdbot chooses the browser executable
|
|
83
|
+
in this order:
|
|
84
|
+
1) **Google Chrome Canary** (if installed)
|
|
85
|
+
2) **Chromium** (if installed)
|
|
86
|
+
3) **Google Chrome** (fallback)
|
|
87
|
+
|
|
88
|
+
Linux:
|
|
89
|
+
- Looks for `google-chrome` / `chromium` in common system paths.
|
|
90
|
+
- Use **Browser executable path** to force a specific binary.
|
|
91
|
+
|
|
92
|
+
Implementation detail:
|
|
93
|
+
- macOS: detection is by existence of the `.app` bundle under `/Applications`
|
|
94
|
+
(and optionally `~/Applications`), then using the resolved executable path.
|
|
95
|
+
- Linux: common `/usr/bin`/`/snap/bin` paths.
|
|
96
|
+
|
|
97
|
+
Rationale:
|
|
98
|
+
- Canary/Chromium are easy to visually distinguish from the user's daily driver.
|
|
99
|
+
- Chrome fallback ensures the feature works on a stock machine.
|
|
100
|
+
|
|
101
|
+
## Visual differentiation ("lobster-orange")
|
|
102
|
+
|
|
103
|
+
The clawd browser should be obviously different at a glance:
|
|
104
|
+
- Profile name: **clawd**
|
|
105
|
+
- Profile color: **#FF4500**
|
|
106
|
+
|
|
107
|
+
Preferred behavior:
|
|
108
|
+
- Seed/patch the profile's preferences on first launch so the color + name persist.
|
|
109
|
+
|
|
110
|
+
Fallback behavior:
|
|
111
|
+
- If preferences patching is not reliable, open with the dedicated profile and let
|
|
112
|
+
the user set the profile color/name once via Chrome UI; it must persist because
|
|
113
|
+
the `userDataDir` is persistent.
|
|
114
|
+
|
|
115
|
+
## Control server contract (vNext)
|
|
116
|
+
|
|
117
|
+
Expose a small local HTTP API (and/or gateway RPC surface) so the agent can manage
|
|
118
|
+
state without touching the user's Chrome.
|
|
119
|
+
|
|
120
|
+
Basics:
|
|
121
|
+
- `GET /` status payload (enabled/running/pid/cdpPort/etc)
|
|
122
|
+
- `POST /start` start browser
|
|
123
|
+
- `POST /stop` stop browser
|
|
124
|
+
- `GET /tabs` list tabs
|
|
125
|
+
- `POST /tabs/open` open a new tab
|
|
126
|
+
- `POST /tabs/focus` focus a tab by id/prefix
|
|
127
|
+
- `DELETE /tabs/:targetId` close a tab by id/prefix
|
|
128
|
+
|
|
129
|
+
Inspection:
|
|
130
|
+
- `POST /screenshot` `{ targetId?, fullPage?, ref?, element?, type? }`
|
|
131
|
+
- `GET /snapshot` `?format=aria|ai&targetId?&limit?`
|
|
132
|
+
- `GET /console` `?level?&targetId?`
|
|
133
|
+
- `POST /pdf` `{ targetId? }`
|
|
134
|
+
|
|
135
|
+
Actions:
|
|
136
|
+
- `POST /navigate`
|
|
137
|
+
- `POST /act` `{ kind, targetId?, ... }` where `kind` is one of:
|
|
138
|
+
- `click`, `type`, `press`, `hover`, `drag`, `select`, `fill`, `wait`, `resize`, `close`, `evaluate`
|
|
139
|
+
|
|
140
|
+
Hooks (arming):
|
|
141
|
+
- `POST /hooks/file-chooser` `{ targetId?, paths, timeoutMs? }`
|
|
142
|
+
- `POST /hooks/dialog` `{ targetId?, accept, promptText?, timeoutMs? }`
|
|
143
|
+
|
|
144
|
+
### "Is it open or closed?"
|
|
145
|
+
|
|
146
|
+
"Open" means:
|
|
147
|
+
- the control server is reachable at the configured URL **and**
|
|
148
|
+
- it reports a live browser connection.
|
|
149
|
+
|
|
150
|
+
"Closed" means:
|
|
151
|
+
- control server not reachable, or server reports no browser.
|
|
152
|
+
|
|
153
|
+
Clawdbot should treat "open/closed" as a health check (fast path), not by scanning
|
|
154
|
+
global Chrome processes (avoid false positives).
|
|
155
|
+
|
|
156
|
+
## Multi-profile support
|
|
157
|
+
|
|
158
|
+
Clawdbot supports multiple named browser profiles, each with:
|
|
159
|
+
- Dedicated CDP port (auto-allocated from 18800-18899) **or** a per-profile CDP URL
|
|
160
|
+
- Persistent user data directory (`~/.clawdbot/browser/<name>/user-data/`)
|
|
161
|
+
- Unique color for visual distinction
|
|
162
|
+
|
|
163
|
+
### Configuration
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"browser": {
|
|
168
|
+
"enabled": true,
|
|
169
|
+
"defaultProfile": "clawd",
|
|
170
|
+
"profiles": {
|
|
171
|
+
"clawd": { "cdpPort": 18800, "color": "#FF4500" },
|
|
172
|
+
"work": { "cdpPort": 18801, "color": "#0066CC" },
|
|
173
|
+
"remote": { "cdpUrl": "http://10.0.0.42:9222", "color": "#00AA00" }
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Profile actions
|
|
180
|
+
|
|
181
|
+
- `GET /profiles` — list all profiles with status
|
|
182
|
+
- `POST /profiles/create` `{ name, color?, cdpUrl? }` — create new profile (auto-allocates port if no `cdpUrl`)
|
|
183
|
+
- `DELETE /profiles/:name` — delete profile (stops browser + removes user data for local profiles)
|
|
184
|
+
- `POST /reset-profile?profile=<name>` — kill orphan process on profile's port (local profiles only)
|
|
185
|
+
|
|
186
|
+
### Profile parameter
|
|
187
|
+
|
|
188
|
+
All existing endpoints accept optional `?profile=<name>` query parameter:
|
|
189
|
+
- `GET /?profile=work` — status for work profile
|
|
190
|
+
- `POST /start?profile=work` — start work profile browser
|
|
191
|
+
- `GET /tabs?profile=work` — list tabs for work profile
|
|
192
|
+
- etc.
|
|
193
|
+
|
|
194
|
+
When `profile` is omitted, uses `browser.defaultProfile` (defaults to "clawd").
|
|
195
|
+
|
|
196
|
+
### Profile naming rules
|
|
197
|
+
|
|
198
|
+
- Lowercase alphanumeric characters and hyphens only
|
|
199
|
+
- Must start with a letter or number (not a hyphen)
|
|
200
|
+
- Maximum 64 characters
|
|
201
|
+
- Examples: `clawd`, `work`, `my-project-1`
|
|
202
|
+
|
|
203
|
+
### Port allocation
|
|
204
|
+
|
|
205
|
+
Ports are allocated from range 18800-18899 (~100 profiles max). This is far more
|
|
206
|
+
than practical use — memory and CPU exhaustion occur well before port exhaustion.
|
|
207
|
+
Ports are allocated once at profile creation and persisted permanently.
|
|
208
|
+
Remote profiles are attach-only and do **not** use the local port range.
|
|
209
|
+
## Interaction with the agent (clawd)
|
|
210
|
+
|
|
211
|
+
The agent should use browser tools only when:
|
|
212
|
+
- enabled in settings
|
|
213
|
+
- control URL is configured
|
|
214
|
+
|
|
215
|
+
If disabled, tools must fail fast with a friendly error ("Browser disabled in settings").
|
|
216
|
+
|
|
217
|
+
The agent should not assume tabs are ephemeral. It should:
|
|
218
|
+
- call `browser.tabs.list` to discover existing tabs first
|
|
219
|
+
- reuse an existing tab when appropriate (e.g. a persistent "main" tab)
|
|
220
|
+
- avoid opening duplicate tabs unless asked
|
|
221
|
+
|
|
222
|
+
## CLI quick reference (one example each)
|
|
223
|
+
|
|
224
|
+
All commands accept `--profile <name>` to target a specific profile (default: `clawd`).
|
|
225
|
+
|
|
226
|
+
Profile management:
|
|
227
|
+
- `clawdbot browser profiles`
|
|
228
|
+
- `clawdbot browser create-profile --name work`
|
|
229
|
+
- `clawdbot browser create-profile --name remote --cdp-url http://10.0.0.42:9222`
|
|
230
|
+
- `clawdbot browser delete-profile --name work`
|
|
231
|
+
Basics:
|
|
232
|
+
- `clawdbot browser status`
|
|
233
|
+
- `clawdbot browser start`
|
|
234
|
+
- `clawdbot browser stop`
|
|
235
|
+
- `clawdbot browser reset-profile`
|
|
236
|
+
- `clawdbot browser tabs`
|
|
237
|
+
- `clawdbot browser open https://example.com`
|
|
238
|
+
- `clawdbot browser focus abcd1234`
|
|
239
|
+
- `clawdbot browser close abcd1234`
|
|
240
|
+
|
|
241
|
+
Inspection:
|
|
242
|
+
- `clawdbot browser screenshot`
|
|
243
|
+
- `clawdbot browser screenshot --full-page`
|
|
244
|
+
- `clawdbot browser screenshot --ref 12`
|
|
245
|
+
- `clawdbot browser snapshot`
|
|
246
|
+
- `clawdbot browser snapshot --format aria --limit 200`
|
|
247
|
+
|
|
248
|
+
Actions:
|
|
249
|
+
- `clawdbot browser navigate https://example.com`
|
|
250
|
+
- `clawdbot browser resize 1280 720`
|
|
251
|
+
- `clawdbot browser click 12 --double`
|
|
252
|
+
- `clawdbot browser type 23 "hello" --submit`
|
|
253
|
+
- `clawdbot browser press Enter`
|
|
254
|
+
- `clawdbot browser hover 44`
|
|
255
|
+
- `clawdbot browser drag 10 11`
|
|
256
|
+
- `clawdbot browser select 9 OptionA OptionB`
|
|
257
|
+
- `clawdbot browser upload /tmp/file.pdf`
|
|
258
|
+
- `clawdbot browser fill --fields '[{\"ref\":\"1\",\"value\":\"Ada\"}]'`
|
|
259
|
+
- `clawdbot browser dialog --accept`
|
|
260
|
+
- `clawdbot browser wait --text "Done"`
|
|
261
|
+
- `clawdbot browser evaluate --fn '(el) => el.textContent' --ref 7`
|
|
262
|
+
- `clawdbot browser evaluate --fn "document.querySelector('.my-class').click()"`
|
|
263
|
+
- `clawdbot browser console --level error`
|
|
264
|
+
- `clawdbot browser pdf`
|
|
265
|
+
|
|
266
|
+
Notes:
|
|
267
|
+
- `upload` and `dialog` are **arming** calls; run them before the click/press that triggers the chooser/dialog.
|
|
268
|
+
- `upload` can take a `ref` to auto-click after arming (useful for single-step file uploads).
|
|
269
|
+
- `upload` can also take `inputRef` (aria ref) or `element` (CSS selector) to set `<input type="file">` directly without waiting for a file chooser.
|
|
270
|
+
- The arm default timeout is **2 minutes** (clamped to max 2 minutes); pass `timeoutMs` if you need shorter.
|
|
271
|
+
- `snapshot` defaults to `ai`; `aria` returns an accessibility tree for debugging.
|
|
272
|
+
- `click`/`type` require `ref` from `snapshot --format ai`; use `evaluate` for rare CSS selector one-offs.
|
|
273
|
+
- Avoid `wait` by default; use it only in exceptional cases when there is no reliable UI state to wait on.
|
|
274
|
+
|
|
275
|
+
## Security & privacy notes
|
|
276
|
+
|
|
277
|
+
- The clawd browser profile is app-owned; it may contain logged-in sessions.
|
|
278
|
+
Treat it as sensitive data.
|
|
279
|
+
- The control server must bind to loopback only by default (`127.0.0.1`) unless the
|
|
280
|
+
user explicitly configures a non-loopback URL.
|
|
281
|
+
- Never reuse or copy the user's default Chrome profile.
|
|
282
|
+
- Remote CDP endpoints should be tunneled or protected; CDP is highly privileged.
|
|
283
|
+
|
|
284
|
+
## Non-goals (for the first cut)
|
|
285
|
+
|
|
286
|
+
- Cross-device "sync" of tabs between Mac and Pi.
|
|
287
|
+
- Sharing the user's logged-in Chrome sessions automatically.
|
|
288
|
+
- General-purpose web scraping; this is primarily for "close-the-loop" verification
|
|
289
|
+
and interaction.
|
package/docs/camera.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Camera capture (iOS node + macOS app) for agent use: photos (jpg) and short video clips (mp4)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding or modifying camera capture on iOS nodes or macOS
|
|
5
|
+
- Extending agent-accessible MEDIA temp-file workflows
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Camera capture (agent)
|
|
9
|
+
|
|
10
|
+
Clawdbot supports **camera capture** for agent workflows:
|
|
11
|
+
|
|
12
|
+
- **iOS node** (paired via Gateway): capture a **photo** (`jpg`) or **short video clip** (`mp4`, with optional audio) via `node.invoke`.
|
|
13
|
+
- **Android node** (paired via Gateway): capture a **photo** (`jpg`) or **short video clip** (`mp4`, with optional audio) via `node.invoke`.
|
|
14
|
+
- **macOS app** (node via Gateway): capture a **photo** (`jpg`) or **short video clip** (`mp4`, with optional audio) via `node.invoke`.
|
|
15
|
+
|
|
16
|
+
All camera access is gated behind **user-controlled settings**.
|
|
17
|
+
|
|
18
|
+
## iOS node
|
|
19
|
+
|
|
20
|
+
### User setting (default on)
|
|
21
|
+
|
|
22
|
+
- iOS Settings tab → **Camera** → **Allow Camera** (`camera.enabled`)
|
|
23
|
+
- Default: **on** (missing key is treated as enabled).
|
|
24
|
+
- When off: `camera.*` commands return `CAMERA_DISABLED`.
|
|
25
|
+
|
|
26
|
+
### Commands (via Gateway `node.invoke`)
|
|
27
|
+
|
|
28
|
+
- `camera.list`
|
|
29
|
+
- Response payload:
|
|
30
|
+
- `devices`: array of `{ id, name, position, deviceType }`
|
|
31
|
+
|
|
32
|
+
- `camera.snap`
|
|
33
|
+
- Params:
|
|
34
|
+
- `facing`: `front|back` (default: `front`)
|
|
35
|
+
- `maxWidth`: number (optional; default `1600` on the iOS node)
|
|
36
|
+
- `quality`: `0..1` (optional; default `0.9`)
|
|
37
|
+
- `format`: currently `jpg`
|
|
38
|
+
- `delayMs`: number (optional; default `0`)
|
|
39
|
+
- `deviceId`: string (optional; from `camera.list`)
|
|
40
|
+
- Response payload:
|
|
41
|
+
- `format: "jpg"`
|
|
42
|
+
- `base64: "<...>"`
|
|
43
|
+
- `width`, `height`
|
|
44
|
+
- Payload guard: photos are recompressed to keep the base64 payload under 5 MB.
|
|
45
|
+
|
|
46
|
+
- `camera.clip`
|
|
47
|
+
- Params:
|
|
48
|
+
- `facing`: `front|back` (default: `front`)
|
|
49
|
+
- `durationMs`: number (default `3000`, clamped to a max of `60000`)
|
|
50
|
+
- `includeAudio`: boolean (default `true`)
|
|
51
|
+
- `format`: currently `mp4`
|
|
52
|
+
- `deviceId`: string (optional; from `camera.list`)
|
|
53
|
+
- Response payload:
|
|
54
|
+
- `format: "mp4"`
|
|
55
|
+
- `base64: "<...>"`
|
|
56
|
+
- `durationMs`
|
|
57
|
+
- `hasAudio`
|
|
58
|
+
|
|
59
|
+
### Foreground requirement
|
|
60
|
+
|
|
61
|
+
Like `canvas.*`, the iOS node only allows `camera.*` commands in the **foreground**. Background invocations return `NODE_BACKGROUND_UNAVAILABLE`.
|
|
62
|
+
|
|
63
|
+
### CLI helper (temp files + MEDIA)
|
|
64
|
+
|
|
65
|
+
The easiest way to get attachments is via the CLI helper, which writes decoded media to a temp file and prints `MEDIA:<path>`.
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
clawdbot nodes camera snap --node <id> # default: both front + back (2 MEDIA lines)
|
|
71
|
+
clawdbot nodes camera snap --node <id> --facing front
|
|
72
|
+
clawdbot nodes camera clip --node <id> --duration 3000
|
|
73
|
+
clawdbot nodes camera clip --node <id> --no-audio
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Notes:
|
|
77
|
+
- `nodes camera snap` defaults to **both** facings to give the agent both views.
|
|
78
|
+
- Output files are temporary (in the OS temp directory) unless you build your own wrapper.
|
|
79
|
+
|
|
80
|
+
## Android node
|
|
81
|
+
|
|
82
|
+
### User setting (default on)
|
|
83
|
+
|
|
84
|
+
- Android Settings sheet → **Camera** → **Allow Camera** (`camera.enabled`)
|
|
85
|
+
- Default: **on** (missing key is treated as enabled).
|
|
86
|
+
- When off: `camera.*` commands return `CAMERA_DISABLED`.
|
|
87
|
+
|
|
88
|
+
### Permissions
|
|
89
|
+
|
|
90
|
+
- Android requires runtime permissions:
|
|
91
|
+
- `CAMERA` for both `camera.snap` and `camera.clip`.
|
|
92
|
+
- `RECORD_AUDIO` for `camera.clip` when `includeAudio=true`.
|
|
93
|
+
|
|
94
|
+
If permissions are missing, the app will prompt when possible; if denied, `camera.*` requests fail with a
|
|
95
|
+
`*_PERMISSION_REQUIRED` error.
|
|
96
|
+
|
|
97
|
+
### Foreground requirement
|
|
98
|
+
|
|
99
|
+
Like `canvas.*`, the Android node only allows `camera.*` commands in the **foreground**. Background invocations return `NODE_BACKGROUND_UNAVAILABLE`.
|
|
100
|
+
|
|
101
|
+
### Payload guard
|
|
102
|
+
|
|
103
|
+
Photos are recompressed to keep the base64 payload under 5 MB.
|
|
104
|
+
|
|
105
|
+
## macOS app
|
|
106
|
+
|
|
107
|
+
### User setting (default off)
|
|
108
|
+
|
|
109
|
+
The macOS companion app exposes a checkbox:
|
|
110
|
+
|
|
111
|
+
- **Settings → General → Allow Camera** (`clawdbot.cameraEnabled`)
|
|
112
|
+
- Default: **off**
|
|
113
|
+
- When off: camera requests return “Camera disabled by user”.
|
|
114
|
+
|
|
115
|
+
### CLI helper (node invoke)
|
|
116
|
+
|
|
117
|
+
Use the main `clawdbot` CLI to invoke camera commands on the macOS node.
|
|
118
|
+
|
|
119
|
+
Examples:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
clawdbot nodes camera list --node <id> # list camera ids
|
|
123
|
+
clawdbot nodes camera snap --node <id> # prints MEDIA:<path>
|
|
124
|
+
clawdbot nodes camera snap --node <id> --max-width 1280
|
|
125
|
+
clawdbot nodes camera snap --node <id> --delay-ms 2000
|
|
126
|
+
clawdbot nodes camera snap --node <id> --device-id <id>
|
|
127
|
+
clawdbot nodes camera clip --node <id> --duration 10s # prints MEDIA:<path>
|
|
128
|
+
clawdbot nodes camera clip --node <id> --duration-ms 3000 # prints MEDIA:<path> (legacy flag)
|
|
129
|
+
clawdbot nodes camera clip --node <id> --device-id <id>
|
|
130
|
+
clawdbot nodes camera clip --node <id> --no-audio
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Notes:
|
|
134
|
+
- `clawdbot nodes camera snap` defaults to `maxWidth=1600` unless overridden.
|
|
135
|
+
- On macOS, `camera.snap` waits `delayMs` (default 2000ms) after warm-up/exposure settle before capturing.
|
|
136
|
+
- Photo payloads are recompressed to keep base64 under 5 MB.
|
|
137
|
+
|
|
138
|
+
## Safety + practical limits
|
|
139
|
+
|
|
140
|
+
- Camera and microphone access trigger the usual OS permission prompts (and require usage strings in Info.plist).
|
|
141
|
+
- Video clips are capped (currently `<= 60s`) to avoid oversized bridge payloads (base64 overhead + message limits).
|
|
142
|
+
|
|
143
|
+
## macOS screen video (OS-level)
|
|
144
|
+
|
|
145
|
+
For *screen* video (not camera), use the macOS companion:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
clawdbot nodes screen record --node <id> --duration 10s --fps 15 # prints MEDIA:<path>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Notes:
|
|
152
|
+
- Requires macOS **Screen Recording** permission (TCC).
|