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/nodes.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Nodes: pairing, capabilities, permissions, and CLI helpers for canvas/camera/screen/system"
|
|
3
|
+
read_when:
|
|
4
|
+
- Pairing iOS/Android nodes to a gateway
|
|
5
|
+
- Using node canvas/camera for agent context
|
|
6
|
+
- Adding new node commands or CLI helpers
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Nodes
|
|
10
|
+
|
|
11
|
+
A **node** is a companion device (iOS/Android today) that connects to the Gateway over the **Bridge** and exposes a command surface (e.g. `canvas.*`, `camera.*`, `system.*`) via `node.invoke`.
|
|
12
|
+
|
|
13
|
+
macOS can also run in **node mode**: the menubar app connects to the Gateway’s bridge and exposes its local canvas/camera commands as a node (so `clawdbot nodes …` works against this Mac).
|
|
14
|
+
|
|
15
|
+
## Pairing + status
|
|
16
|
+
|
|
17
|
+
Pairing is gateway-owned and approval-based. See `docs/gateway/pairing.md` for the full flow.
|
|
18
|
+
|
|
19
|
+
Quick CLI:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
clawdbot nodes pending
|
|
23
|
+
clawdbot nodes approve <requestId>
|
|
24
|
+
clawdbot nodes reject <requestId>
|
|
25
|
+
clawdbot nodes status
|
|
26
|
+
clawdbot nodes describe --node <idOrNameOrIp>
|
|
27
|
+
clawdbot nodes rename --node <idOrNameOrIp> --name "Kitchen iPad"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Notes:
|
|
31
|
+
- `nodes rename` stores a display name override in the gateway pairing store.
|
|
32
|
+
|
|
33
|
+
## Invoking commands
|
|
34
|
+
|
|
35
|
+
Low-level (raw RPC):
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
clawdbot nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Higher-level helpers exist for the common “give the agent a MEDIA attachment” workflows.
|
|
42
|
+
|
|
43
|
+
## Screenshots (canvas snapshots)
|
|
44
|
+
|
|
45
|
+
If the node is showing the Canvas (WebView), `canvas.snapshot` returns `{ format, base64 }`.
|
|
46
|
+
|
|
47
|
+
CLI helper (writes to a temp file and prints `MEDIA:<path>`):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
clawdbot nodes canvas snapshot --node <idOrNameOrIp> --format png
|
|
51
|
+
clawdbot nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Simple shortcut (auto-picks a single connected node if possible):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
clawdbot canvas snapshot --format png
|
|
58
|
+
clawdbot canvas snapshot --format jpg --max-width 1200 --quality 0.9
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Photos + videos (node camera)
|
|
62
|
+
|
|
63
|
+
Photos (`jpg`):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
clawdbot nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
|
|
67
|
+
clawdbot nodes camera snap --node <idOrNameOrIp> --facing front
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Video clips (`mp4`):
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
clawdbot nodes camera clip --node <idOrNameOrIp> --duration 10s
|
|
74
|
+
clawdbot nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Notes:
|
|
78
|
+
- The node must be **foregrounded** for `canvas.*` and `camera.*` (background calls return `NODE_BACKGROUND_UNAVAILABLE`).
|
|
79
|
+
- Clip duration is clamped (currently `<= 60s`) to avoid oversized base64 payloads.
|
|
80
|
+
- Android will prompt for `CAMERA`/`RECORD_AUDIO` permissions when possible; denied permissions fail with `*_PERMISSION_REQUIRED`.
|
|
81
|
+
|
|
82
|
+
## Screen recordings (nodes)
|
|
83
|
+
|
|
84
|
+
Nodes expose `screen.record` (mp4). Example:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
clawdbot nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
|
|
88
|
+
clawdbot nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Notes:
|
|
92
|
+
- `screen.record` requires the node app to be foregrounded.
|
|
93
|
+
- Android will show the system screen-capture prompt before recording.
|
|
94
|
+
- Screen recordings are clamped to `<= 60s`.
|
|
95
|
+
- `--no-audio` disables microphone capture (supported on iOS/Android; macOS uses system capture audio).
|
|
96
|
+
|
|
97
|
+
## Location (nodes)
|
|
98
|
+
|
|
99
|
+
Nodes expose `location.get` when Location is enabled in settings.
|
|
100
|
+
|
|
101
|
+
CLI helper:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
clawdbot nodes location get --node <idOrNameOrIp>
|
|
105
|
+
clawdbot nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Notes:
|
|
109
|
+
- Location is **off by default**.
|
|
110
|
+
- “Always” requires system permission; background fetch is best-effort.
|
|
111
|
+
- The response includes lat/lon, accuracy (meters), and timestamp.
|
|
112
|
+
|
|
113
|
+
## SMS (Android nodes)
|
|
114
|
+
|
|
115
|
+
Android nodes can expose `sms.send` when the user grants **SMS** permission and the device supports telephony.
|
|
116
|
+
|
|
117
|
+
Low-level invoke:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
clawdbot nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from Clawdbot"}'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Notes:
|
|
124
|
+
- The permission prompt must be accepted on the Android device before the capability is advertised.
|
|
125
|
+
- Wi-Fi-only devices without telephony will not advertise `sms.send`.
|
|
126
|
+
|
|
127
|
+
## System commands (mac node)
|
|
128
|
+
|
|
129
|
+
The macOS node exposes `system.run` and `system.notify`.
|
|
130
|
+
|
|
131
|
+
Examples:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
clawdbot nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
|
|
135
|
+
clawdbot nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Notes:
|
|
139
|
+
- `system.run` returns stdout/stderr/exit code in the payload.
|
|
140
|
+
- `system.notify` respects notification permission state on the macOS app.
|
|
141
|
+
|
|
142
|
+
## Permissions map
|
|
143
|
+
|
|
144
|
+
Nodes may include a `permissions` map in `node.list` / `node.describe`, keyed by permission name (e.g. `screenRecording`, `accessibility`) with boolean values (`true` = granted).
|
|
145
|
+
|
|
146
|
+
## Mac node mode
|
|
147
|
+
|
|
148
|
+
- The macOS menubar app connects to the Gateway bridge as a node (so `clawdbot nodes …` works against this Mac).
|
|
149
|
+
- In remote mode, the app opens an SSH tunnel for the bridge port and connects to `localhost`.
|
|
150
|
+
|
|
151
|
+
## Where to look in code
|
|
152
|
+
|
|
153
|
+
- CLI wiring: `src/cli/nodes-cli.ts`
|
|
154
|
+
- Canvas snapshot decoding/temp paths: `src/cli/nodes-canvas.ts`
|
|
155
|
+
- Duration parsing for CLI: `src/cli/parse-duration.ts`
|
|
156
|
+
- iOS node commands: `apps/ios/Sources/Model/NodeAppModel.swift`
|
|
157
|
+
- Android node commands: `apps/android/app/src/main/java/com/clawdbot/android/node/*`
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Onboarding + Config Protocol
|
|
2
|
+
|
|
3
|
+
Purpose: shared onboarding + config surfaces across CLI, macOS app, and Web UI.
|
|
4
|
+
|
|
5
|
+
## Components
|
|
6
|
+
- Wizard engine: `src/wizard` (session + prompts + onboarding state).
|
|
7
|
+
- CLI: `src/commands/onboard-*.ts` uses the wizard with the CLI prompter.
|
|
8
|
+
- Gateway RPC: wizard + config schema endpoints serve UI clients.
|
|
9
|
+
- macOS: SwiftUI onboarding uses the wizard step model.
|
|
10
|
+
- Web UI: config form renders from JSON Schema + hints.
|
|
11
|
+
|
|
12
|
+
## Gateway RPC
|
|
13
|
+
- `wizard.start` params: `{ mode?: "local"|"remote", workspace?: string }`
|
|
14
|
+
- `wizard.next` params: `{ sessionId, answer?: { stepId, value? } }`
|
|
15
|
+
- `wizard.cancel` params: `{ sessionId }`
|
|
16
|
+
- `wizard.status` params: `{ sessionId }`
|
|
17
|
+
- `config.schema` params: `{}`
|
|
18
|
+
|
|
19
|
+
Responses (shape)
|
|
20
|
+
- Wizard: `{ sessionId, done, step?, status?, error? }`
|
|
21
|
+
- Config schema: `{ schema, uiHints, version, generatedAt }`
|
|
22
|
+
|
|
23
|
+
## UI Hints
|
|
24
|
+
- `uiHints` keyed by path; optional metadata (label/help/group/order/advanced/sensitive/placeholder).
|
|
25
|
+
- Sensitive fields render as password inputs; no redaction layer.
|
|
26
|
+
- Unsupported schema nodes fall back to the raw JSON editor.
|
|
27
|
+
|
|
28
|
+
## Notes
|
|
29
|
+
- This doc is the single place to track protocol refactors for onboarding/config.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Planned first-run onboarding flow for Clawdbot (local vs remote, Anthropic OAuth, workspace bootstrap ritual)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Designing the macOS onboarding assistant
|
|
5
|
+
- Implementing Anthropic auth or identity setup
|
|
6
|
+
---
|
|
7
|
+
<!-- {% raw %} -->
|
|
8
|
+
# Onboarding (macOS app)
|
|
9
|
+
|
|
10
|
+
This doc describes the intended **first-run onboarding** for Clawdbot. The goal is a good “day 0” experience: pick where the Gateway runs, bind Claude (Anthropic) auth for the embedded agent runtime, and then let the **agent bootstrap itself** via a first-run ritual in the workspace.
|
|
11
|
+
|
|
12
|
+
## Page order (high level)
|
|
13
|
+
|
|
14
|
+
1) **Local vs Remote**
|
|
15
|
+
2) **(Local only)** Connect Claude (Anthropic OAuth) — optional, but recommended
|
|
16
|
+
3) **Connect Gmail (optional)** — run `clawdbot hooks gmail setup` to configure Pub/Sub hooks
|
|
17
|
+
4) **Onboarding chat** — dedicated session where the agent introduces itself and guides setup
|
|
18
|
+
|
|
19
|
+
## 1) Local vs Remote
|
|
20
|
+
|
|
21
|
+
First question: where does the **Gateway** run?
|
|
22
|
+
|
|
23
|
+
- **Local (this Mac):** onboarding can run the Anthropic OAuth flow and write the Clawdbot token store locally.
|
|
24
|
+
- **Remote (over SSH/tailnet):** onboarding must not run OAuth locally, because credentials must exist on the **gateway host**.
|
|
25
|
+
|
|
26
|
+
Gateway auth tip:
|
|
27
|
+
- If you only use Clawdbot on this Mac (loopback gateway), keep auth **Off**.
|
|
28
|
+
- Use **Token** for multi-machine access or non-loopback binds.
|
|
29
|
+
|
|
30
|
+
Implementation note (2025-12-19): in local mode, the macOS app bundles the Gateway and enables it via a per-user launchd LaunchAgent (no global npm install/Node requirement for the user).
|
|
31
|
+
|
|
32
|
+
## 2) Local-only: Connect Claude (Anthropic OAuth)
|
|
33
|
+
|
|
34
|
+
This is the “bind Clawdbot to Anthropic” step. It is explicitly the **Anthropic (Claude Pro/Max) OAuth flow**, not a generic “login”.
|
|
35
|
+
|
|
36
|
+
### Recommended: OAuth
|
|
37
|
+
|
|
38
|
+
The macOS app should:
|
|
39
|
+
- Start the Anthropic OAuth (PKCE) flow in the user’s browser.
|
|
40
|
+
- Ask the user to paste the `code#state` value.
|
|
41
|
+
- Exchange it for tokens and write credentials to:
|
|
42
|
+
- `~/.clawdbot/credentials/oauth.json` (file mode `0600`, directory mode `0700`)
|
|
43
|
+
|
|
44
|
+
Why this location matters: it’s the Clawdbot-owned OAuth store.
|
|
45
|
+
On first run, Clawdbot can import existing OAuth tokens from legacy p/Claude locations if present.
|
|
46
|
+
|
|
47
|
+
### Alternative: API key (instructions only)
|
|
48
|
+
|
|
49
|
+
Offer an “API key” option, but for now it is **instructions only**:
|
|
50
|
+
- Get an Anthropic API key.
|
|
51
|
+
- Provide it to Clawdbot via your preferred mechanism (env/config).
|
|
52
|
+
|
|
53
|
+
Note: environment variables are often confusing when the Gateway is launched by a GUI app (launchd environment != your shell).
|
|
54
|
+
|
|
55
|
+
### Model safety rule
|
|
56
|
+
|
|
57
|
+
Clawdbot should **always pass** `--model` when invoking the embedded agent (don’t rely on defaults).
|
|
58
|
+
|
|
59
|
+
Example (CLI):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
clawdbot agent --mode rpc --model anthropic/claude-opus-4-5 "<message>"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If the user skips auth, onboarding should be clear: the agent likely won’t respond until auth is configured.
|
|
66
|
+
|
|
67
|
+
## 4) Onboarding chat (dedicated session)
|
|
68
|
+
|
|
69
|
+
The onboarding flow now embeds the SwiftUI chat view directly. It uses a **special session key**
|
|
70
|
+
(`onboarding`) so the “newborn agent” ritual stays separate from the main chat.
|
|
71
|
+
|
|
72
|
+
This onboarding chat is where the agent:
|
|
73
|
+
- does the BOOTSTRAP.md identity ritual (one question at a time)
|
|
74
|
+
- visits **soul.md** with the user and writes `SOUL.md` (values, tone, boundaries)
|
|
75
|
+
- asks how the user wants to talk (web-only / WhatsApp / Telegram)
|
|
76
|
+
- guides linking steps (including showing a QR inline for WhatsApp via the `whatsapp_login` tool)
|
|
77
|
+
|
|
78
|
+
If the workspace bootstrap is already complete (BOOTSTRAP.md removed), the onboarding chat step is skipped.
|
|
79
|
+
|
|
80
|
+
## 2.5) Optional: Connect Gmail
|
|
81
|
+
|
|
82
|
+
The macOS onboarding includes an optional Gmail step. It runs:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
clawdbot hooks gmail setup --account you@gmail.com
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
This writes the full `hooks.gmail` config, installs `gcloud` / `gog` / `tailscale`
|
|
89
|
+
via Homebrew if needed, and configures the Pub/Sub push endpoint. After setup,
|
|
90
|
+
restart the gateway so the internal Gmail watcher starts.
|
|
91
|
+
|
|
92
|
+
Once setup is complete, the user can switch to the normal chat (`main`) via the menu bar panel.
|
|
93
|
+
|
|
94
|
+
## 5) Agent bootstrap ritual (outside onboarding)
|
|
95
|
+
|
|
96
|
+
We no longer collect identity in the onboarding wizard. Instead, the **first agent run** performs a playful bootstrap ritual using files in the workspace:
|
|
97
|
+
|
|
98
|
+
- Workspace is created implicitly (default `~/.clawdbot/workspace`) when local is selected,
|
|
99
|
+
but only if the folder is empty or already contains `AGENTS.md`.
|
|
100
|
+
- Files are seeded: `AGENTS.md`, `BOOTSTRAP.md`, `IDENTITY.md`, `USER.md`.
|
|
101
|
+
- `BOOTSTRAP.md` tells the agent to keep it conversational:
|
|
102
|
+
- open with a cute hello
|
|
103
|
+
- ask **one question at a time** (no multi-question bombardment)
|
|
104
|
+
- offer a small set of suggestions where helpful (name, creature, emoji)
|
|
105
|
+
- wait for the user’s reply before asking the next question
|
|
106
|
+
- The agent writes results to:
|
|
107
|
+
- `IDENTITY.md` (agent name, vibe/creature, emoji)
|
|
108
|
+
- `USER.md` (who the user is + how they want to be addressed)
|
|
109
|
+
- `SOUL.md` (identity, tone, boundaries — crafted from the soul.md prompt)
|
|
110
|
+
- `~/.clawdbot/clawdbot.json` (structured identity defaults)
|
|
111
|
+
- After the ritual, the agent **deletes `BOOTSTRAP.md`** so it only runs once.
|
|
112
|
+
|
|
113
|
+
Identity data still feeds the same defaults as before:
|
|
114
|
+
|
|
115
|
+
- outbound prefix emoji (`messages.responsePrefix`)
|
|
116
|
+
- group mention patterns / wake words
|
|
117
|
+
- default session intro (“You are Samantha…”)
|
|
118
|
+
- macOS UI labels
|
|
119
|
+
|
|
120
|
+
## 6) Workspace notes (no explicit onboarding step)
|
|
121
|
+
|
|
122
|
+
The workspace is created automatically as part of agent bootstrap (no dedicated onboarding screen).
|
|
123
|
+
|
|
124
|
+
Recommendation: treat the workspace as the agent’s “memory” and make it a git repo (ideally private) so identity + memories are backed up:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
cd ~/.clawdbot/workspace
|
|
128
|
+
git init
|
|
129
|
+
git add AGENTS.md
|
|
130
|
+
git commit -m "Add agent workspace"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Daily memory lives under `memory/` in the workspace:
|
|
134
|
+
- one file per day: `memory/YYYY-MM-DD.md`
|
|
135
|
+
- read today + yesterday on session start
|
|
136
|
+
- keep it short (durable facts, preferences, decisions; avoid secrets)
|
|
137
|
+
|
|
138
|
+
## Remote mode note (why OAuth is hidden)
|
|
139
|
+
|
|
140
|
+
If the Gateway runs on another machine, the Anthropic OAuth credentials must be created/stored on that host (where the agent runtime runs).
|
|
141
|
+
|
|
142
|
+
For now, remote onboarding should:
|
|
143
|
+
- explain why OAuth isn't shown
|
|
144
|
+
- point the user at the credential location (`~/.clawdbot/credentials/oauth.json`) and the workspace location on the gateway host
|
|
145
|
+
- mention that the **bootstrap ritual happens on the gateway host** (same BOOTSTRAP/IDENTITY/USER files)
|
|
146
|
+
|
|
147
|
+
### Manual credential setup
|
|
148
|
+
|
|
149
|
+
On the gateway host, create `~/.clawdbot/credentials/oauth.json` with this exact format:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"anthropic": {
|
|
154
|
+
"access": "sk-ant-oat01-...",
|
|
155
|
+
"refresh": "sk-ant-ort01-...",
|
|
156
|
+
"expires": 1767304352803
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Set permissions: `chmod 600 ~/.clawdbot/credentials/oauth.json`
|
|
162
|
+
|
|
163
|
+
**Note:** Clawdbot can auto-import from legacy pi-coding-agent paths (`~/.pi/agent/oauth.json`, etc.) but this does NOT work with Claude Code credentials — different file and format.
|
|
164
|
+
|
|
165
|
+
### Using Claude Code credentials
|
|
166
|
+
|
|
167
|
+
If Claude Code is installed on the gateway host, convert its credentials:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
cat ~/.claude/.credentials.json | jq '{
|
|
171
|
+
anthropic: {
|
|
172
|
+
access: .claudeAiOauth.accessToken,
|
|
173
|
+
refresh: .claudeAiOauth.refreshToken,
|
|
174
|
+
expires: .claudeAiOauth.expiresAt
|
|
175
|
+
}
|
|
176
|
+
}' > ~/.clawdbot/credentials/oauth.json
|
|
177
|
+
chmod 600 ~/.clawdbot/credentials/oauth.json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
| Claude Code field | Clawdbot field |
|
|
181
|
+
|-------------------|---------------|
|
|
182
|
+
| `accessToken` | `access` |
|
|
183
|
+
| `refreshToken` | `refresh` |
|
|
184
|
+
| `expiresAt` | `expires` |
|
|
185
|
+
<!-- {% endraw %} -->
|
package/docs/presence.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "How Clawdbot presence entries are produced, merged, and displayed"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging the Instances tab
|
|
5
|
+
- Investigating duplicate or stale instance rows
|
|
6
|
+
- Changing gateway WS connect or system-event beacons
|
|
7
|
+
---
|
|
8
|
+
# Presence
|
|
9
|
+
|
|
10
|
+
Clawdbot “presence” is a lightweight, best-effort view of:
|
|
11
|
+
- The **Gateway** itself (one per host), and
|
|
12
|
+
- The **clients connected to the Gateway** (mac app, WebChat, CLI, etc.).
|
|
13
|
+
|
|
14
|
+
Presence is used primarily to render the mac app’s **Instances** tab and to provide quick operator visibility.
|
|
15
|
+
|
|
16
|
+
## The data model
|
|
17
|
+
|
|
18
|
+
Presence entries are structured objects with (some) fields:
|
|
19
|
+
- `instanceId` (optional but strongly recommended): stable client identity used for dedupe
|
|
20
|
+
- `host`: a human-readable name (often the machine name)
|
|
21
|
+
- `ip`: best-effort IP address (may be missing or stale)
|
|
22
|
+
- `version`: client version string
|
|
23
|
+
- `deviceFamily` (optional): hardware family like `iPad`, `iPhone`, `Mac`
|
|
24
|
+
- `modelIdentifier` (optional): hardware model identifier like `iPad16,6` or `Mac16,6`
|
|
25
|
+
- `mode`: e.g. `gateway`, `app`, `webchat`, `cli`
|
|
26
|
+
- `lastInputSeconds` (optional): “seconds since last user input” for that client machine
|
|
27
|
+
- `reason`: a short marker like `self`, `connect`, `node-connected`, `node-disconnected`, `periodic`, `instances-refresh`
|
|
28
|
+
- `text`: legacy/debug summary string (kept for backwards compatibility and UI display)
|
|
29
|
+
- `ts`: last update timestamp (ms since epoch)
|
|
30
|
+
|
|
31
|
+
## Producers (where presence comes from)
|
|
32
|
+
|
|
33
|
+
Presence entries are produced by multiple sources and then **merged**.
|
|
34
|
+
|
|
35
|
+
### 1) Gateway self entry
|
|
36
|
+
|
|
37
|
+
The Gateway seeds a “self” entry at startup so UIs always show at least the current gateway host.
|
|
38
|
+
|
|
39
|
+
Implementation: `src/infra/system-presence.ts` (`initSelfPresence()`).
|
|
40
|
+
|
|
41
|
+
### 2) WebSocket connect (connection-derived presence)
|
|
42
|
+
|
|
43
|
+
Every WS client must begin with a `connect` request. On successful handshake, the Gateway upserts a presence entry for that connection.
|
|
44
|
+
|
|
45
|
+
This is meant to answer: “Which clients are currently connected?”
|
|
46
|
+
|
|
47
|
+
Implementation: `src/gateway/server.ts` (connect handling uses `connect.params.client.instanceId` when provided; otherwise falls back to `connId`).
|
|
48
|
+
|
|
49
|
+
#### Why one-off CLI commands do not show up
|
|
50
|
+
|
|
51
|
+
The CLI connects to the Gateway to execute one-off commands (health/status/send/agent/etc.). These are not “nodes” and would spam the Instances list, so the Gateway does not create presence entries for clients with `client.mode === "cli"`.
|
|
52
|
+
|
|
53
|
+
### 3) `system-event` beacons (client-reported presence)
|
|
54
|
+
|
|
55
|
+
Clients can publish richer periodic beacons via the `system-event` method. The mac app uses this to report:
|
|
56
|
+
- a human-friendly host name
|
|
57
|
+
- its best-known IP address
|
|
58
|
+
- `lastInputSeconds`
|
|
59
|
+
|
|
60
|
+
Implementation:
|
|
61
|
+
- Gateway: `src/gateway/server.ts` handles method `system-event` by calling `updateSystemPresence(...)`.
|
|
62
|
+
- mac app beaconing: `apps/macos/Sources/Clawdbot/PresenceReporter.swift`.
|
|
63
|
+
|
|
64
|
+
### 4) Node bridge beacons (gateway-owned presence)
|
|
65
|
+
|
|
66
|
+
When a node bridge connection authenticates, the Gateway emits a presence entry
|
|
67
|
+
for that node and starts periodic refresh beacons so it does not expire.
|
|
68
|
+
|
|
69
|
+
- Connect/disconnect markers: `node-connected`, `node-disconnected`
|
|
70
|
+
- Periodic heartbeat: every 3 minutes (`reason: periodic`)
|
|
71
|
+
|
|
72
|
+
Implementation: `src/gateway/server.ts` (node bridge handlers + timer beacons).
|
|
73
|
+
|
|
74
|
+
## Merge + dedupe rules (why `instanceId` matters)
|
|
75
|
+
|
|
76
|
+
All producers write into a single in-memory presence map.
|
|
77
|
+
|
|
78
|
+
Key points:
|
|
79
|
+
- Entries are **keyed** by a “presence key”. If two producers use the same key, they update the same entry.
|
|
80
|
+
- The best key is a stable, opaque `instanceId` that does not change across restarts.
|
|
81
|
+
- Keys are treated case-insensitively.
|
|
82
|
+
|
|
83
|
+
Implementation: `src/infra/system-presence.ts` (`normalizePresenceKey()`).
|
|
84
|
+
|
|
85
|
+
### mac app identity (stable UUID)
|
|
86
|
+
|
|
87
|
+
The mac app uses a persisted UUID as `instanceId` so:
|
|
88
|
+
- restarts/reconnects do not create duplicates
|
|
89
|
+
- renaming the Mac does not create a new “instance”
|
|
90
|
+
- debug/release builds can share the same identity
|
|
91
|
+
|
|
92
|
+
Implementation: `apps/macos/Sources/Clawdbot/InstanceIdentity.swift`.
|
|
93
|
+
|
|
94
|
+
`displayName` (machine name) is used for UI, while `instanceId` is used for dedupe.
|
|
95
|
+
|
|
96
|
+
## TTL and bounded size (why stale rows disappear)
|
|
97
|
+
|
|
98
|
+
Presence entries are not permanent:
|
|
99
|
+
- TTL: entries older than 5 minutes are pruned
|
|
100
|
+
- Max: map is capped at 200 entries (LRU by `ts`)
|
|
101
|
+
|
|
102
|
+
Implementation: `src/infra/system-presence.ts` (`TTL_MS`, `MAX_ENTRIES`, pruning in `listSystemPresence()`).
|
|
103
|
+
|
|
104
|
+
## Remote/tunnel caveat (loopback IPs)
|
|
105
|
+
|
|
106
|
+
When a client connects over an SSH tunnel / local port forward, the Gateway may see the remote address as loopback (`127.0.0.1`).
|
|
107
|
+
|
|
108
|
+
To avoid degrading an otherwise-correct client beacon IP, the Gateway avoids writing loopback remote addresses into presence entries.
|
|
109
|
+
|
|
110
|
+
Implementation: `src/gateway/server.ts` (`isLoopbackAddress()`).
|
|
111
|
+
|
|
112
|
+
## Consumers (who reads presence)
|
|
113
|
+
|
|
114
|
+
### macOS Instances tab
|
|
115
|
+
|
|
116
|
+
The mac app’s Instances tab renders the result of `system-presence`.
|
|
117
|
+
|
|
118
|
+
Implementation:
|
|
119
|
+
- View: `apps/macos/Sources/Clawdbot/InstancesSettings.swift`
|
|
120
|
+
- Store: `apps/macos/Sources/Clawdbot/InstancesStore.swift`
|
|
121
|
+
|
|
122
|
+
The Instances rows show a small presence indicator (Active/Idle/Stale) based on
|
|
123
|
+
the last beacon age. The label is derived from the entry timestamp (`ts`).
|
|
124
|
+
|
|
125
|
+
The store refreshes periodically and also applies `presence` WS events.
|
|
126
|
+
|
|
127
|
+
## Debugging tips
|
|
128
|
+
|
|
129
|
+
- To see the raw list, call `system-presence` against the gateway.
|
|
130
|
+
- If you see duplicates:
|
|
131
|
+
- confirm clients send a stable `instanceId` in the handshake (`connect.params.client.instanceId`)
|
|
132
|
+
- confirm beaconing uses the same `instanceId`
|
|
133
|
+
- check whether the connection-derived entry is missing `instanceId` (then it will be keyed by `connId` and duplicates are expected on reconnect)
|
package/docs/queue.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Command queue design that serializes auto-reply command execution"
|
|
3
|
+
read_when:
|
|
4
|
+
- Changing auto-reply execution or concurrency
|
|
5
|
+
---
|
|
6
|
+
# Command Queue (2026-01-03)
|
|
7
|
+
|
|
8
|
+
We now serialize command-based auto-replies (WhatsApp Web listener) through a tiny in-process queue to prevent multiple commands from running at once, while allowing safe parallelism across sessions.
|
|
9
|
+
|
|
10
|
+
## Why
|
|
11
|
+
- Some auto-reply commands are expensive (LLM calls) and can collide when multiple inbound messages arrive close together.
|
|
12
|
+
- Serializing avoids competing for terminal/stdin, keeps logs readable, and reduces the chance of rate limits from upstream tools.
|
|
13
|
+
|
|
14
|
+
## How it works
|
|
15
|
+
- `src/process/command-queue.ts` holds a lane-aware FIFO queue and drains each lane synchronously.
|
|
16
|
+
- `runEmbeddedPiAgent` enqueues by **session key** (lane `session:<key>`) to guarantee only one active run per session.
|
|
17
|
+
- Each session run is then queued into a **global lane** (`main` by default) so overall parallelism is capped by `agent.maxConcurrent`.
|
|
18
|
+
- When verbose logging is enabled, queued commands emit a short notice if they waited more than ~2s before starting.
|
|
19
|
+
- Typing indicators (`onReplyStart`) still fire immediately on enqueue so user experience is unchanged while we wait our turn.
|
|
20
|
+
|
|
21
|
+
## Queue modes (per surface)
|
|
22
|
+
Inbound messages can steer the current run, wait for a followup turn, or do both:
|
|
23
|
+
- `steer`: inject immediately into the current run (cancels pending tool calls after the next tool boundary). If not streaming, falls back to followup.
|
|
24
|
+
- `followup`: enqueue for the next agent turn after the current run ends.
|
|
25
|
+
- `collect`: coalesce all queued messages into a **single** followup turn (default).
|
|
26
|
+
- `steer-backlog` (aka `steer+backlog`): steer now **and** preserve the message for a followup turn.
|
|
27
|
+
- `interrupt` (legacy): abort the active run for that session, then run the newest message.
|
|
28
|
+
- `queue` (legacy alias): same as `steer`.
|
|
29
|
+
|
|
30
|
+
Steer-backlog means you can get a followup response after the steered run, so
|
|
31
|
+
streaming surfaces can look like duplicates. Prefer `collect`/`steer` if you want
|
|
32
|
+
one response per inbound message.
|
|
33
|
+
Inline fix: `/queue collect` (per-session) or set `routing.queue.bySurface.discord: "collect"`.
|
|
34
|
+
|
|
35
|
+
Defaults (when unset in config):
|
|
36
|
+
- All surfaces → `collect`
|
|
37
|
+
|
|
38
|
+
Configure globally or per surface via `routing.queue`:
|
|
39
|
+
|
|
40
|
+
```json5
|
|
41
|
+
{
|
|
42
|
+
routing: {
|
|
43
|
+
queue: {
|
|
44
|
+
mode: "collect",
|
|
45
|
+
debounceMs: 1000,
|
|
46
|
+
cap: 20,
|
|
47
|
+
drop: "summarize",
|
|
48
|
+
bySurface: { discord: "collect" }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Queue options
|
|
55
|
+
Options apply to `followup`, `collect`, and `steer-backlog` (and to `steer` when it falls back to followup):
|
|
56
|
+
- `debounceMs`: wait for quiet before starting a followup turn (prevents “continue, continue”).
|
|
57
|
+
- `cap`: max queued messages per session.
|
|
58
|
+
- `drop`: overflow policy (`old`, `new`, `summarize`).
|
|
59
|
+
|
|
60
|
+
Summarize keeps a short bullet list of dropped messages and injects it as a synthetic followup prompt.
|
|
61
|
+
Defaults: `debounceMs: 1000`, `cap: 20`, `drop: summarize`.
|
|
62
|
+
|
|
63
|
+
## Per-session overrides
|
|
64
|
+
- `/queue <mode>` as a standalone command stores the mode for the current session.
|
|
65
|
+
- `/queue <mode>` embedded in a message applies **once** (no persistence).
|
|
66
|
+
- Options can be combined: `/queue collect debounce:2s cap:25 drop:summarize`
|
|
67
|
+
- `/queue default` or `/queue reset` clears the session override.
|
|
68
|
+
|
|
69
|
+
## Scope and guarantees
|
|
70
|
+
- Applies only to config-driven command replies; plain text replies are unaffected.
|
|
71
|
+
- Default lane (`main`) is process-wide for inbound + main heartbeats; set `agent.maxConcurrent` to allow multiple sessions in parallel.
|
|
72
|
+
- Additional lanes may exist (e.g. `cron`) so background jobs can run in parallel without blocking inbound replies.
|
|
73
|
+
- Per-session lanes guarantee that only one agent run touches a given session at a time.
|
|
74
|
+
- No external dependencies or background worker threads; pure TypeScript + promises.
|
|
75
|
+
|
|
76
|
+
## Troubleshooting
|
|
77
|
+
- If commands seem stuck, enable verbose logs and look for “queued for …ms” lines to confirm the queue is draining.
|
|
78
|
+
- `enqueueCommand` exposes a lightweight `getQueueSize()` helper if you need to surface queue depth in future diagnostics.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Refactor: simplify browser control API + implementation"
|
|
3
|
+
read_when:
|
|
4
|
+
- Refactoring browser control routes, client, or CLI
|
|
5
|
+
- Auditing agent-facing browser tool surface
|
|
6
|
+
date: 2025-12-20
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Refactor: Browser control simplification
|
|
10
|
+
|
|
11
|
+
Goal: make the browser-control surface **small, stable, and agent-oriented**, and remove “implementation-shaped” APIs (Playwright/CDP specifics, one-off endpoints, and debugging helpers).
|
|
12
|
+
|
|
13
|
+
## Why
|
|
14
|
+
|
|
15
|
+
- The previous API accreted many narrow endpoints (`/click`, `/type`, `/press`, …) plus debug utilities.
|
|
16
|
+
- Some actions are inherently racy when modeled as “do X *when* the event is already visible” (file chooser, dialogs).
|
|
17
|
+
- We want a single, coherent contract that keeps “how it’s implemented” private.
|
|
18
|
+
|
|
19
|
+
## Target contract (vNext)
|
|
20
|
+
|
|
21
|
+
**Basics**
|
|
22
|
+
- `GET /` status
|
|
23
|
+
- `POST /start`, `POST /stop`
|
|
24
|
+
- `GET /tabs`, `POST /tabs/open`, `POST /tabs/focus`, `DELETE /tabs/:targetId`
|
|
25
|
+
|
|
26
|
+
**Agent actions**
|
|
27
|
+
- `POST /navigate` `{ url, targetId? }`
|
|
28
|
+
- `POST /act` `{ kind, targetId?, ... }` where `kind` is one of:
|
|
29
|
+
- `click`, `type`, `press`, `hover`, `drag`, `select`, `fill`, `wait`, `resize`, `close`, `evaluate`
|
|
30
|
+
- `POST /screenshot` `{ targetId?, fullPage?, ref?, element?, type? }`
|
|
31
|
+
- `GET /snapshot` `?format=ai|aria&targetId?&limit?`
|
|
32
|
+
- `GET /console` `?level?&targetId?`
|
|
33
|
+
- `POST /pdf` `{ targetId? }`
|
|
34
|
+
|
|
35
|
+
**Hooks (pre-setup / arming)**
|
|
36
|
+
- `POST /hooks/file-chooser` `{ targetId?, paths, timeoutMs? }`
|
|
37
|
+
- `POST /hooks/dialog` `{ targetId?, accept, promptText?, timeoutMs? }`
|
|
38
|
+
|
|
39
|
+
Semantics:
|
|
40
|
+
- Hook endpoints **arm** the next matching event within `timeoutMs` (default 2 minutes, clamped to max 2 minutes).
|
|
41
|
+
- Last arm wins per page (new arm replaces previous).
|
|
42
|
+
|
|
43
|
+
## Work checklist
|
|
44
|
+
|
|
45
|
+
- [x] Replace action endpoints with `POST /act`
|
|
46
|
+
- [x] Remove legacy endpoints (`/click`, `/type`, `/wait`, …) and any CLI wrappers that no longer make sense
|
|
47
|
+
- [x] Remove `/back` and any history-specific routes
|
|
48
|
+
- [x] Convert `upload` + `dialog` to hook/arming endpoints
|
|
49
|
+
- [x] Unify screenshots behind `POST /screenshot` (no GET variant)
|
|
50
|
+
- [x] Trim inspect/debug endpoints (`/query`, `/dom`) unless explicitly needed
|
|
51
|
+
- [x] Update docs/browser.md to describe contract without implementation details
|
|
52
|
+
- [x] Update tests (server + client) to cover vNext contract
|
|
53
|
+
|
|
54
|
+
## Notes / decisions
|
|
55
|
+
|
|
56
|
+
- Keep Playwright as an internal implementation detail for now.
|
|
57
|
+
- Prefer ref-based interactions (`aria-ref`) over coordinate-based ones.
|
|
58
|
+
- Keep the code split “routes vs. engine” small and obvious; avoid scattering logic across too many files.
|