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
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { resolveBrowserControlUrl } from "../browser/client.js";
|
|
2
|
+
import { browserAct, browserArmDialog, browserArmFileChooser, browserNavigate, } from "../browser/client-actions.js";
|
|
3
|
+
import { danger } from "../globals.js";
|
|
4
|
+
import { defaultRuntime } from "../runtime.js";
|
|
5
|
+
async function readFile(path) {
|
|
6
|
+
const fs = await import("node:fs/promises");
|
|
7
|
+
return await fs.readFile(path, "utf8");
|
|
8
|
+
}
|
|
9
|
+
async function readFields(opts) {
|
|
10
|
+
const payload = opts.fieldsFile
|
|
11
|
+
? await readFile(opts.fieldsFile)
|
|
12
|
+
: (opts.fields ?? "");
|
|
13
|
+
if (!payload.trim())
|
|
14
|
+
throw new Error("fields are required");
|
|
15
|
+
const parsed = JSON.parse(payload);
|
|
16
|
+
if (!Array.isArray(parsed))
|
|
17
|
+
throw new Error("fields must be an array");
|
|
18
|
+
return parsed.map((entry, index) => {
|
|
19
|
+
if (!entry || typeof entry !== "object") {
|
|
20
|
+
throw new Error(`fields[${index}] must be an object`);
|
|
21
|
+
}
|
|
22
|
+
const rec = entry;
|
|
23
|
+
const ref = typeof rec.ref === "string" ? rec.ref.trim() : "";
|
|
24
|
+
const type = typeof rec.type === "string" ? rec.type.trim() : "";
|
|
25
|
+
if (!ref || !type) {
|
|
26
|
+
throw new Error(`fields[${index}] must include ref and type`);
|
|
27
|
+
}
|
|
28
|
+
if (typeof rec.value === "string" ||
|
|
29
|
+
typeof rec.value === "number" ||
|
|
30
|
+
typeof rec.value === "boolean") {
|
|
31
|
+
return { ref, type, value: rec.value };
|
|
32
|
+
}
|
|
33
|
+
if (rec.value === undefined || rec.value === null) {
|
|
34
|
+
return { ref, type };
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`fields[${index}].value must be string, number, boolean, or null`);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function registerBrowserActionInputCommands(browser, parentOpts) {
|
|
40
|
+
browser
|
|
41
|
+
.command("navigate")
|
|
42
|
+
.description("Navigate the current tab to a URL")
|
|
43
|
+
.argument("<url>", "URL to navigate to")
|
|
44
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
45
|
+
.action(async (url, opts, cmd) => {
|
|
46
|
+
const parent = parentOpts(cmd);
|
|
47
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
48
|
+
const profile = parent?.profile;
|
|
49
|
+
try {
|
|
50
|
+
const result = await browserNavigate(baseUrl, {
|
|
51
|
+
url,
|
|
52
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
53
|
+
profile,
|
|
54
|
+
});
|
|
55
|
+
if (parent?.json) {
|
|
56
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
defaultRuntime.log(`navigated to ${result.url ?? url}`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
defaultRuntime.error(danger(String(err)));
|
|
63
|
+
defaultRuntime.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
browser
|
|
67
|
+
.command("resize")
|
|
68
|
+
.description("Resize the viewport")
|
|
69
|
+
.argument("<width>", "Viewport width", (v) => Number(v))
|
|
70
|
+
.argument("<height>", "Viewport height", (v) => Number(v))
|
|
71
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
72
|
+
.action(async (width, height, opts, cmd) => {
|
|
73
|
+
const parent = parentOpts(cmd);
|
|
74
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
75
|
+
const profile = parent?.profile;
|
|
76
|
+
if (!Number.isFinite(width) || !Number.isFinite(height)) {
|
|
77
|
+
defaultRuntime.error(danger("width and height must be numbers"));
|
|
78
|
+
defaultRuntime.exit(1);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const result = await browserAct(baseUrl, {
|
|
83
|
+
kind: "resize",
|
|
84
|
+
width,
|
|
85
|
+
height,
|
|
86
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
87
|
+
}, { profile });
|
|
88
|
+
if (parent?.json) {
|
|
89
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
defaultRuntime.log(`resized to ${width}x${height}`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
defaultRuntime.error(danger(String(err)));
|
|
96
|
+
defaultRuntime.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
browser
|
|
100
|
+
.command("click")
|
|
101
|
+
.description("Click an element by ref from snapshot")
|
|
102
|
+
.argument("<ref>", "Ref id from ai snapshot")
|
|
103
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
104
|
+
.option("--double", "Double click", false)
|
|
105
|
+
.option("--button <left|right|middle>", "Mouse button to use")
|
|
106
|
+
.option("--modifiers <list>", "Comma-separated modifiers (Shift,Alt,Meta)")
|
|
107
|
+
.action(async (ref, opts, cmd) => {
|
|
108
|
+
const parent = parentOpts(cmd);
|
|
109
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
110
|
+
const profile = parent?.profile;
|
|
111
|
+
const refValue = typeof ref === "string" ? ref.trim() : "";
|
|
112
|
+
if (!refValue) {
|
|
113
|
+
defaultRuntime.error(danger("ref is required"));
|
|
114
|
+
defaultRuntime.exit(1);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const modifiers = opts.modifiers
|
|
118
|
+
? String(opts.modifiers)
|
|
119
|
+
.split(",")
|
|
120
|
+
.map((v) => v.trim())
|
|
121
|
+
.filter(Boolean)
|
|
122
|
+
: undefined;
|
|
123
|
+
try {
|
|
124
|
+
const result = await browserAct(baseUrl, {
|
|
125
|
+
kind: "click",
|
|
126
|
+
ref: refValue,
|
|
127
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
128
|
+
doubleClick: Boolean(opts.double),
|
|
129
|
+
button: opts.button?.trim() || undefined,
|
|
130
|
+
modifiers,
|
|
131
|
+
}, { profile });
|
|
132
|
+
if (parent?.json) {
|
|
133
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const suffix = result.url ? ` on ${result.url}` : "";
|
|
137
|
+
defaultRuntime.log(`clicked ref ${refValue}${suffix}`);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
defaultRuntime.error(danger(String(err)));
|
|
141
|
+
defaultRuntime.exit(1);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
browser
|
|
145
|
+
.command("type")
|
|
146
|
+
.description("Type into an element by ref from snapshot")
|
|
147
|
+
.argument("<ref>", "Ref id from ai snapshot")
|
|
148
|
+
.argument("<text>", "Text to type")
|
|
149
|
+
.option("--submit", "Press Enter after typing", false)
|
|
150
|
+
.option("--slowly", "Type slowly (human-like)", false)
|
|
151
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
152
|
+
.action(async (ref, text, opts, cmd) => {
|
|
153
|
+
const parent = parentOpts(cmd);
|
|
154
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
155
|
+
const profile = parent?.profile;
|
|
156
|
+
const refValue = typeof ref === "string" ? ref.trim() : "";
|
|
157
|
+
if (!refValue) {
|
|
158
|
+
defaultRuntime.error(danger("ref is required"));
|
|
159
|
+
defaultRuntime.exit(1);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const result = await browserAct(baseUrl, {
|
|
164
|
+
kind: "type",
|
|
165
|
+
ref: refValue,
|
|
166
|
+
text,
|
|
167
|
+
submit: Boolean(opts.submit),
|
|
168
|
+
slowly: Boolean(opts.slowly),
|
|
169
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
170
|
+
}, { profile });
|
|
171
|
+
if (parent?.json) {
|
|
172
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
defaultRuntime.log(`typed into ref ${refValue}`);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
defaultRuntime.error(danger(String(err)));
|
|
179
|
+
defaultRuntime.exit(1);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
browser
|
|
183
|
+
.command("press")
|
|
184
|
+
.description("Press a key")
|
|
185
|
+
.argument("<key>", "Key to press (e.g. Enter)")
|
|
186
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
187
|
+
.action(async (key, opts, cmd) => {
|
|
188
|
+
const parent = parentOpts(cmd);
|
|
189
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
190
|
+
const profile = parent?.profile;
|
|
191
|
+
try {
|
|
192
|
+
const result = await browserAct(baseUrl, {
|
|
193
|
+
kind: "press",
|
|
194
|
+
key,
|
|
195
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
196
|
+
}, { profile });
|
|
197
|
+
if (parent?.json) {
|
|
198
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
defaultRuntime.log(`pressed ${key}`);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
defaultRuntime.error(danger(String(err)));
|
|
205
|
+
defaultRuntime.exit(1);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
browser
|
|
209
|
+
.command("hover")
|
|
210
|
+
.description("Hover an element by ai ref")
|
|
211
|
+
.argument("<ref>", "Ref id from ai snapshot")
|
|
212
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
213
|
+
.action(async (ref, opts, cmd) => {
|
|
214
|
+
const parent = parentOpts(cmd);
|
|
215
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
216
|
+
const profile = parent?.profile;
|
|
217
|
+
try {
|
|
218
|
+
const result = await browserAct(baseUrl, {
|
|
219
|
+
kind: "hover",
|
|
220
|
+
ref,
|
|
221
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
222
|
+
}, { profile });
|
|
223
|
+
if (parent?.json) {
|
|
224
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
defaultRuntime.log(`hovered ref ${ref}`);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
defaultRuntime.error(danger(String(err)));
|
|
231
|
+
defaultRuntime.exit(1);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
browser
|
|
235
|
+
.command("drag")
|
|
236
|
+
.description("Drag from one ref to another")
|
|
237
|
+
.argument("<startRef>", "Start ref id")
|
|
238
|
+
.argument("<endRef>", "End ref id")
|
|
239
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
240
|
+
.action(async (startRef, endRef, opts, cmd) => {
|
|
241
|
+
const parent = parentOpts(cmd);
|
|
242
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
243
|
+
const profile = parent?.profile;
|
|
244
|
+
try {
|
|
245
|
+
const result = await browserAct(baseUrl, {
|
|
246
|
+
kind: "drag",
|
|
247
|
+
startRef,
|
|
248
|
+
endRef,
|
|
249
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
250
|
+
}, { profile });
|
|
251
|
+
if (parent?.json) {
|
|
252
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
defaultRuntime.log(`dragged ${startRef} → ${endRef}`);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
defaultRuntime.error(danger(String(err)));
|
|
259
|
+
defaultRuntime.exit(1);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
browser
|
|
263
|
+
.command("select")
|
|
264
|
+
.description("Select option(s) in a select element")
|
|
265
|
+
.argument("<ref>", "Ref id from ai snapshot")
|
|
266
|
+
.argument("<values...>", "Option values to select")
|
|
267
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
268
|
+
.action(async (ref, values, opts, cmd) => {
|
|
269
|
+
const parent = parentOpts(cmd);
|
|
270
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
271
|
+
const profile = parent?.profile;
|
|
272
|
+
try {
|
|
273
|
+
const result = await browserAct(baseUrl, {
|
|
274
|
+
kind: "select",
|
|
275
|
+
ref,
|
|
276
|
+
values,
|
|
277
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
278
|
+
}, { profile });
|
|
279
|
+
if (parent?.json) {
|
|
280
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
defaultRuntime.log(`selected ${values.join(", ")}`);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
defaultRuntime.error(danger(String(err)));
|
|
287
|
+
defaultRuntime.exit(1);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
browser
|
|
291
|
+
.command("upload")
|
|
292
|
+
.description("Arm file upload for the next file chooser")
|
|
293
|
+
.argument("<paths...>", "File paths to upload")
|
|
294
|
+
.option("--ref <ref>", "Ref id from ai snapshot to click after arming")
|
|
295
|
+
.option("--input-ref <ref>", "Ref id for <input type=file> to set directly")
|
|
296
|
+
.option("--element <selector>", "CSS selector for <input type=file>")
|
|
297
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
298
|
+
.option("--timeout-ms <ms>", "How long to wait for the next file chooser (default: 120000)", (v) => Number(v))
|
|
299
|
+
.action(async (paths, opts, cmd) => {
|
|
300
|
+
const parent = parentOpts(cmd);
|
|
301
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
302
|
+
const profile = parent?.profile;
|
|
303
|
+
try {
|
|
304
|
+
const result = await browserArmFileChooser(baseUrl, {
|
|
305
|
+
paths,
|
|
306
|
+
ref: opts.ref?.trim() || undefined,
|
|
307
|
+
inputRef: opts.inputRef?.trim() || undefined,
|
|
308
|
+
element: opts.element?.trim() || undefined,
|
|
309
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
310
|
+
timeoutMs: Number.isFinite(opts.timeoutMs)
|
|
311
|
+
? opts.timeoutMs
|
|
312
|
+
: undefined,
|
|
313
|
+
profile,
|
|
314
|
+
});
|
|
315
|
+
if (parent?.json) {
|
|
316
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
defaultRuntime.log(`upload armed for ${paths.length} file(s)`);
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
defaultRuntime.error(danger(String(err)));
|
|
323
|
+
defaultRuntime.exit(1);
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
browser
|
|
327
|
+
.command("fill")
|
|
328
|
+
.description("Fill a form with JSON field descriptors")
|
|
329
|
+
.option("--fields <json>", "JSON array of field objects")
|
|
330
|
+
.option("--fields-file <path>", "Read JSON array from a file")
|
|
331
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
332
|
+
.action(async (opts, cmd) => {
|
|
333
|
+
const parent = parentOpts(cmd);
|
|
334
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
335
|
+
const profile = parent?.profile;
|
|
336
|
+
try {
|
|
337
|
+
const fields = await readFields({
|
|
338
|
+
fields: opts.fields,
|
|
339
|
+
fieldsFile: opts.fieldsFile,
|
|
340
|
+
});
|
|
341
|
+
const result = await browserAct(baseUrl, {
|
|
342
|
+
kind: "fill",
|
|
343
|
+
fields,
|
|
344
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
345
|
+
}, { profile });
|
|
346
|
+
if (parent?.json) {
|
|
347
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
defaultRuntime.log(`filled ${fields.length} field(s)`);
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
defaultRuntime.error(danger(String(err)));
|
|
354
|
+
defaultRuntime.exit(1);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
browser
|
|
358
|
+
.command("dialog")
|
|
359
|
+
.description("Arm the next modal dialog (alert/confirm/prompt)")
|
|
360
|
+
.option("--accept", "Accept the dialog", false)
|
|
361
|
+
.option("--dismiss", "Dismiss the dialog", false)
|
|
362
|
+
.option("--prompt <text>", "Prompt response text")
|
|
363
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
364
|
+
.option("--timeout-ms <ms>", "How long to wait for the next dialog (default: 120000)", (v) => Number(v))
|
|
365
|
+
.action(async (opts, cmd) => {
|
|
366
|
+
const parent = parentOpts(cmd);
|
|
367
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
368
|
+
const profile = parent?.profile;
|
|
369
|
+
const accept = opts.accept ? true : opts.dismiss ? false : undefined;
|
|
370
|
+
if (accept === undefined) {
|
|
371
|
+
defaultRuntime.error(danger("Specify --accept or --dismiss"));
|
|
372
|
+
defaultRuntime.exit(1);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
try {
|
|
376
|
+
const result = await browserArmDialog(baseUrl, {
|
|
377
|
+
accept,
|
|
378
|
+
promptText: opts.prompt?.trim() || undefined,
|
|
379
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
380
|
+
timeoutMs: Number.isFinite(opts.timeoutMs)
|
|
381
|
+
? opts.timeoutMs
|
|
382
|
+
: undefined,
|
|
383
|
+
profile,
|
|
384
|
+
});
|
|
385
|
+
if (parent?.json) {
|
|
386
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
defaultRuntime.log("dialog armed");
|
|
390
|
+
}
|
|
391
|
+
catch (err) {
|
|
392
|
+
defaultRuntime.error(danger(String(err)));
|
|
393
|
+
defaultRuntime.exit(1);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
browser
|
|
397
|
+
.command("wait")
|
|
398
|
+
.description("Wait for time or text conditions")
|
|
399
|
+
.option("--time <ms>", "Wait for N milliseconds", (v) => Number(v))
|
|
400
|
+
.option("--text <value>", "Wait for text to appear")
|
|
401
|
+
.option("--text-gone <value>", "Wait for text to disappear")
|
|
402
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
403
|
+
.action(async (opts, cmd) => {
|
|
404
|
+
const parent = parentOpts(cmd);
|
|
405
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
406
|
+
const profile = parent?.profile;
|
|
407
|
+
try {
|
|
408
|
+
const result = await browserAct(baseUrl, {
|
|
409
|
+
kind: "wait",
|
|
410
|
+
timeMs: Number.isFinite(opts.time) ? opts.time : undefined,
|
|
411
|
+
text: opts.text?.trim() || undefined,
|
|
412
|
+
textGone: opts.textGone?.trim() || undefined,
|
|
413
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
414
|
+
}, { profile });
|
|
415
|
+
if (parent?.json) {
|
|
416
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
defaultRuntime.log("wait complete");
|
|
420
|
+
}
|
|
421
|
+
catch (err) {
|
|
422
|
+
defaultRuntime.error(danger(String(err)));
|
|
423
|
+
defaultRuntime.exit(1);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
browser
|
|
427
|
+
.command("evaluate")
|
|
428
|
+
.description("Evaluate a function against the page or a ref")
|
|
429
|
+
.option("--fn <code>", "Function source, e.g. (el) => el.textContent")
|
|
430
|
+
.option("--ref <id>", "ARIA ref from ai snapshot")
|
|
431
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
432
|
+
.action(async (opts, cmd) => {
|
|
433
|
+
const parent = parentOpts(cmd);
|
|
434
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
435
|
+
const profile = parent?.profile;
|
|
436
|
+
if (!opts.fn) {
|
|
437
|
+
defaultRuntime.error(danger("Missing --fn"));
|
|
438
|
+
defaultRuntime.exit(1);
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
try {
|
|
442
|
+
const result = await browserAct(baseUrl, {
|
|
443
|
+
kind: "evaluate",
|
|
444
|
+
fn: opts.fn,
|
|
445
|
+
ref: opts.ref?.trim() || undefined,
|
|
446
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
447
|
+
}, { profile });
|
|
448
|
+
if (parent?.json) {
|
|
449
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
defaultRuntime.log(JSON.stringify(result.result ?? null, null, 2));
|
|
453
|
+
}
|
|
454
|
+
catch (err) {
|
|
455
|
+
defaultRuntime.error(danger(String(err)));
|
|
456
|
+
defaultRuntime.exit(1);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { resolveBrowserControlUrl } from "../browser/client.js";
|
|
2
|
+
import { browserConsoleMessages, browserPdfSave, } from "../browser/client-actions.js";
|
|
3
|
+
import { danger } from "../globals.js";
|
|
4
|
+
import { defaultRuntime } from "../runtime.js";
|
|
5
|
+
export function registerBrowserActionObserveCommands(browser, parentOpts) {
|
|
6
|
+
browser
|
|
7
|
+
.command("console")
|
|
8
|
+
.description("Get recent console messages")
|
|
9
|
+
.option("--level <level>", "Filter by level (error, warn, info)")
|
|
10
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
11
|
+
.action(async (opts, cmd) => {
|
|
12
|
+
const parent = parentOpts(cmd);
|
|
13
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
14
|
+
const profile = parent?.profile;
|
|
15
|
+
try {
|
|
16
|
+
const result = await browserConsoleMessages(baseUrl, {
|
|
17
|
+
level: opts.level?.trim() || undefined,
|
|
18
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
19
|
+
profile,
|
|
20
|
+
});
|
|
21
|
+
if (parent?.json) {
|
|
22
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
defaultRuntime.log(JSON.stringify(result.messages, null, 2));
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
defaultRuntime.error(danger(String(err)));
|
|
29
|
+
defaultRuntime.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
browser
|
|
33
|
+
.command("pdf")
|
|
34
|
+
.description("Save page as PDF")
|
|
35
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
36
|
+
.action(async (opts, cmd) => {
|
|
37
|
+
const parent = parentOpts(cmd);
|
|
38
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
39
|
+
const profile = parent?.profile;
|
|
40
|
+
try {
|
|
41
|
+
const result = await browserPdfSave(baseUrl, {
|
|
42
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
43
|
+
profile,
|
|
44
|
+
});
|
|
45
|
+
if (parent?.json) {
|
|
46
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
defaultRuntime.log(`PDF: ${result.path}`);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
defaultRuntime.error(danger(String(err)));
|
|
53
|
+
defaultRuntime.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const browserCoreExamples = [
|
|
2
|
+
"clawdbot browser status",
|
|
3
|
+
"clawdbot browser start",
|
|
4
|
+
"clawdbot browser stop",
|
|
5
|
+
"clawdbot browser tabs",
|
|
6
|
+
"clawdbot browser open https://example.com",
|
|
7
|
+
"clawdbot browser focus abcd1234",
|
|
8
|
+
"clawdbot browser close abcd1234",
|
|
9
|
+
"clawdbot browser screenshot",
|
|
10
|
+
"clawdbot browser screenshot --full-page",
|
|
11
|
+
"clawdbot browser screenshot --ref 12",
|
|
12
|
+
"clawdbot browser snapshot",
|
|
13
|
+
"clawdbot browser snapshot --format aria --limit 200",
|
|
14
|
+
];
|
|
15
|
+
export const browserActionExamples = [
|
|
16
|
+
"clawdbot browser navigate https://example.com",
|
|
17
|
+
"clawdbot browser resize 1280 720",
|
|
18
|
+
"clawdbot browser click 12 --double",
|
|
19
|
+
'clawdbot browser type 23 "hello" --submit',
|
|
20
|
+
"clawdbot browser press Enter",
|
|
21
|
+
"clawdbot browser hover 44",
|
|
22
|
+
"clawdbot browser drag 10 11",
|
|
23
|
+
"clawdbot browser select 9 OptionA OptionB",
|
|
24
|
+
"clawdbot browser upload /tmp/file.pdf",
|
|
25
|
+
'clawdbot browser fill --fields \'[{"ref":"1","value":"Ada"}]\'',
|
|
26
|
+
"clawdbot browser dialog --accept",
|
|
27
|
+
'clawdbot browser wait --text "Done"',
|
|
28
|
+
"clawdbot browser evaluate --fn '(el) => el.textContent' --ref 7",
|
|
29
|
+
"clawdbot browser console --level error",
|
|
30
|
+
"clawdbot browser pdf",
|
|
31
|
+
];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { browserSnapshot, resolveBrowserControlUrl, } from "../browser/client.js";
|
|
2
|
+
import { browserScreenshotAction } from "../browser/client-actions.js";
|
|
3
|
+
import { danger } from "../globals.js";
|
|
4
|
+
import { defaultRuntime } from "../runtime.js";
|
|
5
|
+
export function registerBrowserInspectCommands(browser, parentOpts) {
|
|
6
|
+
browser
|
|
7
|
+
.command("screenshot")
|
|
8
|
+
.description("Capture a screenshot (MEDIA:<path>)")
|
|
9
|
+
.argument("[targetId]", "CDP target id (or unique prefix)")
|
|
10
|
+
.option("--full-page", "Capture full scrollable page", false)
|
|
11
|
+
.option("--ref <ref>", "ARIA ref from ai snapshot")
|
|
12
|
+
.option("--element <selector>", "CSS selector for element screenshot")
|
|
13
|
+
.option("--type <png|jpeg>", "Output type (default: png)", "png")
|
|
14
|
+
.action(async (targetId, opts, cmd) => {
|
|
15
|
+
const parent = parentOpts(cmd);
|
|
16
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
17
|
+
const profile = parent?.profile;
|
|
18
|
+
try {
|
|
19
|
+
const result = await browserScreenshotAction(baseUrl, {
|
|
20
|
+
targetId: targetId?.trim() || undefined,
|
|
21
|
+
fullPage: Boolean(opts.fullPage),
|
|
22
|
+
ref: opts.ref?.trim() || undefined,
|
|
23
|
+
element: opts.element?.trim() || undefined,
|
|
24
|
+
type: opts.type === "jpeg" ? "jpeg" : "png",
|
|
25
|
+
profile,
|
|
26
|
+
});
|
|
27
|
+
if (parent?.json) {
|
|
28
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
defaultRuntime.log(`MEDIA:${result.path}`);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
defaultRuntime.error(danger(String(err)));
|
|
35
|
+
defaultRuntime.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
browser
|
|
39
|
+
.command("snapshot")
|
|
40
|
+
.description("Capture a snapshot (default: ai; aria is the accessibility tree)")
|
|
41
|
+
.option("--format <aria|ai>", "Snapshot format (default: ai)", "ai")
|
|
42
|
+
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
43
|
+
.option("--limit <n>", "Max nodes (default: 500/800)", (v) => Number(v))
|
|
44
|
+
.option("--out <path>", "Write snapshot to a file")
|
|
45
|
+
.action(async (opts, cmd) => {
|
|
46
|
+
const parent = parentOpts(cmd);
|
|
47
|
+
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
48
|
+
const profile = parent?.profile;
|
|
49
|
+
const format = opts.format === "aria" ? "aria" : "ai";
|
|
50
|
+
try {
|
|
51
|
+
const result = await browserSnapshot(baseUrl, {
|
|
52
|
+
format,
|
|
53
|
+
targetId: opts.targetId?.trim() || undefined,
|
|
54
|
+
limit: Number.isFinite(opts.limit) ? opts.limit : undefined,
|
|
55
|
+
profile,
|
|
56
|
+
});
|
|
57
|
+
if (opts.out) {
|
|
58
|
+
const fs = await import("node:fs/promises");
|
|
59
|
+
if (result.format === "ai") {
|
|
60
|
+
await fs.writeFile(opts.out, result.snapshot, "utf8");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const payload = JSON.stringify(result, null, 2);
|
|
64
|
+
await fs.writeFile(opts.out, payload, "utf8");
|
|
65
|
+
}
|
|
66
|
+
if (parent?.json) {
|
|
67
|
+
defaultRuntime.log(JSON.stringify({ ok: true, out: opts.out }, null, 2));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
defaultRuntime.log(opts.out);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (parent?.json) {
|
|
75
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (result.format === "ai") {
|
|
79
|
+
defaultRuntime.log(result.snapshot);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const nodes = "nodes" in result ? result.nodes : [];
|
|
83
|
+
defaultRuntime.log(nodes
|
|
84
|
+
.map((n) => {
|
|
85
|
+
const indent = " ".repeat(Math.min(20, n.depth));
|
|
86
|
+
const name = n.name ? ` "${n.name}"` : "";
|
|
87
|
+
const value = n.value ? ` = "${n.value}"` : "";
|
|
88
|
+
return `${indent}- ${n.role}${name}${value}`;
|
|
89
|
+
})
|
|
90
|
+
.join("\n"));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
defaultRuntime.error(danger(String(err)));
|
|
94
|
+
defaultRuntime.exit(1);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|