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,634 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loginWeb } from "../provider-web.js";
|
|
4
|
+
import { normalizeE164 } from "../utils.js";
|
|
5
|
+
import { resolveWebAuthDir } from "../web/session.js";
|
|
6
|
+
import { detectBinary } from "./onboard-helpers.js";
|
|
7
|
+
import { installSignalCli } from "./signal-install.js";
|
|
8
|
+
async function pathExists(filePath) {
|
|
9
|
+
try {
|
|
10
|
+
await fs.access(filePath);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function detectWhatsAppLinked() {
|
|
18
|
+
const credsPath = path.join(resolveWebAuthDir(), "creds.json");
|
|
19
|
+
return await pathExists(credsPath);
|
|
20
|
+
}
|
|
21
|
+
async function noteProviderPrimer(prompter) {
|
|
22
|
+
await prompter.note([
|
|
23
|
+
"WhatsApp: links via WhatsApp Web (scan QR), stores creds for future sends.",
|
|
24
|
+
"WhatsApp: dedicated second number recommended; primary number OK (self-chat).",
|
|
25
|
+
"Telegram: Bot API (token from @BotFather), replies via your bot.",
|
|
26
|
+
"Discord: Bot token from Discord Developer Portal; invite bot to your server.",
|
|
27
|
+
"Slack: Socket Mode app token + bot token, DMs via App Home Messages tab.",
|
|
28
|
+
"Signal: signal-cli as a linked device; separate number recommended.",
|
|
29
|
+
"iMessage: local imsg CLI; separate Apple ID recommended only on a separate Mac.",
|
|
30
|
+
].join("\n"), "How providers work");
|
|
31
|
+
}
|
|
32
|
+
async function noteTelegramTokenHelp(prompter) {
|
|
33
|
+
await prompter.note([
|
|
34
|
+
"1) Open Telegram and chat with @BotFather",
|
|
35
|
+
"2) Run /newbot (or /mybots)",
|
|
36
|
+
"3) Copy the token (looks like 123456:ABC...)",
|
|
37
|
+
"Tip: you can also set TELEGRAM_BOT_TOKEN in your env.",
|
|
38
|
+
].join("\n"), "Telegram bot token");
|
|
39
|
+
}
|
|
40
|
+
async function noteDiscordTokenHelp(prompter) {
|
|
41
|
+
await prompter.note([
|
|
42
|
+
"1) Discord Developer Portal → Applications → New Application",
|
|
43
|
+
"2) Bot → Add Bot → Reset Token → copy token",
|
|
44
|
+
"3) OAuth2 → URL Generator → scope 'bot' → invite to your server",
|
|
45
|
+
"Tip: enable Message Content Intent if you need message text.",
|
|
46
|
+
].join("\n"), "Discord bot token");
|
|
47
|
+
}
|
|
48
|
+
function buildSlackManifest(botName) {
|
|
49
|
+
const safeName = botName.trim() || "Clawdbot";
|
|
50
|
+
const manifest = {
|
|
51
|
+
display_information: {
|
|
52
|
+
name: safeName,
|
|
53
|
+
description: `${safeName} connector for Clawdbot`,
|
|
54
|
+
},
|
|
55
|
+
features: {
|
|
56
|
+
bot_user: {
|
|
57
|
+
display_name: safeName,
|
|
58
|
+
always_online: false,
|
|
59
|
+
},
|
|
60
|
+
app_home: {
|
|
61
|
+
messages_tab_enabled: true,
|
|
62
|
+
messages_tab_read_only_enabled: false,
|
|
63
|
+
},
|
|
64
|
+
slash_commands: [
|
|
65
|
+
{
|
|
66
|
+
command: "/clawd",
|
|
67
|
+
description: "Send a message to Clawdbot",
|
|
68
|
+
should_escape: false,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
oauth_config: {
|
|
73
|
+
scopes: {
|
|
74
|
+
bot: [
|
|
75
|
+
"chat:write",
|
|
76
|
+
"channels:history",
|
|
77
|
+
"channels:read",
|
|
78
|
+
"groups:history",
|
|
79
|
+
"im:history",
|
|
80
|
+
"mpim:history",
|
|
81
|
+
"users:read",
|
|
82
|
+
"app_mentions:read",
|
|
83
|
+
"reactions:read",
|
|
84
|
+
"reactions:write",
|
|
85
|
+
"pins:read",
|
|
86
|
+
"pins:write",
|
|
87
|
+
"emoji:read",
|
|
88
|
+
"commands",
|
|
89
|
+
"files:read",
|
|
90
|
+
"files:write",
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
settings: {
|
|
95
|
+
socket_mode_enabled: true,
|
|
96
|
+
event_subscriptions: {
|
|
97
|
+
bot_events: [
|
|
98
|
+
"app_mention",
|
|
99
|
+
"message.channels",
|
|
100
|
+
"message.groups",
|
|
101
|
+
"message.im",
|
|
102
|
+
"message.mpim",
|
|
103
|
+
"reaction_added",
|
|
104
|
+
"reaction_removed",
|
|
105
|
+
"member_joined_channel",
|
|
106
|
+
"member_left_channel",
|
|
107
|
+
"channel_rename",
|
|
108
|
+
"pin_added",
|
|
109
|
+
"pin_removed",
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
return JSON.stringify(manifest, null, 2);
|
|
115
|
+
}
|
|
116
|
+
async function noteSlackTokenHelp(prompter, botName) {
|
|
117
|
+
const manifest = buildSlackManifest(botName);
|
|
118
|
+
await prompter.note([
|
|
119
|
+
"1) Slack API → Create App → From scratch",
|
|
120
|
+
"2) Add Socket Mode + enable it to get the app-level token (xapp-...)",
|
|
121
|
+
"3) OAuth & Permissions → install app to workspace (xoxb- bot token)",
|
|
122
|
+
"4) Enable Event Subscriptions (socket) for message events",
|
|
123
|
+
"5) App Home → enable the Messages tab for DMs",
|
|
124
|
+
"Tip: set SLACK_BOT_TOKEN + SLACK_APP_TOKEN in your env.",
|
|
125
|
+
"",
|
|
126
|
+
"Manifest (JSON):",
|
|
127
|
+
manifest,
|
|
128
|
+
].join("\n"), "Slack socket mode tokens");
|
|
129
|
+
}
|
|
130
|
+
function setWhatsAppAllowFrom(cfg, allowFrom) {
|
|
131
|
+
return {
|
|
132
|
+
...cfg,
|
|
133
|
+
whatsapp: {
|
|
134
|
+
...cfg.whatsapp,
|
|
135
|
+
allowFrom,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function promptWhatsAppAllowFrom(cfg, _runtime, prompter) {
|
|
140
|
+
const existingAllowFrom = cfg.whatsapp?.allowFrom ?? [];
|
|
141
|
+
const existingLabel = existingAllowFrom.length > 0 ? existingAllowFrom.join(", ") : "unset";
|
|
142
|
+
await prompter.note([
|
|
143
|
+
"WhatsApp direct chats are gated by `whatsapp.allowFrom`.",
|
|
144
|
+
'Default (unset) = self-chat only; use "*" to allow anyone.',
|
|
145
|
+
`Current: ${existingLabel}`,
|
|
146
|
+
].join("\n"), "WhatsApp allowlist");
|
|
147
|
+
const options = existingAllowFrom.length > 0
|
|
148
|
+
? [
|
|
149
|
+
{ value: "keep", label: "Keep current" },
|
|
150
|
+
{ value: "self", label: "Self-chat only (unset)" },
|
|
151
|
+
{ value: "list", label: "Specific numbers (recommended)" },
|
|
152
|
+
{ value: "any", label: "Anyone (*)" },
|
|
153
|
+
]
|
|
154
|
+
: [
|
|
155
|
+
{ value: "self", label: "Self-chat only (default)" },
|
|
156
|
+
{ value: "list", label: "Specific numbers (recommended)" },
|
|
157
|
+
{ value: "any", label: "Anyone (*)" },
|
|
158
|
+
];
|
|
159
|
+
const mode = (await prompter.select({
|
|
160
|
+
message: "Who can trigger the bot via WhatsApp?",
|
|
161
|
+
options: options.map((opt) => ({ value: opt.value, label: opt.label })),
|
|
162
|
+
}));
|
|
163
|
+
if (mode === "keep")
|
|
164
|
+
return cfg;
|
|
165
|
+
if (mode === "self")
|
|
166
|
+
return setWhatsAppAllowFrom(cfg, undefined);
|
|
167
|
+
if (mode === "any")
|
|
168
|
+
return setWhatsAppAllowFrom(cfg, ["*"]);
|
|
169
|
+
const allowRaw = await prompter.text({
|
|
170
|
+
message: "Allowed sender numbers (comma-separated, E.164)",
|
|
171
|
+
placeholder: "+15555550123, +447700900123",
|
|
172
|
+
validate: (value) => {
|
|
173
|
+
const raw = String(value ?? "").trim();
|
|
174
|
+
if (!raw)
|
|
175
|
+
return "Required";
|
|
176
|
+
const parts = raw
|
|
177
|
+
.split(/[\n,;]+/g)
|
|
178
|
+
.map((p) => p.trim())
|
|
179
|
+
.filter(Boolean);
|
|
180
|
+
if (parts.length === 0)
|
|
181
|
+
return "Required";
|
|
182
|
+
for (const part of parts) {
|
|
183
|
+
if (part === "*")
|
|
184
|
+
continue;
|
|
185
|
+
const normalized = normalizeE164(part);
|
|
186
|
+
if (!normalized)
|
|
187
|
+
return `Invalid number: ${part}`;
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
const parts = String(allowRaw)
|
|
193
|
+
.split(/[\n,;]+/g)
|
|
194
|
+
.map((p) => p.trim())
|
|
195
|
+
.filter(Boolean);
|
|
196
|
+
const normalized = parts.map((part) => part === "*" ? "*" : normalizeE164(part));
|
|
197
|
+
const unique = [...new Set(normalized.filter(Boolean))];
|
|
198
|
+
return setWhatsAppAllowFrom(cfg, unique);
|
|
199
|
+
}
|
|
200
|
+
export async function setupProviders(cfg, runtime, prompter, options) {
|
|
201
|
+
const whatsappLinked = await detectWhatsAppLinked();
|
|
202
|
+
const telegramEnv = Boolean(process.env.TELEGRAM_BOT_TOKEN?.trim());
|
|
203
|
+
const discordEnv = Boolean(process.env.DISCORD_BOT_TOKEN?.trim());
|
|
204
|
+
const slackBotEnv = Boolean(process.env.SLACK_BOT_TOKEN?.trim());
|
|
205
|
+
const slackAppEnv = Boolean(process.env.SLACK_APP_TOKEN?.trim());
|
|
206
|
+
const telegramConfigured = Boolean(telegramEnv || cfg.telegram?.botToken || cfg.telegram?.tokenFile);
|
|
207
|
+
const discordConfigured = Boolean(discordEnv || cfg.discord?.token);
|
|
208
|
+
const slackConfigured = Boolean((slackBotEnv && slackAppEnv) ||
|
|
209
|
+
(cfg.slack?.botToken && cfg.slack?.appToken));
|
|
210
|
+
const signalConfigured = Boolean(cfg.signal?.account || cfg.signal?.httpUrl || cfg.signal?.httpPort);
|
|
211
|
+
const signalCliPath = cfg.signal?.cliPath ?? "signal-cli";
|
|
212
|
+
const signalCliDetected = await detectBinary(signalCliPath);
|
|
213
|
+
const imessageConfigured = Boolean(cfg.imessage?.cliPath || cfg.imessage?.dbPath || cfg.imessage?.allowFrom);
|
|
214
|
+
const imessageCliPath = cfg.imessage?.cliPath ?? "imsg";
|
|
215
|
+
const imessageCliDetected = await detectBinary(imessageCliPath);
|
|
216
|
+
await prompter.note([
|
|
217
|
+
`WhatsApp: ${whatsappLinked ? "linked" : "not linked"}`,
|
|
218
|
+
`Telegram: ${telegramConfigured ? "configured" : "needs token"}`,
|
|
219
|
+
`Discord: ${discordConfigured ? "configured" : "needs token"}`,
|
|
220
|
+
`Slack: ${slackConfigured ? "configured" : "needs tokens"}`,
|
|
221
|
+
`Signal: ${signalConfigured ? "configured" : "needs setup"}`,
|
|
222
|
+
`iMessage: ${imessageConfigured ? "configured" : "needs setup"}`,
|
|
223
|
+
`signal-cli: ${signalCliDetected ? "found" : "missing"} (${signalCliPath})`,
|
|
224
|
+
`imsg: ${imessageCliDetected ? "found" : "missing"} (${imessageCliPath})`,
|
|
225
|
+
].join("\n"), "Provider status");
|
|
226
|
+
const shouldConfigure = await prompter.confirm({
|
|
227
|
+
message: "Configure chat providers now?",
|
|
228
|
+
initialValue: true,
|
|
229
|
+
});
|
|
230
|
+
if (!shouldConfigure)
|
|
231
|
+
return cfg;
|
|
232
|
+
await noteProviderPrimer(prompter);
|
|
233
|
+
const selection = (await prompter.multiselect({
|
|
234
|
+
message: "Select providers",
|
|
235
|
+
options: [
|
|
236
|
+
{
|
|
237
|
+
value: "whatsapp",
|
|
238
|
+
label: "WhatsApp (QR link)",
|
|
239
|
+
hint: whatsappLinked ? "linked" : "not linked",
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
value: "telegram",
|
|
243
|
+
label: "Telegram (Bot API)",
|
|
244
|
+
hint: telegramConfigured ? "configured" : "needs token",
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
value: "discord",
|
|
248
|
+
label: "Discord (Bot API)",
|
|
249
|
+
hint: discordConfigured ? "configured" : "needs token",
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
value: "slack",
|
|
253
|
+
label: "Slack (Socket Mode)",
|
|
254
|
+
hint: slackConfigured ? "configured" : "needs tokens",
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
value: "signal",
|
|
258
|
+
label: "Signal (signal-cli)",
|
|
259
|
+
hint: signalCliDetected ? "signal-cli found" : "signal-cli missing",
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
value: "imessage",
|
|
263
|
+
label: "iMessage (imsg)",
|
|
264
|
+
hint: imessageCliDetected ? "imsg found" : "imsg missing",
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
}));
|
|
268
|
+
let next = cfg;
|
|
269
|
+
if (selection.includes("whatsapp")) {
|
|
270
|
+
if (!whatsappLinked) {
|
|
271
|
+
await prompter.note([
|
|
272
|
+
"Scan the QR with WhatsApp on your phone.",
|
|
273
|
+
"Credentials are stored under ~/.clawdbot/credentials/ for future runs.",
|
|
274
|
+
].join("\n"), "WhatsApp linking");
|
|
275
|
+
}
|
|
276
|
+
const wantsLink = await prompter.confirm({
|
|
277
|
+
message: whatsappLinked
|
|
278
|
+
? "WhatsApp already linked. Re-link now?"
|
|
279
|
+
: "Link WhatsApp now (QR)?",
|
|
280
|
+
initialValue: !whatsappLinked,
|
|
281
|
+
});
|
|
282
|
+
if (wantsLink) {
|
|
283
|
+
try {
|
|
284
|
+
await loginWeb(false, "web");
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
runtime.error(`WhatsApp login failed: ${String(err)}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else if (!whatsappLinked) {
|
|
291
|
+
await prompter.note("Run `clawdbot login` later to link WhatsApp.", "WhatsApp");
|
|
292
|
+
}
|
|
293
|
+
next = await promptWhatsAppAllowFrom(next, runtime, prompter);
|
|
294
|
+
}
|
|
295
|
+
if (selection.includes("telegram")) {
|
|
296
|
+
let token = null;
|
|
297
|
+
if (!telegramConfigured) {
|
|
298
|
+
await noteTelegramTokenHelp(prompter);
|
|
299
|
+
}
|
|
300
|
+
if (telegramEnv && !cfg.telegram?.botToken) {
|
|
301
|
+
const keepEnv = await prompter.confirm({
|
|
302
|
+
message: "TELEGRAM_BOT_TOKEN detected. Use env var?",
|
|
303
|
+
initialValue: true,
|
|
304
|
+
});
|
|
305
|
+
if (keepEnv) {
|
|
306
|
+
next = {
|
|
307
|
+
...next,
|
|
308
|
+
telegram: {
|
|
309
|
+
...next.telegram,
|
|
310
|
+
enabled: true,
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
token = String(await prompter.text({
|
|
316
|
+
message: "Enter Telegram bot token",
|
|
317
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
318
|
+
})).trim();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
else if (cfg.telegram?.botToken) {
|
|
322
|
+
const keep = await prompter.confirm({
|
|
323
|
+
message: "Telegram token already configured. Keep it?",
|
|
324
|
+
initialValue: true,
|
|
325
|
+
});
|
|
326
|
+
if (!keep) {
|
|
327
|
+
token = String(await prompter.text({
|
|
328
|
+
message: "Enter Telegram bot token",
|
|
329
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
330
|
+
})).trim();
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
token = String(await prompter.text({
|
|
335
|
+
message: "Enter Telegram bot token",
|
|
336
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
337
|
+
})).trim();
|
|
338
|
+
}
|
|
339
|
+
if (token) {
|
|
340
|
+
next = {
|
|
341
|
+
...next,
|
|
342
|
+
telegram: {
|
|
343
|
+
...next.telegram,
|
|
344
|
+
enabled: true,
|
|
345
|
+
botToken: token,
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (selection.includes("discord")) {
|
|
351
|
+
let token = null;
|
|
352
|
+
if (!discordConfigured) {
|
|
353
|
+
await noteDiscordTokenHelp(prompter);
|
|
354
|
+
}
|
|
355
|
+
if (discordEnv && !cfg.discord?.token) {
|
|
356
|
+
const keepEnv = await prompter.confirm({
|
|
357
|
+
message: "DISCORD_BOT_TOKEN detected. Use env var?",
|
|
358
|
+
initialValue: true,
|
|
359
|
+
});
|
|
360
|
+
if (keepEnv) {
|
|
361
|
+
next = {
|
|
362
|
+
...next,
|
|
363
|
+
discord: {
|
|
364
|
+
...next.discord,
|
|
365
|
+
enabled: true,
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
token = String(await prompter.text({
|
|
371
|
+
message: "Enter Discord bot token",
|
|
372
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
373
|
+
})).trim();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
else if (cfg.discord?.token) {
|
|
377
|
+
const keep = await prompter.confirm({
|
|
378
|
+
message: "Discord token already configured. Keep it?",
|
|
379
|
+
initialValue: true,
|
|
380
|
+
});
|
|
381
|
+
if (!keep) {
|
|
382
|
+
token = String(await prompter.text({
|
|
383
|
+
message: "Enter Discord bot token",
|
|
384
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
385
|
+
})).trim();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
token = String(await prompter.text({
|
|
390
|
+
message: "Enter Discord bot token",
|
|
391
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
392
|
+
})).trim();
|
|
393
|
+
}
|
|
394
|
+
if (token) {
|
|
395
|
+
next = {
|
|
396
|
+
...next,
|
|
397
|
+
discord: {
|
|
398
|
+
...next.discord,
|
|
399
|
+
enabled: true,
|
|
400
|
+
token,
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (selection.includes("slack")) {
|
|
406
|
+
let botToken = null;
|
|
407
|
+
let appToken = null;
|
|
408
|
+
const slackBotName = String(await prompter.text({
|
|
409
|
+
message: "Slack bot display name (used for manifest)",
|
|
410
|
+
initialValue: "Clawdbot",
|
|
411
|
+
})).trim();
|
|
412
|
+
if (!slackConfigured) {
|
|
413
|
+
await noteSlackTokenHelp(prompter, slackBotName);
|
|
414
|
+
}
|
|
415
|
+
if (slackBotEnv &&
|
|
416
|
+
slackAppEnv &&
|
|
417
|
+
(!cfg.slack?.botToken || !cfg.slack?.appToken)) {
|
|
418
|
+
const keepEnv = await prompter.confirm({
|
|
419
|
+
message: "SLACK_BOT_TOKEN + SLACK_APP_TOKEN detected. Use env vars?",
|
|
420
|
+
initialValue: true,
|
|
421
|
+
});
|
|
422
|
+
if (keepEnv) {
|
|
423
|
+
next = {
|
|
424
|
+
...next,
|
|
425
|
+
slack: {
|
|
426
|
+
...next.slack,
|
|
427
|
+
enabled: true,
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
botToken = String(await prompter.text({
|
|
433
|
+
message: "Enter Slack bot token (xoxb-...)",
|
|
434
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
435
|
+
})).trim();
|
|
436
|
+
appToken = String(await prompter.text({
|
|
437
|
+
message: "Enter Slack app token (xapp-...)",
|
|
438
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
439
|
+
})).trim();
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else if (cfg.slack?.botToken && cfg.slack?.appToken) {
|
|
443
|
+
const keep = await prompter.confirm({
|
|
444
|
+
message: "Slack tokens already configured. Keep them?",
|
|
445
|
+
initialValue: true,
|
|
446
|
+
});
|
|
447
|
+
if (!keep) {
|
|
448
|
+
botToken = String(await prompter.text({
|
|
449
|
+
message: "Enter Slack bot token (xoxb-...)",
|
|
450
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
451
|
+
})).trim();
|
|
452
|
+
appToken = String(await prompter.text({
|
|
453
|
+
message: "Enter Slack app token (xapp-...)",
|
|
454
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
455
|
+
})).trim();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
botToken = String(await prompter.text({
|
|
460
|
+
message: "Enter Slack bot token (xoxb-...)",
|
|
461
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
462
|
+
})).trim();
|
|
463
|
+
appToken = String(await prompter.text({
|
|
464
|
+
message: "Enter Slack app token (xapp-...)",
|
|
465
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
466
|
+
})).trim();
|
|
467
|
+
}
|
|
468
|
+
if (botToken && appToken) {
|
|
469
|
+
next = {
|
|
470
|
+
...next,
|
|
471
|
+
slack: {
|
|
472
|
+
...next.slack,
|
|
473
|
+
enabled: true,
|
|
474
|
+
botToken,
|
|
475
|
+
appToken,
|
|
476
|
+
},
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (selection.includes("signal")) {
|
|
481
|
+
let resolvedCliPath = signalCliPath;
|
|
482
|
+
let cliDetected = signalCliDetected;
|
|
483
|
+
if (options?.allowSignalInstall) {
|
|
484
|
+
const wantsInstall = await prompter.confirm({
|
|
485
|
+
message: cliDetected
|
|
486
|
+
? "signal-cli detected. Reinstall/update now?"
|
|
487
|
+
: "signal-cli not found. Install now?",
|
|
488
|
+
initialValue: !cliDetected,
|
|
489
|
+
});
|
|
490
|
+
if (wantsInstall) {
|
|
491
|
+
try {
|
|
492
|
+
const result = await installSignalCli(runtime);
|
|
493
|
+
if (result.ok && result.cliPath) {
|
|
494
|
+
cliDetected = true;
|
|
495
|
+
resolvedCliPath = result.cliPath;
|
|
496
|
+
await prompter.note(`Installed signal-cli at ${result.cliPath}`, "Signal");
|
|
497
|
+
}
|
|
498
|
+
else if (!result.ok) {
|
|
499
|
+
await prompter.note(result.error ?? "signal-cli install failed.", "Signal");
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
catch (err) {
|
|
503
|
+
await prompter.note(`signal-cli install failed: ${String(err)}`, "Signal");
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
if (!cliDetected) {
|
|
508
|
+
await prompter.note("signal-cli not found. Install it, then rerun this step or set signal.cliPath.", "Signal");
|
|
509
|
+
}
|
|
510
|
+
let account = cfg.signal?.account ?? "";
|
|
511
|
+
if (account) {
|
|
512
|
+
const keep = await prompter.confirm({
|
|
513
|
+
message: `Signal account set (${account}). Keep it?`,
|
|
514
|
+
initialValue: true,
|
|
515
|
+
});
|
|
516
|
+
if (!keep)
|
|
517
|
+
account = "";
|
|
518
|
+
}
|
|
519
|
+
if (!account) {
|
|
520
|
+
account = String(await prompter.text({
|
|
521
|
+
message: "Signal bot number (E.164)",
|
|
522
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
523
|
+
})).trim();
|
|
524
|
+
}
|
|
525
|
+
if (account) {
|
|
526
|
+
next = {
|
|
527
|
+
...next,
|
|
528
|
+
signal: {
|
|
529
|
+
...next.signal,
|
|
530
|
+
enabled: true,
|
|
531
|
+
account,
|
|
532
|
+
cliPath: resolvedCliPath ?? "signal-cli",
|
|
533
|
+
},
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
await prompter.note([
|
|
537
|
+
'Link device with: signal-cli link -n "Clawdbot"',
|
|
538
|
+
"Scan QR in Signal → Linked Devices",
|
|
539
|
+
"Then run: clawdbot gateway call providers.status --params '{\"probe\":true}'",
|
|
540
|
+
].join("\n"), "Signal next steps");
|
|
541
|
+
}
|
|
542
|
+
if (selection.includes("imessage")) {
|
|
543
|
+
let resolvedCliPath = imessageCliPath;
|
|
544
|
+
if (!imessageCliDetected) {
|
|
545
|
+
const entered = await prompter.text({
|
|
546
|
+
message: "imsg CLI path",
|
|
547
|
+
initialValue: resolvedCliPath,
|
|
548
|
+
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
549
|
+
});
|
|
550
|
+
resolvedCliPath = String(entered).trim();
|
|
551
|
+
if (!resolvedCliPath) {
|
|
552
|
+
await prompter.note("imsg CLI path required to enable iMessage.", "iMessage");
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
if (resolvedCliPath) {
|
|
556
|
+
next = {
|
|
557
|
+
...next,
|
|
558
|
+
imessage: {
|
|
559
|
+
...next.imessage,
|
|
560
|
+
enabled: true,
|
|
561
|
+
cliPath: resolvedCliPath,
|
|
562
|
+
},
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
await prompter.note([
|
|
566
|
+
"Ensure Clawdbot has Full Disk Access to Messages DB.",
|
|
567
|
+
"Grant Automation permission for Messages when prompted.",
|
|
568
|
+
"List chats with: imsg chats --limit 20",
|
|
569
|
+
].join("\n"), "iMessage next steps");
|
|
570
|
+
}
|
|
571
|
+
if (options?.allowDisable) {
|
|
572
|
+
if (!selection.includes("telegram") && telegramConfigured) {
|
|
573
|
+
const disable = await prompter.confirm({
|
|
574
|
+
message: "Disable Telegram provider?",
|
|
575
|
+
initialValue: false,
|
|
576
|
+
});
|
|
577
|
+
if (disable) {
|
|
578
|
+
next = {
|
|
579
|
+
...next,
|
|
580
|
+
telegram: { ...next.telegram, enabled: false },
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
if (!selection.includes("discord") && discordConfigured) {
|
|
585
|
+
const disable = await prompter.confirm({
|
|
586
|
+
message: "Disable Discord provider?",
|
|
587
|
+
initialValue: false,
|
|
588
|
+
});
|
|
589
|
+
if (disable) {
|
|
590
|
+
next = {
|
|
591
|
+
...next,
|
|
592
|
+
discord: { ...next.discord, enabled: false },
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
if (!selection.includes("slack") && slackConfigured) {
|
|
597
|
+
const disable = await prompter.confirm({
|
|
598
|
+
message: "Disable Slack provider?",
|
|
599
|
+
initialValue: false,
|
|
600
|
+
});
|
|
601
|
+
if (disable) {
|
|
602
|
+
next = {
|
|
603
|
+
...next,
|
|
604
|
+
slack: { ...next.slack, enabled: false },
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
if (!selection.includes("signal") && signalConfigured) {
|
|
609
|
+
const disable = await prompter.confirm({
|
|
610
|
+
message: "Disable Signal provider?",
|
|
611
|
+
initialValue: false,
|
|
612
|
+
});
|
|
613
|
+
if (disable) {
|
|
614
|
+
next = {
|
|
615
|
+
...next,
|
|
616
|
+
signal: { ...next.signal, enabled: false },
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
if (!selection.includes("imessage") && imessageConfigured) {
|
|
621
|
+
const disable = await prompter.confirm({
|
|
622
|
+
message: "Disable iMessage provider?",
|
|
623
|
+
initialValue: false,
|
|
624
|
+
});
|
|
625
|
+
if (disable) {
|
|
626
|
+
next = {
|
|
627
|
+
...next,
|
|
628
|
+
imessage: { ...next.imessage, enabled: false },
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return next;
|
|
634
|
+
}
|