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/typebox.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "TypeBox schemas as the single source of truth for the gateway protocol"
|
|
3
|
+
read_when:
|
|
4
|
+
- Updating protocol schemas or codegen
|
|
5
|
+
---
|
|
6
|
+
# TypeBox as Protocol Source of Truth
|
|
7
|
+
|
|
8
|
+
Last updated: 2025-12-09
|
|
9
|
+
|
|
10
|
+
We use TypeBox schemas in `src/gateway/protocol/schema.ts` as the single source of truth for the Gateway control plane (connect/req/res/event frames and payloads). All derived artifacts should be generated from these schemas, not edited by hand.
|
|
11
|
+
|
|
12
|
+
## Current pipeline
|
|
13
|
+
|
|
14
|
+
- **TypeBox → JSON Schema**: `pnpm protocol:gen` writes `dist/protocol.schema.json` (draft-07) and runs AJV in the server tests.
|
|
15
|
+
- **TypeBox → Swift**: `pnpm protocol:gen:swift` generates `apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift`.
|
|
16
|
+
|
|
17
|
+
## Problem
|
|
18
|
+
|
|
19
|
+
- We want strong typing in Swift, including a sealed `GatewayFrame` enum with a discriminator and a forward-compatible `unknown` case.
|
|
20
|
+
|
|
21
|
+
## Preferred plan (next step)
|
|
22
|
+
|
|
23
|
+
- Add a small, custom Swift generator driven directly by the TypeBox schemas:
|
|
24
|
+
- Emit a sealed `enum GatewayFrame: Codable { case req(RequestFrame), res(ResponseFrame), event(EventFrame) }`.
|
|
25
|
+
- Emit strongly typed payload structs/enums (`ConnectParams`, `HelloOk`, `RequestFrame`, `ResponseFrame`, `EventFrame`, `PresenceEntry`, `Snapshot`, `StateVersion`, `ErrorShape`, `AgentEvent`, `TickEvent`, `ShutdownEvent`, `SendParams`, `AgentParams`, `ErrorCode`, `PROTOCOL_VERSION`).
|
|
26
|
+
- Custom `init(from:)` / `encode(to:)` enforces the `type` discriminator and can include an `unknown` case for forward compatibility.
|
|
27
|
+
- Wire a new script (e.g., `pnpm protocol:gen:swift`) into `protocol:check` so CI fails if the generated Swift is stale.
|
|
28
|
+
|
|
29
|
+
Why this path:
|
|
30
|
+
- Single source of truth stays TypeBox; no new IDL to maintain.
|
|
31
|
+
- Predictable, strongly typed Swift (no optional soup).
|
|
32
|
+
- Small deterministic codegen (~150–200 LOC script) we control.
|
|
33
|
+
|
|
34
|
+
## Alternative (if we want off-the-shelf codegen)
|
|
35
|
+
|
|
36
|
+
- Wrap the existing JSON Schema into an OpenAPI 3.1 doc (auto-generated) and use **swift-openapi-generator** or **openapi-generator swift5**. More moving parts, but also yields enums with discriminator support. Keep this as a fallback if we don’t want a custom emitter.
|
|
37
|
+
|
|
38
|
+
## Action items
|
|
39
|
+
|
|
40
|
+
- Implement `protocol:gen:swift` that reads the TypeBox schemas and emits the sealed Swift enum + payload structs.
|
|
41
|
+
- Update `protocol:check` to include the Swift generator output in the diff check.
|
|
42
|
+
- Remove quicktype output once the custom generator is in place (or keep it for docs only).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Global voice wake words (Gateway-owned) and how they sync across nodes"
|
|
3
|
+
read_when:
|
|
4
|
+
- Changing voice wake words behavior or defaults
|
|
5
|
+
- Adding new node platforms that need wake word sync
|
|
6
|
+
---
|
|
7
|
+
# Voice Wake (Global Wake Words)
|
|
8
|
+
|
|
9
|
+
Clawdbot treats **wake words as a single global list** owned by the **Gateway**.
|
|
10
|
+
|
|
11
|
+
- There are **no per-node custom wake words**.
|
|
12
|
+
- **Any node/app UI may edit** the list; changes are persisted by the Gateway and broadcast to everyone.
|
|
13
|
+
- Each device still keeps its own **Voice Wake enabled/disabled** toggle (local UX + permissions differ).
|
|
14
|
+
|
|
15
|
+
## Storage (Gateway host)
|
|
16
|
+
|
|
17
|
+
Wake words are stored on the gateway machine at:
|
|
18
|
+
|
|
19
|
+
- `~/.clawdbot/settings/voicewake.json`
|
|
20
|
+
|
|
21
|
+
Shape:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{ "triggers": ["clawd", "claude", "computer"], "updatedAtMs": 1730000000000 }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Protocol
|
|
28
|
+
|
|
29
|
+
### Methods
|
|
30
|
+
|
|
31
|
+
- `voicewake.get` → `{ triggers: string[] }`
|
|
32
|
+
- `voicewake.set` with params `{ triggers: string[] }` → `{ triggers: string[] }`
|
|
33
|
+
|
|
34
|
+
Notes:
|
|
35
|
+
- Triggers are normalized (trimmed, empties dropped). Empty lists fall back to defaults.
|
|
36
|
+
- Limits are enforced for safety (count/length caps).
|
|
37
|
+
|
|
38
|
+
### Events
|
|
39
|
+
|
|
40
|
+
- `voicewake.changed` payload `{ triggers: string[] }`
|
|
41
|
+
|
|
42
|
+
Who receives it:
|
|
43
|
+
- All WebSocket clients (macOS app, WebChat, etc.)
|
|
44
|
+
- All connected bridge nodes (iOS/Android), and also on node connect as an initial “current state” push.
|
|
45
|
+
|
|
46
|
+
## Client behavior
|
|
47
|
+
|
|
48
|
+
### macOS app
|
|
49
|
+
|
|
50
|
+
- Uses the global list to gate `VoiceWakeRuntime` triggers.
|
|
51
|
+
- Editing “Trigger words” in Voice Wake settings calls `voicewake.set` and then relies on the broadcast to keep other clients in sync.
|
|
52
|
+
|
|
53
|
+
### iOS node
|
|
54
|
+
|
|
55
|
+
- Uses the global list for `VoiceWakeManager` trigger detection.
|
|
56
|
+
- Editing Wake Words in Settings calls `voicewake.set` (over the bridge) and also keeps local wake-word detection responsive.
|
|
57
|
+
|
|
58
|
+
### Android node
|
|
59
|
+
|
|
60
|
+
- Exposes a Wake Words editor in Settings.
|
|
61
|
+
- Calls `voicewake.set` over the bridge so edits sync everywhere.
|
package/docs/web.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway web surfaces: Control UI, bind modes, and security"
|
|
3
|
+
read_when:
|
|
4
|
+
- You want to access the Gateway over Tailscale
|
|
5
|
+
- You want the browser Control UI and config editing
|
|
6
|
+
---
|
|
7
|
+
# Web (Gateway)
|
|
8
|
+
|
|
9
|
+
The Gateway serves a small **browser Control UI** (Vite + Lit) from the same port as the Gateway WebSocket:
|
|
10
|
+
|
|
11
|
+
- default: `http://<host>:18789/`
|
|
12
|
+
- optional prefix: set `gateway.controlUi.basePath` (e.g. `/clawdbot`)
|
|
13
|
+
|
|
14
|
+
The UI talks directly to the Gateway WS and supports:
|
|
15
|
+
- Chat (`chat.history`, `chat.send`, `chat.abort`)
|
|
16
|
+
- Chat tool cards (agent tool events)
|
|
17
|
+
- Connections (provider status, WhatsApp QR, Telegram config)
|
|
18
|
+
- Instances (`system-presence`)
|
|
19
|
+
- Sessions (`sessions.list`, `sessions.patch`)
|
|
20
|
+
- Cron (`cron.*`)
|
|
21
|
+
- Skills (`skills.status`, `skills.update`, `skills.install`)
|
|
22
|
+
- Nodes (`node.list`, `node.describe`, `node.invoke`)
|
|
23
|
+
- Config (`config.get`, `config.set`) for `~/.clawdbot/clawdbot.json`
|
|
24
|
+
- Debug (status/health/models snapshots + manual calls)
|
|
25
|
+
|
|
26
|
+
## Webhooks
|
|
27
|
+
|
|
28
|
+
When `hooks.enabled=true`, the Gateway also exposes a small webhook surface on the same HTTP server.
|
|
29
|
+
See `docs/configuration.md` → `hooks` for auth + payloads.
|
|
30
|
+
|
|
31
|
+
## Config (default-on)
|
|
32
|
+
|
|
33
|
+
The Control UI is **enabled by default** when assets are present (`dist/control-ui`).
|
|
34
|
+
You can control it via config:
|
|
35
|
+
|
|
36
|
+
```json5
|
|
37
|
+
{
|
|
38
|
+
gateway: {
|
|
39
|
+
controlUi: { enabled: true, basePath: "/clawdbot" } // basePath optional
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Tailscale access
|
|
45
|
+
|
|
46
|
+
### Integrated Serve (recommended)
|
|
47
|
+
|
|
48
|
+
Keep the Gateway on loopback and let Tailscale Serve proxy it:
|
|
49
|
+
|
|
50
|
+
```json5
|
|
51
|
+
{
|
|
52
|
+
gateway: {
|
|
53
|
+
bind: "loopback",
|
|
54
|
+
tailscale: { mode: "serve" }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Then start the gateway:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
clawdbot gateway
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Open:
|
|
66
|
+
- `https://<magicdns>/` (or your configured `gateway.controlUi.basePath`)
|
|
67
|
+
|
|
68
|
+
### Tailnet bind + token (legacy)
|
|
69
|
+
|
|
70
|
+
```json5
|
|
71
|
+
{
|
|
72
|
+
gateway: {
|
|
73
|
+
bind: "tailnet",
|
|
74
|
+
controlUi: { enabled: true }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Then start the gateway (token required for non-loopback binds):
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
export CLAWDBOT_GATEWAY_TOKEN="…your token…"
|
|
83
|
+
clawdbot gateway
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Open:
|
|
87
|
+
- `http://<tailscale-ip>:18789/` (or your configured `gateway.controlUi.basePath`)
|
|
88
|
+
|
|
89
|
+
### Public internet (Funnel)
|
|
90
|
+
|
|
91
|
+
```json5
|
|
92
|
+
{
|
|
93
|
+
gateway: {
|
|
94
|
+
bind: "loopback",
|
|
95
|
+
tailscale: { mode: "funnel" },
|
|
96
|
+
auth: { mode: "password" } // or CLAWDBOT_GATEWAY_PASSWORD
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Security notes
|
|
102
|
+
|
|
103
|
+
- Binding the Gateway to a non-loopback address **requires** auth (`CLAWDBOT_GATEWAY_TOKEN` or `gateway.auth`).
|
|
104
|
+
- The UI sends `connect.params.auth.token` or `connect.params.auth.password`.
|
|
105
|
+
- Use `gateway.auth.allowTailscale: false` to require explicit credentials even in Serve mode.
|
|
106
|
+
- `gateway.tailscale.mode: "funnel"` requires `gateway.auth.mode: "password"` (shared password).
|
|
107
|
+
|
|
108
|
+
## Building the UI
|
|
109
|
+
|
|
110
|
+
The Gateway serves static files from `dist/control-ui`. Build them with:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pnpm ui:install
|
|
114
|
+
pnpm ui:build
|
|
115
|
+
```
|
package/docs/webchat.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Loopback WebChat static host and Gateway WS usage for chat UI"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging or configuring WebChat access
|
|
5
|
+
---
|
|
6
|
+
# WebChat (SwiftUI + Gateway WS)
|
|
7
|
+
|
|
8
|
+
Updated: 2025-12-17
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
- A native SwiftUI chat UI (macOS app / iOS) that talks directly to the Gateway WebSocket.
|
|
12
|
+
- No embedded browser/WKWebView and no bundled static WebChat HTTP server.
|
|
13
|
+
- Data plane is entirely Gateway WS: methods `chat.history`, `chat.send`, `chat.abort`; events `chat`, `agent`, `presence`, `tick`, `health`.
|
|
14
|
+
|
|
15
|
+
## How it connects
|
|
16
|
+
- The UI performs Gateway WS `connect`, then calls `chat.history` for bootstrap and `chat.send` for sends; it listens to `chat/agent/presence/tick/health` events.
|
|
17
|
+
- History comes from the Gateway via `chat.history` (no local session file watching).
|
|
18
|
+
- If Gateway WS is unavailable, the UI surfaces the error and blocks send.
|
|
19
|
+
|
|
20
|
+
## Remote use
|
|
21
|
+
- In remote mode, the macOS app forwards the Gateway WebSocket control port via SSH and uses that for the SwiftUI chat UI.
|
|
22
|
+
- You generally should not need to manage tunnels manually; see `RemoteTunnelManager` in the app.
|
|
23
|
+
|
|
24
|
+
## Config
|
|
25
|
+
- WebChat does not have a separate HTTP port/config anymore.
|
|
26
|
+
- Gateway WS is configured via the app’s gateway endpoint settings (`GatewayEndpointStore`) or `clawdbot gateway --port` when running locally.
|
|
27
|
+
|
|
28
|
+
## Failure handling
|
|
29
|
+
- UI errors when the Gateway handshake fails or the WS drops.
|
|
30
|
+
- No fallback transport; the Gateway WS is required.
|
|
31
|
+
|
|
32
|
+
## Dev notes
|
|
33
|
+
- macOS glue: `apps/macos/Sources/Clawdbot/WebChatSwiftUI.swift` + `apps/macos/Sources/Clawdbot/WebChatManager.swift`.
|
|
34
|
+
- Remote tunnel helper: `apps/macos/Sources/Clawdbot/RemotePortTunnel.swift`.
|
package/docs/webhook.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Webhook ingress for wake and isolated agent runs"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding or changing webhook endpoints
|
|
5
|
+
- Wiring external systems into Clawdbot
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Webhooks
|
|
9
|
+
|
|
10
|
+
Gateway can expose a small HTTP webhook surface for external triggers.
|
|
11
|
+
|
|
12
|
+
## Enable
|
|
13
|
+
|
|
14
|
+
```json5
|
|
15
|
+
{
|
|
16
|
+
hooks: {
|
|
17
|
+
enabled: true,
|
|
18
|
+
token: "shared-secret",
|
|
19
|
+
path: "/hooks"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Notes:
|
|
25
|
+
- `hooks.token` is required when `hooks.enabled=true`.
|
|
26
|
+
- `hooks.path` defaults to `/hooks`.
|
|
27
|
+
|
|
28
|
+
## Auth
|
|
29
|
+
|
|
30
|
+
Every request must include the hook token:
|
|
31
|
+
- `Authorization: Bearer <token>`
|
|
32
|
+
- or `x-clawdbot-token: <token>`
|
|
33
|
+
- or `?token=<token>`
|
|
34
|
+
|
|
35
|
+
## Endpoints
|
|
36
|
+
|
|
37
|
+
### `POST /hooks/wake`
|
|
38
|
+
|
|
39
|
+
Payload:
|
|
40
|
+
```json
|
|
41
|
+
{ "text": "System line", "mode": "now" }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- `text` required (string)
|
|
45
|
+
- `mode` optional: `now` | `next-heartbeat` (default `now`)
|
|
46
|
+
|
|
47
|
+
Effect:
|
|
48
|
+
- Enqueues a system event for the **main** session
|
|
49
|
+
- If `mode=now`, triggers an immediate heartbeat
|
|
50
|
+
|
|
51
|
+
### `POST /hooks/agent`
|
|
52
|
+
|
|
53
|
+
Payload:
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"message": "Run this",
|
|
57
|
+
"name": "Email",
|
|
58
|
+
"sessionKey": "hook:email:msg-123",
|
|
59
|
+
"wakeMode": "now",
|
|
60
|
+
"deliver": false,
|
|
61
|
+
"channel": "last",
|
|
62
|
+
"to": "+15551234567",
|
|
63
|
+
"thinking": "low",
|
|
64
|
+
"timeoutSeconds": 120
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- `message` required (string)
|
|
69
|
+
- `name` optional (used in the summary prefix)
|
|
70
|
+
- `sessionKey` optional (default random `hook:<uuid>`)
|
|
71
|
+
- `wakeMode` optional: `now` | `next-heartbeat` (default `now`)
|
|
72
|
+
- `deliver` optional (default `false`)
|
|
73
|
+
- `channel` optional: `last` | `whatsapp` | `telegram`
|
|
74
|
+
- `to` optional (channel-specific target)
|
|
75
|
+
- `thinking` optional (override)
|
|
76
|
+
- `timeoutSeconds` optional
|
|
77
|
+
|
|
78
|
+
Effect:
|
|
79
|
+
- Runs an **isolated** agent turn (own session key)
|
|
80
|
+
- Always posts a summary into the **main** session
|
|
81
|
+
- If `wakeMode=now`, triggers an immediate heartbeat
|
|
82
|
+
|
|
83
|
+
### `POST /hooks/<name>` (mapped)
|
|
84
|
+
|
|
85
|
+
Custom hook names are resolved via `hooks.mappings` (see configuration). A mapping can
|
|
86
|
+
turn arbitrary payloads into `wake` or `agent` actions, with optional templates or
|
|
87
|
+
code transforms.
|
|
88
|
+
|
|
89
|
+
Mapping options (summary):
|
|
90
|
+
- `hooks.presets: ["gmail"]` enables the built-in Gmail mapping.
|
|
91
|
+
- `hooks.mappings` lets you define `match`, `action`, and templates in config.
|
|
92
|
+
- `hooks.transformsDir` + `transform.module` loads a JS/TS module for custom logic.
|
|
93
|
+
- Use `match.source` to keep a generic ingest endpoint (payload-driven routing).
|
|
94
|
+
- TS transforms require a TS loader (e.g. `tsx`) or precompiled `.js` at runtime.
|
|
95
|
+
- `clawdbot hooks gmail setup` writes `hooks.gmail` config for `clawdbot hooks gmail run`.
|
|
96
|
+
|
|
97
|
+
## Responses
|
|
98
|
+
|
|
99
|
+
- `200` for `/hooks/wake`
|
|
100
|
+
- `202` for `/hooks/agent` (async run started)
|
|
101
|
+
- `401` on auth failure
|
|
102
|
+
- `400` on invalid payload
|
|
103
|
+
- `413` on oversized payloads
|
|
104
|
+
|
|
105
|
+
## Examples
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
curl -X POST http://127.0.0.1:18789/hooks/wake \
|
|
109
|
+
-H 'Authorization: Bearer SECRET' \
|
|
110
|
+
-H 'Content-Type: application/json' \
|
|
111
|
+
-d '{"text":"New email received","mode":"now"}'
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
curl -X POST http://127.0.0.1:18789/hooks/agent \
|
|
116
|
+
-H 'x-clawdbot-token: SECRET' \
|
|
117
|
+
-H 'Content-Type: application/json' \
|
|
118
|
+
-d '{"message":"Summarize inbox","name":"Email","wakeMode":"next-heartbeat"}'
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
curl -X POST http://127.0.0.1:18789/hooks/gmail \
|
|
123
|
+
-H 'Authorization: Bearer SECRET' \
|
|
124
|
+
-H 'Content-Type: application/json' \
|
|
125
|
+
-d '{"source":"gmail","messages":[{"from":"Ada","subject":"Hello","snippet":"Hi"}]}'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Security
|
|
129
|
+
|
|
130
|
+
- Keep hook endpoints behind loopback, tailnet, or trusted reverse proxy.
|
|
131
|
+
- Use a dedicated hook token; do not reuse gateway auth tokens.
|
|
132
|
+
- Avoid including sensitive raw payloads in webhook logs.
|
|
Binary file
|
package/docs/whatsapp.md
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "WhatsApp (web provider) integration: login, inbox, replies, media, and ops"
|
|
3
|
+
read_when:
|
|
4
|
+
- Working on WhatsApp/web provider behavior or inbox routing
|
|
5
|
+
---
|
|
6
|
+
# WhatsApp (web provider)
|
|
7
|
+
|
|
8
|
+
Updated: 2025-12-23
|
|
9
|
+
|
|
10
|
+
Status: WhatsApp Web via Baileys only. Gateway owns the single session.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
- One WhatsApp identity, one gateway session.
|
|
14
|
+
- Deterministic routing: replies return to WhatsApp, no model routing.
|
|
15
|
+
- Model sees enough context to understand quoted replies.
|
|
16
|
+
|
|
17
|
+
## Architecture (who owns what)
|
|
18
|
+
- **Gateway** owns the Baileys socket and inbox loop.
|
|
19
|
+
- **CLI / macOS app** talk to the gateway; no direct Baileys use.
|
|
20
|
+
- **Active listener** is required for outbound sends; otherwise send fails fast.
|
|
21
|
+
|
|
22
|
+
## Getting a phone number
|
|
23
|
+
|
|
24
|
+
WhatsApp requires a real mobile number for verification. VoIP and virtual numbers are usually blocked.
|
|
25
|
+
|
|
26
|
+
**Recommended approaches:**
|
|
27
|
+
- **Local eSIM** from your country's mobile carrier (most reliable)
|
|
28
|
+
- Austria: [hot.at](https://www.hot.at)
|
|
29
|
+
- UK: [giffgaff](https://www.giffgaff.com) — free SIM, no contract
|
|
30
|
+
- **Prepaid SIM** — cheap, just needs to receive one SMS for verification
|
|
31
|
+
|
|
32
|
+
**Avoid:** TextNow, Google Voice, most "free SMS" services — WhatsApp blocks these aggressively.
|
|
33
|
+
|
|
34
|
+
**Tip:** The number only needs to receive one verification SMS. After that, WhatsApp Web sessions persist via `creds.json`.
|
|
35
|
+
|
|
36
|
+
## Login + credentials
|
|
37
|
+
- Login command: `clawdbot login` (QR via Linked Devices).
|
|
38
|
+
- Credentials stored in `~/.clawdbot/credentials/creds.json`.
|
|
39
|
+
- Backup copy at `creds.json.bak` (restored on corruption).
|
|
40
|
+
- Logout: `clawdbot logout` deletes creds and session store.
|
|
41
|
+
- Logged-out socket => error instructs re-link.
|
|
42
|
+
|
|
43
|
+
## Inbound flow (DM + group)
|
|
44
|
+
- WhatsApp events come from `messages.upsert` (Baileys).
|
|
45
|
+
- Inbox listeners are detached on shutdown to avoid accumulating event handlers in tests/restarts.
|
|
46
|
+
- Status/broadcast chats are ignored.
|
|
47
|
+
- Direct chats use E.164; groups use group JID.
|
|
48
|
+
- **Allowlist**: `whatsapp.allowFrom` enforced for direct chats only.
|
|
49
|
+
- If `whatsapp.allowFrom` is empty, default allowlist = self number (self-chat mode).
|
|
50
|
+
- **Self-chat mode**: avoids auto read receipts and ignores mention JIDs.
|
|
51
|
+
- Read receipts sent for non-self-chat DMs.
|
|
52
|
+
|
|
53
|
+
## Message normalization (what the model sees)
|
|
54
|
+
- `Body` is the current message body with envelope.
|
|
55
|
+
- Quoted reply context is **always appended**:
|
|
56
|
+
```
|
|
57
|
+
[Replying to +1555 id:ABC123]
|
|
58
|
+
<quoted text or <media:...>>
|
|
59
|
+
[/Replying]
|
|
60
|
+
```
|
|
61
|
+
- Reply metadata also set:
|
|
62
|
+
- `ReplyToId` = stanzaId
|
|
63
|
+
- `ReplyToBody` = quoted body or media placeholder
|
|
64
|
+
- `ReplyToSender` = E.164 when known
|
|
65
|
+
- Media-only inbound messages use placeholders:
|
|
66
|
+
- `<media:image|video|audio|document|sticker>`
|
|
67
|
+
|
|
68
|
+
## Groups
|
|
69
|
+
- Groups map to `whatsapp:group:<jid>` sessions.
|
|
70
|
+
- Activation modes:
|
|
71
|
+
- `mention` (default): requires @mention or regex match.
|
|
72
|
+
- `always`: always triggers.
|
|
73
|
+
- `/activation mention|always` is owner-only.
|
|
74
|
+
- Owner = `whatsapp.allowFrom` (or self E.164 if unset).
|
|
75
|
+
- **History injection**:
|
|
76
|
+
- Recent messages (default 50) inserted under:
|
|
77
|
+
`[Chat messages since your last reply - for context]`
|
|
78
|
+
- Current message under:
|
|
79
|
+
`[Current message - respond to this]`
|
|
80
|
+
- Sender suffix appended: `[from: Name (+E164)]`
|
|
81
|
+
- Group metadata cached 5 min (subject + participants).
|
|
82
|
+
|
|
83
|
+
## Reply delivery (threading)
|
|
84
|
+
- WhatsApp Web sends standard messages (no quoted reply threading in the current gateway).
|
|
85
|
+
- Reply tags are ignored on this surface.
|
|
86
|
+
|
|
87
|
+
## Outbound send (text + media)
|
|
88
|
+
- Uses active web listener; error if gateway not running.
|
|
89
|
+
- Text chunking: 4k max per message.
|
|
90
|
+
- Media:
|
|
91
|
+
- Image/video/audio/document supported.
|
|
92
|
+
- Audio sent as PTT; `audio/ogg` => `audio/ogg; codecs=opus`.
|
|
93
|
+
- Caption only on first media item.
|
|
94
|
+
- Media fetch supports HTTP(S) and local paths.
|
|
95
|
+
- Animated GIFs: WhatsApp expects MP4 with `gifPlayback: true` for inline looping.
|
|
96
|
+
- CLI: `clawdbot send --media <mp4> --gif-playback`
|
|
97
|
+
- Gateway: `send` params include `gifPlayback: true`
|
|
98
|
+
|
|
99
|
+
## Media limits + optimization
|
|
100
|
+
- Default cap: 5 MB (per media item).
|
|
101
|
+
- Override: `agent.mediaMaxMb`.
|
|
102
|
+
- Images are auto-optimized to JPEG under cap (resize + quality sweep).
|
|
103
|
+
- Oversize media => error; media reply falls back to text warning.
|
|
104
|
+
|
|
105
|
+
## Heartbeats
|
|
106
|
+
- **Gateway heartbeat** logs connection health (`web.heartbeatSeconds`, default 60s).
|
|
107
|
+
- **Agent heartbeat** is global (`agent.heartbeat.*`) and runs in the main session.
|
|
108
|
+
- Uses `HEARTBEAT` prompt + `HEARTBEAT_OK` skip behavior.
|
|
109
|
+
- Delivery defaults to the last used channel (or configured target).
|
|
110
|
+
|
|
111
|
+
## Reconnect behavior
|
|
112
|
+
- Backoff policy: `web.reconnect`:
|
|
113
|
+
- `initialMs`, `maxMs`, `factor`, `jitter`, `maxAttempts`.
|
|
114
|
+
- If maxAttempts reached, web monitoring stops (degraded).
|
|
115
|
+
- Logged-out => stop and require re-link.
|
|
116
|
+
|
|
117
|
+
## Config quick map
|
|
118
|
+
- `whatsapp.allowFrom` (DM allowlist).
|
|
119
|
+
- `whatsapp.groups` (group mention gating defaults/overrides)
|
|
120
|
+
- `routing.groupChat.mentionPatterns`
|
|
121
|
+
- `routing.groupChat.historyLimit`
|
|
122
|
+
- `messages.messagePrefix` (inbound prefix)
|
|
123
|
+
- `messages.responsePrefix` (outbound prefix)
|
|
124
|
+
- `agent.mediaMaxMb`
|
|
125
|
+
- `agent.heartbeat.every`
|
|
126
|
+
- `agent.heartbeat.model` (optional override)
|
|
127
|
+
- `agent.heartbeat.target`
|
|
128
|
+
- `agent.heartbeat.to`
|
|
129
|
+
- `session.*` (scope, idle, store; `mainKey` is ignored)
|
|
130
|
+
- `web.enabled` (disable provider startup when false)
|
|
131
|
+
- `web.heartbeatSeconds`
|
|
132
|
+
- `web.reconnect.*`
|
|
133
|
+
|
|
134
|
+
## Logs + troubleshooting
|
|
135
|
+
- Subsystems: `whatsapp/inbound`, `whatsapp/outbound`, `web-heartbeat`, `web-reconnect`.
|
|
136
|
+
- Log file: `/tmp/clawdbot/clawdbot-YYYY-MM-DD.log` (configurable).
|
|
137
|
+
- Troubleshooting guide: `docs/refactor/web-gateway-troubleshooting.md`.
|
|
138
|
+
|
|
139
|
+
## Tests
|
|
140
|
+
- `src/web/auto-reply.test.ts` (mention gating, history injection, reply flow)
|
|
141
|
+
- `src/web/monitor-inbox.test.ts` (inbound parsing + reply context)
|
|
142
|
+
- `src/web/outbound.test.ts` (send mapping + media)
|
package/docs/wizard.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "CLI onboarding wizard: guided setup for gateway, workspace, providers, and skills"
|
|
3
|
+
read_when:
|
|
4
|
+
- Running or configuring the onboarding wizard
|
|
5
|
+
- Setting up a new machine
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Onboarding Wizard (CLI)
|
|
9
|
+
|
|
10
|
+
The onboarding wizard is the **recommended** way to set up Clawdbot on any OS.
|
|
11
|
+
It configures a local Gateway or a remote Gateway connection, plus providers, skills,
|
|
12
|
+
and workspace defaults in one guided flow.
|
|
13
|
+
|
|
14
|
+
Primary entrypoint:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
clawdbot onboard
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Follow‑up reconfiguration:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
clawdbot configure
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## What the wizard does
|
|
27
|
+
|
|
28
|
+
**Local mode (default)** walks you through:
|
|
29
|
+
- Model/auth (Anthropic OAuth recommended, API key optional, Minimax M2.1 via LM Studio)
|
|
30
|
+
- Workspace location + bootstrap files
|
|
31
|
+
- Gateway settings (port/bind/auth/tailscale)
|
|
32
|
+
- Providers (WhatsApp, Telegram, Discord, Signal)
|
|
33
|
+
- Daemon install (LaunchAgent / systemd user unit / Scheduled Task)
|
|
34
|
+
- Health check
|
|
35
|
+
- Skills (recommended)
|
|
36
|
+
|
|
37
|
+
**Remote mode** only configures the local client to connect to a Gateway elsewhere.
|
|
38
|
+
It does **not** install or change anything on the remote host.
|
|
39
|
+
|
|
40
|
+
## Flow details (local)
|
|
41
|
+
|
|
42
|
+
1) **Existing config detection**
|
|
43
|
+
- If `~/.clawdbot/clawdbot.json` exists, choose **Keep / Modify / Reset**.
|
|
44
|
+
- Reset uses `trash` (never `rm`) and offers scopes:
|
|
45
|
+
- Config only
|
|
46
|
+
- Config + credentials + sessions
|
|
47
|
+
- Full reset (also removes workspace)
|
|
48
|
+
|
|
49
|
+
2) **Model/Auth**
|
|
50
|
+
- **Anthropic OAuth (recommended)**: browser flow; paste the `code#state`.
|
|
51
|
+
- **API key**: stores the key for you.
|
|
52
|
+
- **Minimax M2.1 (LM Studio)**: config is auto‑written for the LM Studio endpoint.
|
|
53
|
+
- **Skip**: no auth configured yet.
|
|
54
|
+
|
|
55
|
+
3) **Workspace**
|
|
56
|
+
- Default `~/clawd` (configurable).
|
|
57
|
+
- Seeds the workspace files needed for the agent bootstrap ritual.
|
|
58
|
+
|
|
59
|
+
4) **Gateway**
|
|
60
|
+
- Port, bind, auth mode, tailscale exposure.
|
|
61
|
+
- Auth recommendation: keep **Off** for single-machine loopback setups. Use **Token** for multi-machine access or non-loopback binds.
|
|
62
|
+
- Non‑loopback binds require auth.
|
|
63
|
+
|
|
64
|
+
5) **Providers**
|
|
65
|
+
- WhatsApp: optional QR login.
|
|
66
|
+
- Telegram: bot token.
|
|
67
|
+
- Discord: bot token.
|
|
68
|
+
- Signal: optional `signal-cli` install + account config.
|
|
69
|
+
- iMessage: local `imsg` CLI path + DB access.
|
|
70
|
+
|
|
71
|
+
6) **Daemon install**
|
|
72
|
+
- macOS: LaunchAgent
|
|
73
|
+
- Linux: systemd user unit
|
|
74
|
+
- Windows: Scheduled Task
|
|
75
|
+
|
|
76
|
+
7) **Health check**
|
|
77
|
+
- Starts the Gateway (if needed) and runs `clawdbot health`.
|
|
78
|
+
|
|
79
|
+
8) **Skills (recommended)**
|
|
80
|
+
- Reads the available skills and checks requirements.
|
|
81
|
+
- Lets you choose a node manager: **npm / pnpm / bun**.
|
|
82
|
+
- Installs optional dependencies (some use Homebrew on macOS).
|
|
83
|
+
|
|
84
|
+
9) **Finish**
|
|
85
|
+
- Summary + next steps, including iOS/Android/macOS apps for extra features.
|
|
86
|
+
- If no GUI is detected, the wizard prints SSH port-forward instructions for the Control UI instead of opening a browser.
|
|
87
|
+
|
|
88
|
+
## Remote mode
|
|
89
|
+
|
|
90
|
+
Remote mode configures a local client to connect to a Gateway elsewhere.
|
|
91
|
+
|
|
92
|
+
What you’ll set:
|
|
93
|
+
- Remote Gateway URL (`ws://...`)
|
|
94
|
+
- Optional token
|
|
95
|
+
|
|
96
|
+
Notes:
|
|
97
|
+
- No remote installs or daemon changes are performed.
|
|
98
|
+
- If the Gateway is loopback‑only, use SSH tunneling or a tailnet.
|
|
99
|
+
- Discovery hints:
|
|
100
|
+
- macOS: Bonjour (`dns-sd`)
|
|
101
|
+
- Linux: Avahi (`avahi-browse`)
|
|
102
|
+
|
|
103
|
+
## Non‑interactive mode
|
|
104
|
+
|
|
105
|
+
Use `--non-interactive` to automate or script onboarding:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
clawdbot onboard --non-interactive \
|
|
109
|
+
--mode local \
|
|
110
|
+
--auth-choice apiKey \
|
|
111
|
+
--anthropic-api-key "$ANTHROPIC_API_KEY" \
|
|
112
|
+
--gateway-port 18789 \
|
|
113
|
+
--gateway-bind loopback \
|
|
114
|
+
--skip-skills
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Add `--json` for a machine‑readable summary.
|
|
118
|
+
|
|
119
|
+
## Gateway wizard RPC
|
|
120
|
+
|
|
121
|
+
The Gateway exposes the wizard flow over RPC (`wizard.start`, `wizard.next`, `wizard.cancel`, `wizard.status`).
|
|
122
|
+
Clients (macOS app, Control UI) can render steps without re‑implementing onboarding logic.
|
|
123
|
+
|
|
124
|
+
## Signal setup (signal-cli)
|
|
125
|
+
|
|
126
|
+
The wizard can install `signal-cli` from GitHub releases:
|
|
127
|
+
- Downloads the appropriate release asset.
|
|
128
|
+
- Stores it under `~/.clawdbot/tools/signal-cli/<version>/`.
|
|
129
|
+
- Writes `signal.cliPath` to your config.
|
|
130
|
+
|
|
131
|
+
Notes:
|
|
132
|
+
- JVM builds require **Java 21**.
|
|
133
|
+
- Native builds are used when available.
|
|
134
|
+
- Windows auto‑install is not supported yet (manual install required).
|
|
135
|
+
|
|
136
|
+
## What the wizard writes
|
|
137
|
+
|
|
138
|
+
Typical fields in `~/.clawdbot/clawdbot.json`:
|
|
139
|
+
- `agent.workspace`
|
|
140
|
+
- `agent.model` / `models.providers` (if Minimax chosen)
|
|
141
|
+
- `gateway.*` (mode, bind, auth, tailscale)
|
|
142
|
+
- `telegram.botToken`, `discord.token`, `signal.*`, `imessage.*`
|
|
143
|
+
- `skills.install.nodeManager`
|
|
144
|
+
- `wizard.lastRunAt`
|
|
145
|
+
- `wizard.lastRunVersion`
|
|
146
|
+
- `wizard.lastRunCommit`
|
|
147
|
+
- `wizard.lastRunCommand`
|
|
148
|
+
- `wizard.lastRunMode`
|
|
149
|
+
|
|
150
|
+
WhatsApp credentials go to `~/.clawdbot/credentials/`.
|
|
151
|
+
Sessions are stored under `~/.clawdbot/sessions/`.
|
|
152
|
+
|
|
153
|
+
## Related docs
|
|
154
|
+
|
|
155
|
+
- macOS app onboarding: `docs/onboarding.md`
|
|
156
|
+
- Config reference: `docs/configuration.md`
|
|
157
|
+
- Providers: `docs/whatsapp.md`, `docs/telegram.md`, `docs/discord.md`, `docs/signal.md`, `docs/imessage.md`
|
|
158
|
+
- Skills: `docs/skills.md`, `docs/skills-config.md`
|