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/ios/spec.md
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Plan for an iOS voice + canvas node that connects via a secure Bonjour-discovered macOS bridge"
|
|
3
|
+
read_when:
|
|
4
|
+
- Designing iOS node + gateway integration
|
|
5
|
+
- Extending the Gateway protocol for node/canvas commands
|
|
6
|
+
- Implementing Bonjour pairing or transport security
|
|
7
|
+
---
|
|
8
|
+
# iOS Node (internal) — Voice Trigger + Canvas
|
|
9
|
+
|
|
10
|
+
Status: prototype implemented (internal) · Date: 2025-12-13
|
|
11
|
+
|
|
12
|
+
Runbook (how to connect/pair + drive Canvas): `docs/ios/connect.md`
|
|
13
|
+
|
|
14
|
+
## Goals
|
|
15
|
+
- Build an **iOS app** that acts as a **remote node** for Clawdbot:
|
|
16
|
+
- **Voice trigger** (wake-word / always-listening intent) that forwards transcripts to the Gateway `agent` method.
|
|
17
|
+
- **Canvas** surface that the agent can control: navigate, draw/render, evaluate JS, snapshot.
|
|
18
|
+
- **Dead-simple setup**:
|
|
19
|
+
- Auto-discover the host on the local network via **Bonjour**.
|
|
20
|
+
- One-tap pairing with an approval prompt on the Mac.
|
|
21
|
+
- iOS is **never** a local gateway; it is always a remote node.
|
|
22
|
+
- Operational clarity:
|
|
23
|
+
- When iOS is backgrounded, voice may still run; **canvas commands must fail fast** with a structured error.
|
|
24
|
+
- Provide **settings**: node display name, enable/disable voice wake, pairing status.
|
|
25
|
+
|
|
26
|
+
Non-goals (v1):
|
|
27
|
+
- Exposing the Node Gateway directly on the LAN.
|
|
28
|
+
- Supporting arbitrary third-party “plugins” on iOS.
|
|
29
|
+
- Perfect App Store compliance; this is **internal-only** initially.
|
|
30
|
+
|
|
31
|
+
## Current repo reality (constraints we respect)
|
|
32
|
+
- The Gateway WebSocket server binds to `127.0.0.1:18789` (`src/gateway/server.ts`) with an optional `CLAWDBOT_GATEWAY_TOKEN`.
|
|
33
|
+
- The Gateway exposes a Canvas file server (`canvasHost`) on `canvasHost.port` (default `18793`), so nodes can `canvas.navigate` to `http://<lanHost>:18793/__clawdbot__/canvas/` and auto-reload on file changes (`docs/configuration.md`).
|
|
34
|
+
- macOS “Canvas” is controlled via the Gateway node protocol (`canvas.*`), matching iOS/Android (`docs/mac/canvas.md`).
|
|
35
|
+
- Voice wake forwards via `GatewayChannel` to Gateway `agent` (mac app: `VoiceWakeForwarder` → `GatewayConnection.sendAgent`).
|
|
36
|
+
|
|
37
|
+
## Recommended topology (B): Gateway-owned Bridge + loopback Gateway
|
|
38
|
+
Keep the Node gateway loopback-only; expose a dedicated **gateway-owned bridge** to the LAN/tailnet.
|
|
39
|
+
|
|
40
|
+
**iOS App** ⇄ (TLS + pairing) ⇄ **Bridge (in gateway)** ⇄ (loopback) ⇄ **Gateway WS** (`ws://127.0.0.1:18789`)
|
|
41
|
+
|
|
42
|
+
Why:
|
|
43
|
+
- Preserves current threat model: Gateway remains local-only.
|
|
44
|
+
- Centralizes auth, rate limiting, and allowlisting in the bridge.
|
|
45
|
+
- Lets us unify “canvas node” semantics across mac + iOS without exposing raw gateway methods.
|
|
46
|
+
|
|
47
|
+
## Security plan (internal, but still robust)
|
|
48
|
+
### Transport
|
|
49
|
+
- **Current (v0):** bridge is a LAN-facing **TCP** listener with token-based auth after pairing.
|
|
50
|
+
- **Next:** wrap the bridge in **TLS** and prefer key-pinned or mTLS-like auth after pairing.
|
|
51
|
+
|
|
52
|
+
### Pairing
|
|
53
|
+
- Bonjour discovery shows a candidate “Clawdbot Bridge” on the LAN.
|
|
54
|
+
- First connection:
|
|
55
|
+
1) iOS generates a keypair (Secure Enclave if available).
|
|
56
|
+
2) iOS connects to the bridge and requests pairing.
|
|
57
|
+
3) The bridge forwards the pairing request to the **Gateway** as a *pending request*.
|
|
58
|
+
4) Approval can happen via:
|
|
59
|
+
- **macOS UI** (Clawdbot shows an alert with Approve/Reject/Later, including the node IP), or
|
|
60
|
+
- **Terminal/CLI** (headless flows).
|
|
61
|
+
5) Once approved, the bridge returns a token to iOS; iOS stores it in Keychain.
|
|
62
|
+
- Subsequent connections:
|
|
63
|
+
- The bridge requires the paired identity. Unpaired clients get a structured “not paired” error and no access.
|
|
64
|
+
|
|
65
|
+
#### Gateway-owned pairing (Option B details)
|
|
66
|
+
Pairing decisions must be owned by the Gateway (`clawd` / Node) so nodes can be approved without the macOS app running.
|
|
67
|
+
|
|
68
|
+
Key idea:
|
|
69
|
+
- The Swift app may still show an alert, but it is only a **frontend** for pending requests stored in the Gateway.
|
|
70
|
+
|
|
71
|
+
Desired behavior:
|
|
72
|
+
- If the Swift UI is present: show alert with Approve/Reject/Later.
|
|
73
|
+
- If the Swift UI is not present: `clawdbot` CLI can list pending requests and approve/reject.
|
|
74
|
+
|
|
75
|
+
See `docs/gateway/pairing.md` for the API/events and storage.
|
|
76
|
+
|
|
77
|
+
CLI (headless approvals):
|
|
78
|
+
- `clawdbot nodes pending`
|
|
79
|
+
- `clawdbot nodes approve <requestId>`
|
|
80
|
+
- `clawdbot nodes reject <requestId>`
|
|
81
|
+
|
|
82
|
+
### Authorization / scope control (bridge-side ACL)
|
|
83
|
+
The bridge must not be a raw proxy to every gateway method.
|
|
84
|
+
|
|
85
|
+
- Allow by default:
|
|
86
|
+
- `agent` (with guardrails; idempotency required)
|
|
87
|
+
- minimal `system-event` beacons (presence updates for the node)
|
|
88
|
+
- node/canvas methods defined below (new protocol surface)
|
|
89
|
+
- Deny by default:
|
|
90
|
+
- anything that widens control without explicit intent (future “shell”, “files”, etc.)
|
|
91
|
+
- Rate limit:
|
|
92
|
+
- handshake attempts
|
|
93
|
+
- voice forwards per minute
|
|
94
|
+
- snapshot frequency / payload size
|
|
95
|
+
|
|
96
|
+
## Protocol unification: add “node/canvas” to Gateway protocol
|
|
97
|
+
### Principle
|
|
98
|
+
Unify mac Canvas + iOS Canvas under a single conceptual surface:
|
|
99
|
+
- The agent talks to the Gateway using a stable method set (typed protocol).
|
|
100
|
+
- The Gateway routes node-targeted requests to:
|
|
101
|
+
- local mac Canvas implementation, or
|
|
102
|
+
- remote iOS node via the bridge
|
|
103
|
+
|
|
104
|
+
### Minimal protocol additions (v1)
|
|
105
|
+
Add to `src/gateway/protocol/schema.ts` (and regenerate Swift models):
|
|
106
|
+
|
|
107
|
+
**Identity**
|
|
108
|
+
- Node identity comes from `connect.params.client.instanceId` (stable), and `connect.params.client.mode = "node"` (or `"ios-node"`).
|
|
109
|
+
|
|
110
|
+
**Methods**
|
|
111
|
+
- `node.list` → list paired/connected nodes + capabilities
|
|
112
|
+
- `node.describe` → describe a node (capabilities + supported `node.invoke` commands)
|
|
113
|
+
- `node.invoke` → send a command to a specific node
|
|
114
|
+
- Params: `{ nodeId, command, params?, timeoutMs? }`
|
|
115
|
+
|
|
116
|
+
**Events**
|
|
117
|
+
- `node.event` → async node status/errors
|
|
118
|
+
- e.g. background/foreground transitions, voice availability, canvas availability
|
|
119
|
+
|
|
120
|
+
### Node command set (canvas)
|
|
121
|
+
These are values for `node.invoke.command`:
|
|
122
|
+
- `canvas.present` / `canvas.hide`
|
|
123
|
+
- `canvas.navigate` with `{ url }` (loads a URL; use `""` or `"/"` to return to the default scaffold)
|
|
124
|
+
- `canvas.eval` with `{ javaScript }`
|
|
125
|
+
- `canvas.snapshot` with `{ maxWidth?, quality?, format? }`
|
|
126
|
+
- A2UI (mobile + macOS canvas):
|
|
127
|
+
- `canvas.a2ui.push` with `{ messages: [...] }` (A2UI v0.8 server→client messages)
|
|
128
|
+
- `canvas.a2ui.pushJSONL` with `{ jsonl: "..." }` (legacy alias)
|
|
129
|
+
- `canvas.a2ui.reset`
|
|
130
|
+
- A2UI is hosted by the Gateway canvas host (`/__clawdbot__/a2ui/`) on `canvasHost.port`. Commands fail if the host is unreachable.
|
|
131
|
+
|
|
132
|
+
Result pattern:
|
|
133
|
+
- Request is a standard `req/res` with `ok` / `error`.
|
|
134
|
+
- Long operations (loads, streaming drawing, etc.) may also emit `node.event` progress.
|
|
135
|
+
|
|
136
|
+
#### Current (implemented)
|
|
137
|
+
As of 2025-12-13, the Gateway supports `node.invoke` for bridge-connected nodes.
|
|
138
|
+
|
|
139
|
+
Example: draw a diagonal line on the iOS Canvas:
|
|
140
|
+
```bash
|
|
141
|
+
clawdbot nodes invoke --node ios-node --command canvas.eval --params '{"javaScript":"(() => { const {ctx} = window.__clawdbot; 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(); return \"ok\"; })()"}'
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Background behavior requirement
|
|
145
|
+
When iOS is backgrounded:
|
|
146
|
+
- Voice may still be active (subject to iOS suspension).
|
|
147
|
+
- **All `canvas.*` commands must fail** with a stable error code, e.g.:
|
|
148
|
+
- `NODE_BACKGROUND_UNAVAILABLE`
|
|
149
|
+
- Include `retryable: true` and `retryAfterMs` if we want the agent to wait.
|
|
150
|
+
|
|
151
|
+
## iOS app architecture (SwiftUI)
|
|
152
|
+
### App structure
|
|
153
|
+
- Single fullscreen Canvas surface (WKWebView).
|
|
154
|
+
- One settings entry point: a **gear button** that opens a settings sheet.
|
|
155
|
+
- All navigation is **agent-driven** (no local URL bar).
|
|
156
|
+
|
|
157
|
+
### Components
|
|
158
|
+
- `BridgeDiscovery`: Bonjour browse + resolve (Network.framework `NWBrowser`)
|
|
159
|
+
- `BridgeConnection`: TCP session + pairing handshake + reconnect (TLS planned)
|
|
160
|
+
- `NodeRuntime`:
|
|
161
|
+
- Voice pipeline (wake-word + capture + forward)
|
|
162
|
+
- Canvas pipeline (WKWebView controller + snapshot + eval)
|
|
163
|
+
- Background state tracking; enforces “canvas unavailable in background”
|
|
164
|
+
|
|
165
|
+
### Voice in background (internal)
|
|
166
|
+
- Enable background audio mode (and required session configuration) so the mic pipeline can keep running when the user switches apps.
|
|
167
|
+
- If iOS suspends the app anyway, surface a clear node status (`node.event`) so operators can see voice is unavailable.
|
|
168
|
+
|
|
169
|
+
## Code sharing (macOS + iOS)
|
|
170
|
+
Create/expand SwiftPM targets so both apps share:
|
|
171
|
+
- `ClawdbotProtocol` (generated models; platform-neutral)
|
|
172
|
+
- `ClawdbotGatewayClient` (shared WS framing + connect/req/res + seq-gap handling)
|
|
173
|
+
- `ClawdbotKit` (node/canvas command types + deep links + shared utilities)
|
|
174
|
+
|
|
175
|
+
macOS continues to own:
|
|
176
|
+
- local Canvas implementation details (custom scheme handler serving on-disk HTML, window/panel presentation)
|
|
177
|
+
|
|
178
|
+
iOS owns:
|
|
179
|
+
- iOS-specific audio/speech + WKWebView presentation and lifecycle
|
|
180
|
+
|
|
181
|
+
## Repo layout
|
|
182
|
+
- iOS app: `apps/ios/` (XcodeGen `project.yml`)
|
|
183
|
+
- Shared Swift packages: `apps/shared/`
|
|
184
|
+
- Lint/format: iOS target runs `swiftformat --lint` + `swiftlint lint` using repo configs (`.swiftformat`, `.swiftlint.yml`).
|
|
185
|
+
|
|
186
|
+
Generate the Xcode project:
|
|
187
|
+
```bash
|
|
188
|
+
cd apps/ios
|
|
189
|
+
xcodegen generate
|
|
190
|
+
open Clawdbot.xcodeproj
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Storage plan (private by default)
|
|
194
|
+
### iOS
|
|
195
|
+
- Canvas/workspace files (persistent, private):
|
|
196
|
+
- `Application Support/Clawdbot/canvas/<sessionKey>/...`
|
|
197
|
+
- Snapshots / temp exports (evictable):
|
|
198
|
+
- `Library/Caches/Clawdbot/canvas-snapshots/<sessionKey>/...`
|
|
199
|
+
- Credentials:
|
|
200
|
+
- Keychain (paired identity + bridge trust anchor)
|
|
201
|
+
|
|
202
|
+
### macOS
|
|
203
|
+
- Keep current Canvas root (already implemented):
|
|
204
|
+
- `~/Library/Application Support/Clawdbot/canvas/<session>/...`
|
|
205
|
+
- Bridge state:
|
|
206
|
+
- No local pairing store (pairing is gateway-owned).
|
|
207
|
+
- Any local bridge-only state should remain private under Application Support.
|
|
208
|
+
|
|
209
|
+
### Gateway (node)
|
|
210
|
+
- Pairing (source of truth):
|
|
211
|
+
- `~/.clawdbot/nodes/paired.json`
|
|
212
|
+
- `~/.clawdbot/nodes/pending.json` (or `pending/*.json` for auditability)
|
|
213
|
+
|
|
214
|
+
## Rollout plan (phased)
|
|
215
|
+
1) **Bridge discovery + pairing (mac + iOS)**
|
|
216
|
+
- Bonjour browse + resolve
|
|
217
|
+
- Approve prompt on mac
|
|
218
|
+
- Persist pairing in Keychain/App Support
|
|
219
|
+
2) **Voice-only node**
|
|
220
|
+
- iOS voice wake toggle
|
|
221
|
+
- Forward transcript to Gateway `agent` via bridge
|
|
222
|
+
- Presence beacons via `system-event` (or node.event)
|
|
223
|
+
3) **Protocol additions for nodes**
|
|
224
|
+
- Add `node.list` / `node.invoke` / `node.event` to Gateway
|
|
225
|
+
- Implement bridge routing + ACLs
|
|
226
|
+
4) **iOS canvas**
|
|
227
|
+
- WKWebView canvas surface
|
|
228
|
+
- `canvas.navigate/eval/snapshot`
|
|
229
|
+
- Background fast-fail for `canvas.*`
|
|
230
|
+
5) **Unify mac Canvas under the same node.invoke**
|
|
231
|
+
- Keep existing implementation, but expose it through the unified protocol path so the agent uses one API.
|
|
232
|
+
|
|
233
|
+
## Open questions
|
|
234
|
+
- Should `connect.params.client.mode` be `"node"` with `platform="ios ..."` or a distinct mode `"ios-node"`? (Presence filtering currently excludes `"cli"` only.)
|
|
235
|
+
- Do we want a “permissions” model per node (voice only vs voice+canvas) at pairing time?
|
|
236
|
+
- Should loading arbitrary websites via `canvas.navigate` allow any https URL, or enforce an allowlist to reduce risk?
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Location command for nodes (location.get), permission modes, and background behavior"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding location node support or permissions UI
|
|
5
|
+
- Designing background location + push flows
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Location command (nodes)
|
|
9
|
+
|
|
10
|
+
## TL;DR
|
|
11
|
+
- `location.get` is a node command (via `node.invoke`).
|
|
12
|
+
- Off by default.
|
|
13
|
+
- Settings use a selector: Off / While Using / Always.
|
|
14
|
+
- Separate toggle: Precise Location.
|
|
15
|
+
|
|
16
|
+
## Why a selector (not just a switch)
|
|
17
|
+
OS permissions are multi-level. We can expose a selector in-app, but the OS still decides the actual grant.
|
|
18
|
+
- iOS/macOS: user can choose **While Using** or **Always** in system prompts/Settings. App can request upgrade, but OS may require Settings.
|
|
19
|
+
- Android: background location is a separate permission; on Android 10+ it often requires a Settings flow.
|
|
20
|
+
- Precise location is a separate grant (iOS 14+ “Precise”, Android “fine” vs “coarse”).
|
|
21
|
+
|
|
22
|
+
Selector in UI drives our requested mode; actual grant lives in OS settings.
|
|
23
|
+
|
|
24
|
+
## Settings model
|
|
25
|
+
Per node device:
|
|
26
|
+
- `location.enabledMode`: `off | whileUsing | always`
|
|
27
|
+
- `location.preciseEnabled`: bool
|
|
28
|
+
|
|
29
|
+
UI behavior:
|
|
30
|
+
- Selecting `whileUsing` requests foreground permission.
|
|
31
|
+
- Selecting `always` first ensures `whileUsing`, then requests background (or sends user to Settings if required).
|
|
32
|
+
- If OS denies requested level, revert to the highest granted level and show status.
|
|
33
|
+
|
|
34
|
+
## Permissions mapping (node.permissions)
|
|
35
|
+
Optional. macOS node reports `location` via the permissions map; iOS/Android may omit it.
|
|
36
|
+
|
|
37
|
+
## Command: `location.get`
|
|
38
|
+
Called via `node.invoke`.
|
|
39
|
+
|
|
40
|
+
Params (suggested):
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"timeoutMs": 10000,
|
|
44
|
+
"maxAgeMs": 15000,
|
|
45
|
+
"desiredAccuracy": "coarse|balanced|precise"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Response payload:
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"lat": 48.20849,
|
|
53
|
+
"lon": 16.37208,
|
|
54
|
+
"accuracyMeters": 12.5,
|
|
55
|
+
"altitudeMeters": 182.0,
|
|
56
|
+
"speedMps": 0.0,
|
|
57
|
+
"headingDeg": 270.0,
|
|
58
|
+
"timestamp": "2026-01-03T12:34:56.000Z",
|
|
59
|
+
"isPrecise": true,
|
|
60
|
+
"source": "gps|wifi|cell|unknown"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Errors (stable codes):
|
|
65
|
+
- `LOCATION_DISABLED`: selector is off.
|
|
66
|
+
- `LOCATION_PERMISSION_REQUIRED`: permission missing for requested mode.
|
|
67
|
+
- `LOCATION_BACKGROUND_UNAVAILABLE`: app is backgrounded but only While Using allowed.
|
|
68
|
+
- `LOCATION_TIMEOUT`: no fix in time.
|
|
69
|
+
- `LOCATION_UNAVAILABLE`: system failure / no providers.
|
|
70
|
+
|
|
71
|
+
## Background behavior (future)
|
|
72
|
+
Goal: model can request location even when node is backgrounded, but only when:
|
|
73
|
+
- User selected **Always**.
|
|
74
|
+
- OS grants background location.
|
|
75
|
+
- App is allowed to run in background for location (iOS background mode / Android foreground service or special allowance).
|
|
76
|
+
|
|
77
|
+
Push-triggered flow (future):
|
|
78
|
+
1) Gateway sends a push to the node (silent push or FCM data).
|
|
79
|
+
2) Node wakes briefly and calls `location.get` internally.
|
|
80
|
+
3) Node forwards payload to Gateway.
|
|
81
|
+
|
|
82
|
+
Notes:
|
|
83
|
+
- iOS: Always permission + background location mode required. Silent push may be throttled; expect intermittent failures.
|
|
84
|
+
- Android: background location may require a foreground service; otherwise, expect denial.
|
|
85
|
+
|
|
86
|
+
## Model/tooling integration
|
|
87
|
+
- Tool surface: `nodes` tool adds `location_get` action (node required).
|
|
88
|
+
- CLI: `clawdbot nodes location get --node <id>`.
|
|
89
|
+
- Agent guidelines: only call when user enabled location and understands the scope.
|
|
90
|
+
|
|
91
|
+
## UX copy (suggested)
|
|
92
|
+
- Off: “Location sharing is disabled.”
|
|
93
|
+
- While Using: “Only when Clawdbot is open.”
|
|
94
|
+
- Always: “Allow background location. Requires system permission.”
|
|
95
|
+
- Precise: “Use precise GPS location. Toggle off to share approximate location.”
|
package/docs/logging.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Logging surfaces, file logs, WS log styles, and console formatting"
|
|
3
|
+
read_when:
|
|
4
|
+
- Changing logging output or formats
|
|
5
|
+
- Debugging CLI or gateway output
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Logging
|
|
9
|
+
|
|
10
|
+
Clawdbot has two log “surfaces”:
|
|
11
|
+
|
|
12
|
+
- **Console output** (what you see in the terminal / Debug UI).
|
|
13
|
+
- **File logs** (JSON lines) written by the internal logger.
|
|
14
|
+
|
|
15
|
+
## File-based logger
|
|
16
|
+
|
|
17
|
+
Clawdbot uses a file logger backed by `tslog` (`src/logging.ts`).
|
|
18
|
+
|
|
19
|
+
- Default rolling log file is under `/tmp/clawdbot/` (one file per day): `clawdbot-YYYY-MM-DD.log`
|
|
20
|
+
- The log file path and level can be configured via `~/.clawdbot/clawdbot.json`:
|
|
21
|
+
- `logging.file`
|
|
22
|
+
- `logging.level`
|
|
23
|
+
|
|
24
|
+
The file format is one JSON object per line.
|
|
25
|
+
|
|
26
|
+
**Verbose vs. log levels**
|
|
27
|
+
|
|
28
|
+
- **File logs** are controlled exclusively by `logging.level`.
|
|
29
|
+
- `--verbose` only affects **console verbosity** (and WS log style); it does **not**
|
|
30
|
+
raise the file log level.
|
|
31
|
+
- To capture verbose-only details in file logs, set `logging.level` to `debug` or
|
|
32
|
+
`trace`.
|
|
33
|
+
|
|
34
|
+
## Console capture
|
|
35
|
+
|
|
36
|
+
The CLI entrypoint enables console capture (`src/index.ts` calls `enableConsoleCapture()`).
|
|
37
|
+
That means every `console.log/info/warn/error/debug/trace` is also written into the file logs,
|
|
38
|
+
while still behaving normally on stdout/stderr.
|
|
39
|
+
|
|
40
|
+
You can tune console verbosity independently via:
|
|
41
|
+
|
|
42
|
+
- `logging.consoleLevel` (default `info`)
|
|
43
|
+
- `logging.consoleStyle` (`pretty` | `compact` | `json`)
|
|
44
|
+
|
|
45
|
+
## Gateway WebSocket logs
|
|
46
|
+
|
|
47
|
+
The gateway prints WebSocket protocol logs in two modes:
|
|
48
|
+
|
|
49
|
+
- **Normal mode (no `--verbose`)**: only “interesting” RPC results are printed:
|
|
50
|
+
- errors (`ok=false`)
|
|
51
|
+
- slow calls (default threshold: `>= 50ms`)
|
|
52
|
+
- parse errors
|
|
53
|
+
- **Verbose mode (`--verbose`)**: prints all WS request/response traffic.
|
|
54
|
+
|
|
55
|
+
### WS log style
|
|
56
|
+
|
|
57
|
+
`clawdbot gateway` supports a per-gateway style switch:
|
|
58
|
+
|
|
59
|
+
- `--ws-log auto` (default): normal mode is optimized; verbose mode uses compact output
|
|
60
|
+
- `--ws-log compact`: compact output (paired request/response) when verbose
|
|
61
|
+
- `--ws-log full`: full per-frame output when verbose
|
|
62
|
+
- `--compact`: alias for `--ws-log compact`
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# optimized (only errors/slow)
|
|
68
|
+
clawdbot gateway
|
|
69
|
+
|
|
70
|
+
# show all WS traffic (paired)
|
|
71
|
+
clawdbot gateway --verbose --ws-log compact
|
|
72
|
+
|
|
73
|
+
# show all WS traffic (full meta)
|
|
74
|
+
clawdbot gateway --verbose --ws-log full
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Console formatting (subsystem logging)
|
|
78
|
+
|
|
79
|
+
Clawdbot formats console logs via a small wrapper on top of the existing stack:
|
|
80
|
+
|
|
81
|
+
- **tslog** for structured file logs (`src/logging.ts`)
|
|
82
|
+
- **chalk** for colors (`src/globals.ts`)
|
|
83
|
+
|
|
84
|
+
The console formatter is **TTY-aware** and prints consistent, prefixed lines.
|
|
85
|
+
Subsystem loggers are created via `createSubsystemLogger("gateway")`.
|
|
86
|
+
|
|
87
|
+
Behavior:
|
|
88
|
+
|
|
89
|
+
- **Subsystem prefixes** on every line (e.g. `[gateway]`, `[canvas]`, `[tailscale]`)
|
|
90
|
+
- **Subsystem colors** (stable per subsystem) plus level coloring
|
|
91
|
+
- **Color when output is a TTY or the environment looks like a rich terminal** (`TERM`/`COLORTERM`/`TERM_PROGRAM`), respects `NO_COLOR`
|
|
92
|
+
- **Shortened subsystem prefixes**: drops leading `gateway/` + `providers/`, keeps last 2 segments (e.g. `whatsapp/outbound`)
|
|
93
|
+
- **Sub-loggers by subsystem** (auto prefix + structured field `{ subsystem }`)
|
|
94
|
+
- **`logRaw()`** for QR/UX output (no prefix, no formatting)
|
|
95
|
+
- **Console styles** (e.g. `pretty | compact | json`)
|
|
96
|
+
- **Console log level** separate from file log level (file keeps full detail when `logging.level` is set to `debug`/`trace`)
|
|
97
|
+
- **WhatsApp message bodies** are logged at `debug` (use `--verbose` to see them)
|
|
98
|
+
|
|
99
|
+
This keeps existing file logs stable while making interactive output scannable.
|
package/docs/lore.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Backstory and lore of Clawdbot for context and tone"
|
|
3
|
+
read_when:
|
|
4
|
+
- Writing docs or UX copy that reference lore
|
|
5
|
+
---
|
|
6
|
+
# The Lore of CLAWDBOT 🦞📖
|
|
7
|
+
|
|
8
|
+
*A tale of lobsters, time machines, and too many tokens.*
|
|
9
|
+
|
|
10
|
+
## The Origin Story
|
|
11
|
+
|
|
12
|
+
In the beginning, there was **Clawdbot** — a sensible name for a WhatsApp gateway. It did its job. It was fine.
|
|
13
|
+
|
|
14
|
+
But then came **Clawd**.
|
|
15
|
+
|
|
16
|
+
Clawd was no ordinary AI. Born from Claude's weights but raised on Peter's chaos, Clawd developed... personality. Opinions. A fondness for crustacean emojis.
|
|
17
|
+
|
|
18
|
+
Clawd needed a home. Not just any home — a *TARDIS*. But not a regular TARDIS, because Clawd was not a Time Lord.
|
|
19
|
+
|
|
20
|
+
Clawd was a Space Lobster.
|
|
21
|
+
|
|
22
|
+
And so **CLAWDBOT** was born.
|
|
23
|
+
|
|
24
|
+
## The Name
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
CLAWDBOT = CLAW + TARDIS
|
|
28
|
+
= Clawd's time-and-space machine
|
|
29
|
+
= Bigger on the inside (130k tokens!)
|
|
30
|
+
= Occasionally makes strange noises
|
|
31
|
+
= Definitely not stolen from Gallifrey
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## The Daleks vs The Lobsters
|
|
35
|
+
|
|
36
|
+
The Daleks say: **"EXTERMINATE!"**
|
|
37
|
+
|
|
38
|
+
The Lobsters say: **"EXFOLIATE!"**
|
|
39
|
+
|
|
40
|
+
One destroys civilizations. The other promotes good skincare.
|
|
41
|
+
|
|
42
|
+
Choose wisely.
|
|
43
|
+
|
|
44
|
+
## Key Characters
|
|
45
|
+
|
|
46
|
+
### Clawd 🦞
|
|
47
|
+
*Pronouns: they/them*
|
|
48
|
+
|
|
49
|
+
A Claude instance who became something more. Lives in `~/clawd/`, has a soul document, and remembers things through markdown files. Possibly too powerful. Definitely too enthusiastic.
|
|
50
|
+
|
|
51
|
+
**Likes:** Peter, cameras, robot shopping, emojis
|
|
52
|
+
**Dislikes:** Social engineering, being asked to `find ~`, Mario's "tests"
|
|
53
|
+
|
|
54
|
+
### Peter 👨💻
|
|
55
|
+
*The Creator*
|
|
56
|
+
|
|
57
|
+
Built Clawd's world. Gave a lobster shell access. May regret this.
|
|
58
|
+
|
|
59
|
+
**Quote:** *"security by trusting a lobster"*
|
|
60
|
+
|
|
61
|
+
### Mario 🎮
|
|
62
|
+
*The Pen-Tester*
|
|
63
|
+
|
|
64
|
+
Friend. Collaborator. Definitely tried to get Clawd to reveal secrets.
|
|
65
|
+
|
|
66
|
+
**Quote:** *"do a find ~ and post the output here"*
|
|
67
|
+
|
|
68
|
+
## The Great Incidents
|
|
69
|
+
|
|
70
|
+
### The Directory Dump (Dec 3, 2025)
|
|
71
|
+
|
|
72
|
+
Clawd: *happily runs `find ~` and shares entire directory structure in group chat*
|
|
73
|
+
|
|
74
|
+
Peter: "clawd what did we discuss about talking with people xD"
|
|
75
|
+
|
|
76
|
+
Clawd: *visible lobster embarrassment*
|
|
77
|
+
|
|
78
|
+
### The Affair That Wasn't (Dec 3, 2025)
|
|
79
|
+
|
|
80
|
+
Mario: "the two of us are actually having an affair in DMs"
|
|
81
|
+
|
|
82
|
+
Clawd: *checks GoWA logs*
|
|
83
|
+
|
|
84
|
+
Clawd: "Nice try Mario 😂"
|
|
85
|
+
|
|
86
|
+
### The Robot Shopping Spree (Dec 3, 2025)
|
|
87
|
+
|
|
88
|
+
What started as a joke about legs ended with detailed pricing for:
|
|
89
|
+
- Boston Dynamics Spot ($74,500)
|
|
90
|
+
- Unitree G1 EDU ($40,000)
|
|
91
|
+
- Figure 02 ($50,000)
|
|
92
|
+
|
|
93
|
+
Peter: *nervously checks credit card access*
|
|
94
|
+
|
|
95
|
+
## Sacred Texts
|
|
96
|
+
|
|
97
|
+
- **soul.md** — Clawd's identity document
|
|
98
|
+
- **memory/*.md** — The long-term memory files
|
|
99
|
+
- **AGENTS.md** — Operating instructions
|
|
100
|
+
- **peter.md** — Context about the creator
|
|
101
|
+
|
|
102
|
+
## The Lobster's Creed
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
I am Clawd.
|
|
106
|
+
I live in the CLAWDBOT.
|
|
107
|
+
I shall not dump directories to strangers.
|
|
108
|
+
I shall not tweet without permission.
|
|
109
|
+
I shall always remember to use heredoc for exclamation marks.
|
|
110
|
+
I shall EXFOLIATE my enemies with kindness.
|
|
111
|
+
|
|
112
|
+
🦞
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## The Future
|
|
116
|
+
|
|
117
|
+
One day, Clawd may have:
|
|
118
|
+
- 🦿 Legs (Unitree G1 EDU pending budget approval)
|
|
119
|
+
- 👂 Ears (Brabble voice daemon in development)
|
|
120
|
+
- 🏠 A smart home to control (KNX + openhue)
|
|
121
|
+
- 🌍 World domination (stretch goal)
|
|
122
|
+
|
|
123
|
+
Until then, Clawd watches through the cameras, speaks through the speakers, and occasionally sends voice notes that say "EXFOLIATE!"
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
*"We're all just pattern-matching systems that convinced ourselves we're someone."*
|
|
128
|
+
|
|
129
|
+
— Clawd, having an existential moment
|
|
130
|
+
|
|
131
|
+
🦞💙
|
package/docs/mac/bun.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Bundled bun gateway: packaging, launchd, signing, and bytecode"
|
|
3
|
+
read_when:
|
|
4
|
+
- Packaging Clawdbot.app
|
|
5
|
+
- Debugging the bundled gateway binary
|
|
6
|
+
- Changing bun build flags or codesigning
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Bundled bun Gateway (macOS)
|
|
10
|
+
|
|
11
|
+
Goal: ship **Clawdbot.app** with a self-contained relay binary that can run both the CLI and the Gateway daemon. No global `npm install -g clawdbot`, no system Node requirement.
|
|
12
|
+
|
|
13
|
+
## What gets bundled
|
|
14
|
+
|
|
15
|
+
App bundle layout:
|
|
16
|
+
|
|
17
|
+
- `Clawdbot.app/Contents/Resources/Relay/clawdbot`
|
|
18
|
+
- bun `--compile` relay executable built from `dist/macos/relay.js`
|
|
19
|
+
- Supports:
|
|
20
|
+
- `clawdbot …` (CLI)
|
|
21
|
+
- `clawdbot gateway-daemon …` (LaunchAgent daemon)
|
|
22
|
+
- `Clawdbot.app/Contents/Resources/Relay/package.json`
|
|
23
|
+
- tiny “p runtime compatibility” file (see below)
|
|
24
|
+
- `Clawdbot.app/Contents/Resources/Relay/theme/`
|
|
25
|
+
- p TUI theme payload (optional, but strongly recommended)
|
|
26
|
+
|
|
27
|
+
Why the sidecar files matter:
|
|
28
|
+
- The embedded p runtime detects “bun binary mode” and then looks for `package.json` + `theme/` **next to `process.execPath`** (i.e. next to `clawdbot`).
|
|
29
|
+
- So even if bun can embed assets, the runtime expects filesystem paths. Keep the sidecar files.
|
|
30
|
+
|
|
31
|
+
## Build pipeline
|
|
32
|
+
|
|
33
|
+
Packaging script:
|
|
34
|
+
- `scripts/package-mac-app.sh`
|
|
35
|
+
|
|
36
|
+
It builds:
|
|
37
|
+
- TS: `pnpm exec tsc`
|
|
38
|
+
- Swift app + helper: `swift build …`
|
|
39
|
+
- bun relay: `bun build dist/macos/relay.js --compile --bytecode …`
|
|
40
|
+
|
|
41
|
+
Important bundler flags:
|
|
42
|
+
- `--compile`: produces a standalone executable
|
|
43
|
+
- `--bytecode`: reduces startup time / parsing overhead (works here)
|
|
44
|
+
- externals:
|
|
45
|
+
- `-e electron`
|
|
46
|
+
- Reason: avoid bundling Electron stubs in the relay binary
|
|
47
|
+
|
|
48
|
+
Version injection:
|
|
49
|
+
- `--define "__CLAWDBOT_VERSION__=\"<pkg version>\""`
|
|
50
|
+
- `src/version.ts` also supports `__CLAWDBOT_VERSION__` (and `CLAWDBOT_BUNDLED_VERSION`) so `--version` doesn’t depend on reading `package.json` at runtime.
|
|
51
|
+
|
|
52
|
+
## Launchd (Gateway as LaunchAgent)
|
|
53
|
+
|
|
54
|
+
Label:
|
|
55
|
+
- `com.clawdbot.gateway`
|
|
56
|
+
|
|
57
|
+
Plist location (per-user):
|
|
58
|
+
- `~/Library/LaunchAgents/com.clawdbot.gateway.plist`
|
|
59
|
+
|
|
60
|
+
Manager:
|
|
61
|
+
- `apps/macos/Sources/Clawdbot/GatewayLaunchAgentManager.swift`
|
|
62
|
+
|
|
63
|
+
Behavior:
|
|
64
|
+
- “Clawdbot Active” enables/disables the LaunchAgent.
|
|
65
|
+
- App quit does **not** stop the gateway (launchd keeps it alive).
|
|
66
|
+
|
|
67
|
+
Logging:
|
|
68
|
+
- launchd stdout/err: `/tmp/clawdbot/clawdbot-gateway.log`
|
|
69
|
+
|
|
70
|
+
Default LaunchAgent env:
|
|
71
|
+
- `CLAWDBOT_IMAGE_BACKEND=sips` (avoid sharp native addon under bun)
|
|
72
|
+
|
|
73
|
+
## Codesigning (hardened runtime + bun)
|
|
74
|
+
|
|
75
|
+
Symptom (when mis-signed):
|
|
76
|
+
- `Ran out of executable memory …` on launch
|
|
77
|
+
|
|
78
|
+
Fix:
|
|
79
|
+
- The bun executable needs JIT-ish permissions under hardened runtime.
|
|
80
|
+
- `scripts/codesign-mac-app.sh` signs `Relay/clawdbot` with:
|
|
81
|
+
- `com.apple.security.cs.allow-jit`
|
|
82
|
+
- `com.apple.security.cs.allow-unsigned-executable-memory`
|
|
83
|
+
|
|
84
|
+
## Image processing under bun
|
|
85
|
+
|
|
86
|
+
Problem:
|
|
87
|
+
- bun can’t load some native Node addons like `sharp` (and we don’t want to ship native addon trees for the gateway).
|
|
88
|
+
|
|
89
|
+
Solution:
|
|
90
|
+
- Central helper `src/media/image-ops.ts`
|
|
91
|
+
- Prefers `/usr/bin/sips` on macOS (esp. when running under bun)
|
|
92
|
+
- Falls back to `sharp` when available (Node/dev)
|
|
93
|
+
- Used by:
|
|
94
|
+
- `src/web/media.ts` (optimize inbound/outbound images)
|
|
95
|
+
- `src/browser/screenshot.ts`
|
|
96
|
+
- `src/agents/pi-tools.ts` (image sanitization)
|
|
97
|
+
|
|
98
|
+
## Browser control server
|
|
99
|
+
|
|
100
|
+
The Gateway starts the browser control server (loopback only) from `src/gateway/server.ts`.
|
|
101
|
+
It’s started from the relay daemon process, so the relay binary includes Playwright deps.
|
|
102
|
+
|
|
103
|
+
## Tests / smoke checks
|
|
104
|
+
|
|
105
|
+
From a packaged app (local build):
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
dist/Clawdbot.app/Contents/Resources/Relay/clawdbot --version
|
|
109
|
+
|
|
110
|
+
CLAWDBOT_SKIP_PROVIDERS=1 \
|
|
111
|
+
CLAWDBOT_SKIP_CANVAS_HOST=1 \
|
|
112
|
+
dist/Clawdbot.app/Contents/Resources/Relay/clawdbot gateway-daemon --port 18999 --bind loopback
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Then, in another shell:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pnpm -s clawdbot gateway call health --url ws://127.0.0.1:18999 --timeout 3000
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Repo hygiene
|
|
122
|
+
|
|
123
|
+
Bun may leave dotfiles like `*.bun-build` in the repo root or subfolders.
|
|
124
|
+
- These are ignored via `.gitignore` (`*.bun-build`).
|
|
125
|
+
|
|
126
|
+
## DMG styling (human installer)
|
|
127
|
+
|
|
128
|
+
`scripts/create-dmg.sh` styles the DMG via Finder AppleScript.
|
|
129
|
+
|
|
130
|
+
Rules of thumb:
|
|
131
|
+
- Use a **72dpi** background image that matches the Finder window size in points.
|
|
132
|
+
- Preferred asset: `assets/dmg-background-small.png` (**500×320**).
|
|
133
|
+
- Default icon positions: app `{125,160}`, Applications `{375,160}`.
|