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/health.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Health check steps for Baileys/WhatsApp connectivity"
|
|
3
|
+
read_when:
|
|
4
|
+
- Diagnosing web provider health
|
|
5
|
+
---
|
|
6
|
+
# Health Checks (CLI)
|
|
7
|
+
|
|
8
|
+
Short guide to verify the WhatsApp Web / Baileys stack without guessing.
|
|
9
|
+
|
|
10
|
+
## Quick checks
|
|
11
|
+
- `clawdbot status` — local summary: whether creds exist, auth age, session store path + recent sessions.
|
|
12
|
+
- `clawdbot status --deep` — also probes the running Gateway (WhatsApp connect + Telegram + Discord APIs).
|
|
13
|
+
- `clawdbot health --json` — asks the running Gateway for a full health snapshot (WS-only; no direct Baileys socket).
|
|
14
|
+
- Send `/status` in WhatsApp/WebChat to get a status reply without invoking the agent.
|
|
15
|
+
- Logs: tail `/tmp/clawdbot/clawdbot-*.log` and filter for `web-heartbeat`, `web-reconnect`, `web-auto-reply`, `web-inbound`.
|
|
16
|
+
|
|
17
|
+
## Deep diagnostics
|
|
18
|
+
- Creds on disk: `ls -l ~/.clawdbot/credentials/creds.json` (mtime should be recent).
|
|
19
|
+
- Session store: `ls -l ~/.clawdbot/sessions/sessions.json` (legacy: `~/.clawdbot/sessions.json`; path can be overridden in config). Count and recent recipients are surfaced via `status`.
|
|
20
|
+
- Relink flow: `clawdbot logout && clawdbot login --verbose` when status codes 409–515 or `loggedOut` appear in logs. (Note: the QR login flow auto-restarts once for status 515 after pairing.)
|
|
21
|
+
|
|
22
|
+
## When something fails
|
|
23
|
+
- `logged out` or status 409–515 → relink with `clawdbot logout` then `clawdbot login`.
|
|
24
|
+
- Gateway unreachable → start it: `clawdbot gateway --port 18789` (use `--force` if the port is busy).
|
|
25
|
+
- No inbound messages → confirm linked phone is online and the sender is allowed (`whatsapp.allowFrom`); for group chats, ensure mention rules match (`routing.groupChat.mentionPatterns` and `whatsapp.groups`).
|
|
26
|
+
|
|
27
|
+
## Dedicated "health" command
|
|
28
|
+
`clawdbot health --json` asks the running Gateway for its health snapshot (no direct Baileys socket from the CLI). It reports linked creds, auth age, Baileys connect result/status code, session-store summary, and a probe duration. It exits non-zero if the Gateway is unreachable or the probe fails/timeouts. Use `--timeout <ms>` to override the 10s default.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Plan for heartbeat polling messages and notification rules"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adjusting heartbeat cadence or messaging
|
|
5
|
+
---
|
|
6
|
+
# Heartbeat (Gateway)
|
|
7
|
+
|
|
8
|
+
Heartbeat runs periodic agent turns in the **main session** so the model can
|
|
9
|
+
surface anything that needs attention without spamming the user.
|
|
10
|
+
|
|
11
|
+
## Prompt contract
|
|
12
|
+
- Heartbeat body defaults to `HEARTBEAT` (configurable via `agent.heartbeat.prompt`).
|
|
13
|
+
- If nothing needs attention, the model should reply **exactly** `HEARTBEAT_OK`.
|
|
14
|
+
- During heartbeat runs, Clawdbot treats `HEARTBEAT_OK` as an ack when it appears at
|
|
15
|
+
the **start or end** of the reply. Clawdbot strips the token and discards the
|
|
16
|
+
reply if the remaining content is **≤ 30 characters**.
|
|
17
|
+
- If `HEARTBEAT_OK` is in the **middle** of a reply, it is not treated specially.
|
|
18
|
+
- For alerts, do **not** include `HEARTBEAT_OK`; return only the alert text.
|
|
19
|
+
|
|
20
|
+
### Stray `HEARTBEAT_OK` outside heartbeats
|
|
21
|
+
If the model accidentally includes `HEARTBEAT_OK` at the start or end of a
|
|
22
|
+
normal (non-heartbeat) reply, Clawdbot strips the token and logs a verbose
|
|
23
|
+
message. If the reply is only `HEARTBEAT_OK`, it is dropped.
|
|
24
|
+
|
|
25
|
+
## Config
|
|
26
|
+
|
|
27
|
+
```json5
|
|
28
|
+
{
|
|
29
|
+
agent: {
|
|
30
|
+
heartbeat: {
|
|
31
|
+
every: "30m", // duration string: ms|s|m|h (0m disables)
|
|
32
|
+
model: "anthropic/claude-opus-4-5",
|
|
33
|
+
target: "last", // last | whatsapp | telegram | none
|
|
34
|
+
to: "+15551234567", // optional override for whatsapp/telegram
|
|
35
|
+
prompt: "HEARTBEAT" // optional override
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Fields
|
|
42
|
+
- `every`: heartbeat interval (duration string; default unit minutes). Omit or set
|
|
43
|
+
to `0m` to disable.
|
|
44
|
+
- `model`: optional model override for heartbeat runs (`provider/model`).
|
|
45
|
+
- `target`: where heartbeat output is delivered.
|
|
46
|
+
- `last` (default): send to the last used external channel.
|
|
47
|
+
- `whatsapp` / `telegram`: force the channel (optionally set `to`).
|
|
48
|
+
- `none`: do not deliver externally; output stays in the session (WebChat-visible).
|
|
49
|
+
- `to`: optional recipient override (E.164 for WhatsApp, chat id for Telegram).
|
|
50
|
+
- `prompt`: optional override for the heartbeat body (default: `HEARTBEAT`).
|
|
51
|
+
|
|
52
|
+
## Behavior
|
|
53
|
+
- Runs in the main session (`main`, or `global` when scope is global).
|
|
54
|
+
- Uses the main lane queue; if requests are in flight, the wake is retried.
|
|
55
|
+
- Empty output or `HEARTBEAT_OK` is treated as “ok” and does **not** keep the
|
|
56
|
+
session alive (`updatedAt` is restored).
|
|
57
|
+
- If `target` resolves to no external destination (no last route or `none`), the
|
|
58
|
+
heartbeat still runs but no outbound message is sent.
|
|
59
|
+
|
|
60
|
+
## Wake hook
|
|
61
|
+
- The gateway exposes a heartbeat wake hook so cron/jobs/webhooks can request an
|
|
62
|
+
immediate run (`requestHeartbeatNow`).
|
|
63
|
+
- `wake` endpoints should enqueue system events and optionally trigger a wake; the
|
|
64
|
+
heartbeat runner picks those up on the next tick or immediately.
|
package/docs/images.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Image and media handling rules for send, gateway, and agent replies"
|
|
3
|
+
read_when:
|
|
4
|
+
- Modifying media pipeline or attachments
|
|
5
|
+
---
|
|
6
|
+
<!-- {% raw %} -->
|
|
7
|
+
# Image & Media Support — 2025-12-05
|
|
8
|
+
|
|
9
|
+
CLAWDBOT is now **web-only** (Baileys). This document captures the current media handling rules for send, gateway, and agent replies.
|
|
10
|
+
|
|
11
|
+
## Goals
|
|
12
|
+
- Send media with optional captions via `clawdbot send --media`.
|
|
13
|
+
- Allow auto-replies from the web inbox to include media alongside text.
|
|
14
|
+
- Keep per-type limits sane and predictable.
|
|
15
|
+
|
|
16
|
+
## CLI Surface
|
|
17
|
+
- `clawdbot send --media <path-or-url> [--message <caption>]`
|
|
18
|
+
- `--media` optional; caption can be empty for media-only sends.
|
|
19
|
+
- `--dry-run` prints the resolved payload; `--json` emits `{ provider, to, messageId, mediaUrl, caption }`.
|
|
20
|
+
|
|
21
|
+
## Web Provider Behavior
|
|
22
|
+
- Input: local file path **or** HTTP(S) URL.
|
|
23
|
+
- Flow: load into a Buffer, detect media kind, and build the correct payload:
|
|
24
|
+
- **Images:** resize & recompress to JPEG (max side 2048px) targeting `agent.mediaMaxMb` (default 5 MB), capped at 6 MB.
|
|
25
|
+
- **Audio/Voice/Video:** pass-through up to 16 MB; audio is sent as a voice note (`ptt: true`).
|
|
26
|
+
- **Documents:** anything else, up to 100 MB, with filename preserved when available.
|
|
27
|
+
- WhatsApp GIF-style playback: send an MP4 with `gifPlayback: true` (CLI: `--gif-playback`) so mobile clients loop inline.
|
|
28
|
+
- MIME detection prefers magic bytes, then headers, then file extension.
|
|
29
|
+
- Caption comes from `--message` or `reply.text`; empty caption is allowed.
|
|
30
|
+
- Logging: non-verbose shows `↩️`/`✅`; verbose includes size and source path/URL.
|
|
31
|
+
|
|
32
|
+
## Auto-Reply Pipeline
|
|
33
|
+
- `getReplyFromConfig` returns `{ text?, mediaUrl?, mediaUrls? }`.
|
|
34
|
+
- When media is present, the web sender resolves local paths or URLs using the same pipeline as `clawdbot send`.
|
|
35
|
+
- Multiple media entries are sent sequentially if provided.
|
|
36
|
+
|
|
37
|
+
## Inbound Media to Commands (Pi)
|
|
38
|
+
- When inbound web messages include media, CLAWDBOT downloads to a temp file and exposes templating variables:
|
|
39
|
+
- `{{MediaUrl}}` pseudo-URL for the inbound media.
|
|
40
|
+
- `{{MediaPath}}` local temp path written before running the command.
|
|
41
|
+
- Audio transcription (if configured) runs before templating and can replace `Body` with the transcript.
|
|
42
|
+
|
|
43
|
+
## Limits & Errors
|
|
44
|
+
- Images: ~6 MB cap after recompression.
|
|
45
|
+
- Audio/voice/video: 16 MB cap; documents: 100 MB cap.
|
|
46
|
+
- Oversize or unreadable media → clear error in logs and the reply is skipped.
|
|
47
|
+
|
|
48
|
+
## Notes for Tests
|
|
49
|
+
- Cover send + reply flows for image/audio/document cases.
|
|
50
|
+
- Validate recompression for images (size bound) and voice-note flag for audio.
|
|
51
|
+
- Ensure multi-media replies fan out as sequential sends.
|
|
52
|
+
<!-- {% endraw %} -->
|
package/docs/imessage.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "iMessage support via imsg (JSON-RPC over stdio), setup, and chat_id routing"
|
|
3
|
+
read_when:
|
|
4
|
+
- Setting up iMessage support
|
|
5
|
+
- Debugging iMessage send/receive
|
|
6
|
+
---
|
|
7
|
+
# iMessage (imsg)
|
|
8
|
+
|
|
9
|
+
Status: external CLI integration. No daemon.
|
|
10
|
+
|
|
11
|
+
## Model
|
|
12
|
+
- Clawdbot spawns `imsg rpc` as a child process.
|
|
13
|
+
- JSON-RPC runs over stdin/stdout (one JSON object per line).
|
|
14
|
+
- Gateway owns the process; no TCP port needed.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
- macOS with Messages signed in.
|
|
18
|
+
- Full Disk Access for Clawdbot + the `imsg` binary (Messages DB access).
|
|
19
|
+
- Automation permission for Messages when sending.
|
|
20
|
+
|
|
21
|
+
## Config
|
|
22
|
+
|
|
23
|
+
```json5
|
|
24
|
+
{
|
|
25
|
+
imessage: {
|
|
26
|
+
enabled: true,
|
|
27
|
+
cliPath: "imsg",
|
|
28
|
+
dbPath: "~/Library/Messages/chat.db",
|
|
29
|
+
allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
|
|
30
|
+
includeAttachments: false,
|
|
31
|
+
mediaMaxMb: 16,
|
|
32
|
+
service: "auto",
|
|
33
|
+
region: "US"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Notes:
|
|
39
|
+
- `allowFrom` accepts handles (phone/email) or `chat_id:<id>` entries.
|
|
40
|
+
- `service` defaults to `auto` (use `imessage` or `sms` to pin).
|
|
41
|
+
- `region` is only used for SMS targeting.
|
|
42
|
+
|
|
43
|
+
## Addressing / targets
|
|
44
|
+
|
|
45
|
+
Prefer `chat_id` for stable routing:
|
|
46
|
+
- `chat_id:123` (preferred)
|
|
47
|
+
- `chat_guid:...` (fallback)
|
|
48
|
+
- `chat_identifier:...` (fallback)
|
|
49
|
+
- direct handles: `imessage:+1555` / `sms:+1555` / `user@example.com`
|
|
50
|
+
|
|
51
|
+
List chats:
|
|
52
|
+
```
|
|
53
|
+
imsg chats --limit 20
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Group chat behavior
|
|
57
|
+
- Group messages set `ChatType=group`, `GroupSubject`, and `GroupMembers`.
|
|
58
|
+
- Group activation respects `imessage.groups."*".requireMention` and `routing.groupChat.mentionPatterns`.
|
|
59
|
+
- Replies go back to the same `chat_id` (group or direct).
|
|
60
|
+
|
|
61
|
+
## Troubleshooting
|
|
62
|
+
- `clawdbot gateway call providers.status --params '{"probe":true}'`
|
|
63
|
+
- Verify `imsg` is on PATH and has access to Messages DB.
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Top-level overview of Clawdbot, features, and purpose"
|
|
3
|
+
read_when:
|
|
4
|
+
- Introducing Clawdbot to newcomers
|
|
5
|
+
---
|
|
6
|
+
<!-- {% raw %} -->
|
|
7
|
+
# CLAWDBOT 🦞
|
|
8
|
+
|
|
9
|
+
> *"EXFOLIATE! EXFOLIATE!"* — A space lobster, probably
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="whatsapp-clawd.jpg" alt="CLAWDBOT" width="420">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<strong>WhatsApp + Telegram + Discord + iMessage gateway for AI agents (Pi).</strong><br>
|
|
17
|
+
Send a message, get an agent response — from your pocket.
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="https://github.com/clawdbot/clawdbot">GitHub</a> ·
|
|
22
|
+
<a href="https://github.com/clawdbot/clawdbot/releases">Releases</a> ·
|
|
23
|
+
<a href="./clawd.md">Clawd setup</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
CLAWDBOT bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / discord.js), and iMessage (imsg CLI) to coding agents like [Pi](https://github.com/badlogic/pi-mono).
|
|
27
|
+
It’s built for [Clawd](https://clawd.me), a space lobster who needed a TARDIS.
|
|
28
|
+
|
|
29
|
+
## How it works
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
WhatsApp / Telegram / Discord
|
|
33
|
+
│
|
|
34
|
+
▼
|
|
35
|
+
┌──────────────────────────┐
|
|
36
|
+
│ Gateway │ ws://127.0.0.1:18789 (loopback-only)
|
|
37
|
+
│ (single source) │ tcp://0.0.0.0:18790 (Bridge)
|
|
38
|
+
│ │ http://<gateway-host>:18793/__clawdbot__/canvas/ (Canvas host)
|
|
39
|
+
└───────────┬───────────────┘
|
|
40
|
+
│
|
|
41
|
+
├─ Pi agent (RPC)
|
|
42
|
+
├─ CLI (clawdbot …)
|
|
43
|
+
├─ Chat UI (SwiftUI)
|
|
44
|
+
├─ macOS app (Clawdbot.app)
|
|
45
|
+
└─ iOS node via Bridge + pairing
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Most operations flow through the **Gateway** (`clawdbot gateway`), a single long-running process that owns provider connections and the WebSocket control plane.
|
|
49
|
+
|
|
50
|
+
## Network model
|
|
51
|
+
|
|
52
|
+
- **One Gateway per host**: it is the only process allowed to own the WhatsApp Web session.
|
|
53
|
+
- **Loopback-first**: Gateway WS defaults to `ws://127.0.0.1:18789`.
|
|
54
|
+
- For Tailnet access, run `clawdbot gateway --bind tailnet --token ...` (token is required for non-loopback binds).
|
|
55
|
+
- **Bridge for nodes**: optional LAN/tailnet-facing bridge on `tcp://0.0.0.0:18790` for paired nodes (Bonjour-discoverable).
|
|
56
|
+
- **Canvas host**: HTTP file server on `canvasHost.port` (default `18793`), serving `/__clawdbot__/canvas/` for node WebViews; see `docs/configuration.md` (`canvasHost`).
|
|
57
|
+
- **Remote use**: SSH tunnel or tailnet/VPN; see `docs/remote.md` and `docs/discovery.md`.
|
|
58
|
+
|
|
59
|
+
## Features (high level)
|
|
60
|
+
|
|
61
|
+
- 📱 **WhatsApp Integration** — Uses Baileys for WhatsApp Web protocol
|
|
62
|
+
- ✈️ **Telegram Bot** — DMs + groups via grammY
|
|
63
|
+
- 🎮 **Discord Bot** — DMs + guild channels via discord.js
|
|
64
|
+
- 💬 **iMessage** — Local imsg CLI integration (macOS)
|
|
65
|
+
- 🤖 **Agent bridge** — Pi (RPC mode) with tool streaming
|
|
66
|
+
- 💬 **Sessions** — Direct chats collapse into shared `main` (default); groups are isolated
|
|
67
|
+
- 👥 **Group Chat Support** — Mention-based by default; owner can toggle `/activation always|mention`
|
|
68
|
+
- 📎 **Media Support** — Send and receive images, audio, documents
|
|
69
|
+
- 🎤 **Voice notes** — Optional transcription hook
|
|
70
|
+
- 🖥️ **WebChat + macOS app** — Local UI + menu bar companion for ops and voice wake
|
|
71
|
+
- 📱 **iOS node** — Pairs as a node and exposes a Canvas surface
|
|
72
|
+
|
|
73
|
+
Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.
|
|
74
|
+
|
|
75
|
+
## Quick start
|
|
76
|
+
|
|
77
|
+
Runtime requirement: **Node ≥ 22**.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# From source (recommended while the npm package is still settling)
|
|
81
|
+
pnpm install
|
|
82
|
+
pnpm build
|
|
83
|
+
pnpm link --global
|
|
84
|
+
|
|
85
|
+
# Pair WhatsApp Web (shows QR)
|
|
86
|
+
clawdbot login
|
|
87
|
+
|
|
88
|
+
# Run the Gateway (leave running)
|
|
89
|
+
clawdbot gateway --port 18789
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Multi-instance quickstart (optional):
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
CLAWDBOT_CONFIG_PATH=~/.clawdbot/a.json \
|
|
96
|
+
CLAWDBOT_STATE_DIR=~/.clawdbot-a \
|
|
97
|
+
clawdbot gateway --port 19001
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Send a test message (requires a running Gateway):
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
clawdbot send --to +15555550123 --message "Hello from CLAWDBOT"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Configuration (optional)
|
|
107
|
+
|
|
108
|
+
Config lives at `~/.clawdbot/clawdbot.json`.
|
|
109
|
+
|
|
110
|
+
- If you **do nothing**, CLAWDBOT uses the bundled Pi binary in RPC mode with per-sender sessions.
|
|
111
|
+
- If you want to lock it down, start with `whatsapp.allowFrom` and (for groups) mention rules.
|
|
112
|
+
|
|
113
|
+
Example:
|
|
114
|
+
|
|
115
|
+
```json5
|
|
116
|
+
{
|
|
117
|
+
whatsapp: {
|
|
118
|
+
allowFrom: ["+15555550123"],
|
|
119
|
+
groups: { "*": { requireMention: true } }
|
|
120
|
+
},
|
|
121
|
+
routing: { groupChat: { mentionPatterns: ["@clawd"] } }
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Docs
|
|
126
|
+
|
|
127
|
+
- Start here:
|
|
128
|
+
- [FAQ](./faq.md) ← *common questions answered*
|
|
129
|
+
- [Configuration](./configuration.md)
|
|
130
|
+
- [Nix mode](./nix.md)
|
|
131
|
+
- [Clawd personal assistant setup](./clawd.md)
|
|
132
|
+
- [Skills](./skills.md)
|
|
133
|
+
- [Skills config](./skills-config.md)
|
|
134
|
+
- [Workspace templates](./templates/AGENTS.md)
|
|
135
|
+
- [RPC adapters](./rpc.md)
|
|
136
|
+
- [Gateway runbook](./gateway.md)
|
|
137
|
+
- [Nodes (iOS/Android)](./nodes.md)
|
|
138
|
+
- [Web surfaces (Control UI)](./web.md)
|
|
139
|
+
- [Discovery + transports](./discovery.md)
|
|
140
|
+
- [Remote access](./remote.md)
|
|
141
|
+
- Providers and UX:
|
|
142
|
+
- [WebChat](./webchat.md)
|
|
143
|
+
- [Control UI (browser)](./control-ui.md)
|
|
144
|
+
- [Telegram](./telegram.md)
|
|
145
|
+
- [Discord](./discord.md)
|
|
146
|
+
- [iMessage](./imessage.md)
|
|
147
|
+
- [Groups](./groups.md)
|
|
148
|
+
- [WhatsApp group messages](./group-messages.md)
|
|
149
|
+
- [Media: images](./images.md)
|
|
150
|
+
- [Media: audio](./audio.md)
|
|
151
|
+
- Ops and safety:
|
|
152
|
+
- [Sessions](./session.md)
|
|
153
|
+
- [Cron + wakeups](./cron.md)
|
|
154
|
+
- [Security](./security.md)
|
|
155
|
+
- [Troubleshooting](./troubleshooting.md)
|
|
156
|
+
|
|
157
|
+
## The name
|
|
158
|
+
|
|
159
|
+
**CLAWDBOT = CLAW + TARDIS** — because every space lobster needs a time-and-space machine.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
*"We're all just playing with our own prompts."* — an AI, probably high on tokens
|
|
164
|
+
<!-- {% endraw %} -->
|
|
165
|
+
|
|
166
|
+
## Credits
|
|
167
|
+
|
|
168
|
+
- **Peter Steinberger** ([@steipete](https://twitter.com/steipete)) — Creator, lobster whisperer
|
|
169
|
+
- **Mario Zechner** ([@badlogicc](https://twitter.com/badlogicgames)) — Pi creator, security pen-tester
|
|
170
|
+
- **Clawd** — The space lobster who demanded a better name
|
|
171
|
+
|
|
172
|
+
## Core Contributors
|
|
173
|
+
|
|
174
|
+
- **Maxim Vovshin** (@Hyaxia, 36747317+Hyaxia@users.noreply.github.com) — Blogwatcher skill
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
MIT — Free as a lobster in the ocean 🦞
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
*"We're all just playing with our own prompts."* — An AI, probably high on tokens
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Runbook: connect/pair the iOS node to a Clawdbot Gateway and drive its Canvas"
|
|
3
|
+
read_when:
|
|
4
|
+
- Pairing or reconnecting the iOS node
|
|
5
|
+
- Debugging iOS bridge discovery or auth
|
|
6
|
+
- Sending screen/canvas commands to iOS
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# iOS Node Connection Runbook
|
|
10
|
+
|
|
11
|
+
This is the practical “how do I connect the iOS node” guide:
|
|
12
|
+
|
|
13
|
+
**iOS app** ⇄ (Bonjour + TCP bridge) ⇄ **Gateway bridge** ⇄ (loopback WS) ⇄ **Gateway**
|
|
14
|
+
|
|
15
|
+
The Gateway WebSocket stays loopback-only (`ws://127.0.0.1:18789`). The iOS node talks to the LAN-facing **bridge** (default `tcp://0.0.0.0:18790`) and uses Gateway-owned pairing.
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
- You can run the Gateway on the “master” machine.
|
|
20
|
+
- iOS node app can reach the gateway bridge:
|
|
21
|
+
- Same LAN with Bonjour/mDNS, **or**
|
|
22
|
+
- Same Tailscale tailnet using Wide-Area Bonjour / unicast DNS-SD (see below), **or**
|
|
23
|
+
- Manual bridge host/port (fallback)
|
|
24
|
+
- You can run the CLI (`clawdbot`) on the gateway machine (or via SSH).
|
|
25
|
+
|
|
26
|
+
## 1) Start the Gateway (with bridge enabled)
|
|
27
|
+
|
|
28
|
+
Bridge is enabled by default (disable via `CLAWDBOT_BRIDGE_ENABLED=0`).
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pnpm clawdbot gateway --port 18789 --verbose
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Confirm in logs you see something like:
|
|
35
|
+
- `bridge listening on tcp://0.0.0.0:18790 (node)`
|
|
36
|
+
|
|
37
|
+
For tailnet-only setups (recommended for Vienna ⇄ London), bind the bridge to the gateway machine’s Tailscale IP instead:
|
|
38
|
+
|
|
39
|
+
- Set `bridge.bind: "tailnet"` in `~/.clawdbot/clawdbot.json` on the gateway host.
|
|
40
|
+
- Restart the Gateway / macOS menubar app.
|
|
41
|
+
|
|
42
|
+
## 2) Verify Bonjour discovery (optional but recommended)
|
|
43
|
+
|
|
44
|
+
From the gateway machine:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
dns-sd -B _clawdbot-bridge._tcp local.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
You should see your gateway advertising `_clawdbot-bridge._tcp`.
|
|
51
|
+
|
|
52
|
+
If browse works, but the iOS node can’t connect, try resolving one instance:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
dns-sd -L "<instance name>" _clawdbot-bridge._tcp local.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
More debugging notes: `docs/bonjour.md`.
|
|
59
|
+
|
|
60
|
+
### Tailnet (Vienna ⇄ London) discovery via unicast DNS-SD
|
|
61
|
+
|
|
62
|
+
If the iOS node and the gateway are on different networks but connected via Tailscale, multicast mDNS won’t cross the boundary. Use Wide-Area Bonjour / unicast DNS-SD instead:
|
|
63
|
+
|
|
64
|
+
1) Set up a DNS-SD zone (example `clawdbot.internal.`) on the gateway host and publish `_clawdbot-bridge._tcp` records.
|
|
65
|
+
2) Configure Tailscale split DNS for `clawdbot.internal` pointing at that DNS server.
|
|
66
|
+
|
|
67
|
+
Details and example CoreDNS config: `docs/bonjour.md`.
|
|
68
|
+
|
|
69
|
+
## 3) Connect from the iOS node app
|
|
70
|
+
|
|
71
|
+
In the iOS node app:
|
|
72
|
+
- Pick the discovered bridge (or hit refresh).
|
|
73
|
+
- If not paired yet, it will initiate pairing automatically.
|
|
74
|
+
- After the first successful pairing, it will auto-reconnect **strictly to the last discovered gateway** on launch (including after reinstall), as long as the iOS Keychain entry is still present.
|
|
75
|
+
|
|
76
|
+
### Connection indicator (always visible)
|
|
77
|
+
|
|
78
|
+
The Settings tab icon shows a small status dot:
|
|
79
|
+
- **Green**: connected to the bridge
|
|
80
|
+
- **Yellow**: connecting (subtle pulse)
|
|
81
|
+
- **Red**: not connected / error
|
|
82
|
+
|
|
83
|
+
## 4) Approve pairing (CLI)
|
|
84
|
+
|
|
85
|
+
On the gateway machine:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
clawdbot nodes pending
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Approve the request:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
clawdbot nodes approve <requestId>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
After approval, the iOS node receives/stores the token and reconnects authenticated.
|
|
98
|
+
|
|
99
|
+
Pairing details: `docs/gateway/pairing.md`.
|
|
100
|
+
|
|
101
|
+
## 5) Verify the node is connected
|
|
102
|
+
|
|
103
|
+
- In the macOS app: **Instances** tab should show something like `iOS Node (...)` with a green “Active” presence dot shortly after connect.
|
|
104
|
+
- Via nodes status (paired + connected):
|
|
105
|
+
```bash
|
|
106
|
+
clawdbot nodes status
|
|
107
|
+
```
|
|
108
|
+
- Via Gateway (paired + connected):
|
|
109
|
+
```bash
|
|
110
|
+
clawdbot gateway call node.list --params "{}"
|
|
111
|
+
```
|
|
112
|
+
- Via Gateway presence (legacy-ish, still useful):
|
|
113
|
+
```bash
|
|
114
|
+
clawdbot gateway call system-presence --params "{}"
|
|
115
|
+
```
|
|
116
|
+
Look for the node `instanceId` (often a UUID).
|
|
117
|
+
|
|
118
|
+
## 6) Drive the iOS Canvas (draw / snapshot)
|
|
119
|
+
|
|
120
|
+
The iOS node runs a WKWebView “Canvas” scaffold which exposes:
|
|
121
|
+
- `window.__clawdbot.canvas`
|
|
122
|
+
- `window.__clawdbot.ctx` (2D context)
|
|
123
|
+
- `window.__clawdbot.setStatus(title, subtitle)`
|
|
124
|
+
|
|
125
|
+
### Gateway Canvas Host (recommended for web content)
|
|
126
|
+
|
|
127
|
+
If you want the node to show real HTML/CSS/JS that the agent can edit on disk, point it at the Gateway canvas host.
|
|
128
|
+
|
|
129
|
+
Note: nodes always use the standalone canvas host on `canvasHost.port` (default `18793`), bound to the bridge interface.
|
|
130
|
+
|
|
131
|
+
1) Create `~/clawd/canvas/index.html` on the gateway host.
|
|
132
|
+
|
|
133
|
+
2) Navigate the node to it (LAN):
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
clawdbot nodes invoke --node "iOS Node" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__clawdbot__/canvas/"}'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Notes:
|
|
140
|
+
- The server injects a live-reload client into HTML and reloads on file changes.
|
|
141
|
+
- A2UI is hosted on the same canvas host at `http://<gateway-host>:18793/__clawdbot__/a2ui/`.
|
|
142
|
+
- Tailnet (optional): if both devices are on Tailscale, use a MagicDNS name or tailnet IP instead of `.local`, e.g. `http://<gateway-magicdns>:18793/__clawdbot__/canvas/`.
|
|
143
|
+
- iOS may require App Transport Security allowances to load plain `http://` URLs; if it fails to load, prefer HTTPS or adjust the iOS app’s ATS config.
|
|
144
|
+
|
|
145
|
+
### Draw with `canvas.eval`
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
clawdbot nodes invoke --node "iOS Node" --command canvas.eval --params "$(cat <<'JSON'
|
|
149
|
+
{"javaScript":"(() => { const {ctx,setStatus} = window.__clawdbot; setStatus('Drawing','…'); ctx.clearRect(0,0,innerWidth,innerHeight); ctx.lineWidth=6; ctx.strokeStyle='#ff2d55'; ctx.beginPath(); ctx.moveTo(40,40); ctx.lineTo(innerWidth-40, innerHeight-40); ctx.stroke(); setStatus(null,null); return 'ok'; })()"}
|
|
150
|
+
JSON
|
|
151
|
+
)"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Snapshot with `canvas.snapshot`
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
clawdbot nodes invoke --node 192.168.0.88 --command canvas.snapshot --params '{"maxWidth":900}'
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The response includes `{ format, base64 }` image data (default `format="jpeg"`; pass `{"format":"png"}` when you specifically need lossless PNG).
|
|
161
|
+
|
|
162
|
+
## Common gotchas
|
|
163
|
+
|
|
164
|
+
- **iOS in background:** all `canvas.*` commands fail fast with `NODE_BACKGROUND_UNAVAILABLE` (bring the iOS node app to foreground).
|
|
165
|
+
- **Return to default scaffold:** `canvas.navigate` with `{"url":""}` or `{"url":"/"}` returns to the built-in scaffold page.
|
|
166
|
+
- **mDNS blocked:** some networks block multicast; use a different LAN or plan a tailnet-capable bridge (see `docs/discovery.md`).
|
|
167
|
+
- **Wrong node selector:** `--node` can be the node id (UUID), display name (e.g. `iOS Node`), IP, or an unambiguous prefix. If it’s ambiguous, the CLI will tell you.
|
|
168
|
+
- **Stale pairing / Keychain cleared:** if the pairing token is missing (or iOS Keychain was wiped), the node must pair again; approve a new pending request.
|
|
169
|
+
- **App reinstall but no reconnect:** the node restores `instanceId` + last bridge preference from Keychain; if it still comes up “unpaired”, verify Keychain persistence on your device/simulator and re-pair once.
|
|
170
|
+
|
|
171
|
+
## Related docs
|
|
172
|
+
|
|
173
|
+
- `docs/ios/spec.md` (design + architecture)
|
|
174
|
+
- `docs/gateway.md` (gateway runbook)
|
|
175
|
+
- `docs/gateway/pairing.md` (approval + storage)
|
|
176
|
+
- `docs/bonjour.md` (discovery debugging)
|
|
177
|
+
- `docs/discovery.md` (LAN vs tailnet vs SSH)
|