diff --git a/AGENTS.md b/AGENTS.md index ac85a00d8..c35e996c7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`. - Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them. - Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `clawdbot` in `devDependencies` or `peerDependencies` instead (runtime resolves `clawdbot/plugin-sdk` via jiti alias). -- Installers served from `https://clawd.bot/*`: live in the sibling repo `../clawd.bot` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). +- Installers served from `https://molt.bot/*`: live in the sibling repo `../molt.bot` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs). - Core channel docs: `docs/channels/` - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing` @@ -16,13 +16,13 @@ - When adding channels/extensions/apps/docs, review `.github/labeler.yml` for label coverage. ## Docs Linking (Mintlify) -- Docs are hosted on Mintlify (docs.clawd.bot). +- Docs are hosted on Mintlify (docs.molt.bot). - Internal doc links in `docs/**/*.md`: root-relative, no `.md`/`.mdx` (example: `[Config](/configuration)`). - Section cross-references: use anchors on root-relative paths (example: `[Hooks](/configuration#hooks)`). - Doc headings and anchors: avoid em dashes and apostrophes in headings because they break Mintlify anchor links. -- When Peter asks for links, reply with full `https://docs.clawd.bot/...` URLs (not root-relative). -- When you touch docs, end the reply with the `https://docs.clawd.bot/...` URLs you referenced. -- README (GitHub): keep absolute docs URLs (`https://docs.clawd.bot/...`) so links work on GitHub. +- When Peter asks for links, reply with full `https://docs.molt.bot/...` URLs (not root-relative). +- When you touch docs, end the reply with the `https://docs.molt.bot/...` URLs you referenced. +- README (GitHub): keep absolute docs URLs (`https://docs.molt.bot/...`) so links work on GitHub. - Docs content must be generic: no personal device names/hostnames/paths; use placeholders like `user@gateway-host` and “gateway host”. ## exe.dev VM ops (general) diff --git a/CHANGELOG.md b/CHANGELOG.md index 447e77846..f8f951133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -Docs: https://docs.clawd.bot +Docs: https://docs.molt.bot ## 2026.1.26 Status: unreleased. @@ -113,27 +113,27 @@ Status: unreleased. ## 2026.1.24 ### Highlights -- Providers: Ollama discovery + docs; Venice guide upgrades + cross-links. (#1606) Thanks @abhaymundhara. https://docs.clawd.bot/providers/ollama https://docs.clawd.bot/providers/venice +- Providers: Ollama discovery + docs; Venice guide upgrades + cross-links. (#1606) Thanks @abhaymundhara. https://docs.molt.bot/providers/ollama https://docs.molt.bot/providers/venice - Channels: LINE plugin (Messaging API) with rich replies + quick replies. (#1630) Thanks @plum-dawg. -- TTS: Edge fallback (keyless) + `/tts` auto modes. (#1668, #1667) Thanks @steipete, @sebslight. https://docs.clawd.bot/tts -- Exec approvals: approve in-chat via `/approve` across all channels (including plugins). (#1621) Thanks @czekaj. https://docs.clawd.bot/tools/exec-approvals https://docs.clawd.bot/tools/slash-commands -- Telegram: DM topics as separate sessions + outbound link preview toggle. (#1597, #1700) Thanks @rohannagpal, @zerone0x. https://docs.clawd.bot/channels/telegram +- TTS: Edge fallback (keyless) + `/tts` auto modes. (#1668, #1667) Thanks @steipete, @sebslight. https://docs.molt.bot/tts +- Exec approvals: approve in-chat via `/approve` across all channels (including plugins). (#1621) Thanks @czekaj. https://docs.molt.bot/tools/exec-approvals https://docs.molt.bot/tools/slash-commands +- Telegram: DM topics as separate sessions + outbound link preview toggle. (#1597, #1700) Thanks @rohannagpal, @zerone0x. https://docs.molt.bot/channels/telegram ### Changes - Channels: add LINE plugin (Messaging API) with rich replies, quick replies, and plugin HTTP registry. (#1630) Thanks @plum-dawg. -- TTS: add Edge TTS provider fallback, defaulting to keyless Edge with MP3 retry on format failures. (#1668) Thanks @steipete. https://docs.clawd.bot/tts -- TTS: add auto mode enum (off/always/inbound/tagged) with per-session `/tts` override. (#1667) Thanks @sebslight. https://docs.clawd.bot/tts +- TTS: add Edge TTS provider fallback, defaulting to keyless Edge with MP3 retry on format failures. (#1668) Thanks @steipete. https://docs.molt.bot/tts +- TTS: add auto mode enum (off/always/inbound/tagged) with per-session `/tts` override. (#1667) Thanks @sebslight. https://docs.molt.bot/tts - Telegram: treat DM topics as separate sessions and keep DM history limits stable with thread suffixes. (#1597) Thanks @rohannagpal. -- Telegram: add `channels.telegram.linkPreview` to toggle outbound link previews. (#1700) Thanks @zerone0x. https://docs.clawd.bot/channels/telegram -- Web search: add Brave freshness filter parameter for time-scoped results. (#1688) Thanks @JonUleis. https://docs.clawd.bot/tools/web +- Telegram: add `channels.telegram.linkPreview` to toggle outbound link previews. (#1700) Thanks @zerone0x. https://docs.molt.bot/channels/telegram +- Web search: add Brave freshness filter parameter for time-scoped results. (#1688) Thanks @JonUleis. https://docs.molt.bot/tools/web - UI: refresh Control UI dashboard design system (colors, icons, typography). (#1745, #1786) Thanks @EnzeD, @mousberg. -- Exec approvals: forward approval prompts to chat with `/approve` for all channels (including plugins). (#1621) Thanks @czekaj. https://docs.clawd.bot/tools/exec-approvals https://docs.clawd.bot/tools/slash-commands +- Exec approvals: forward approval prompts to chat with `/approve` for all channels (including plugins). (#1621) Thanks @czekaj. https://docs.molt.bot/tools/exec-approvals https://docs.molt.bot/tools/slash-commands - Gateway: expose config.patch in the gateway tool with safe partial updates + restart sentinel. (#1653) Thanks @Glucksberg. -- Diagnostics: add diagnostic flags for targeted debug logs (config + env override). https://docs.clawd.bot/diagnostics/flags +- Diagnostics: add diagnostic flags for targeted debug logs (config + env override). https://docs.molt.bot/diagnostics/flags - Docs: expand FAQ (migration, scheduling, concurrency, model recommendations, OpenAI subscription auth, Pi sizing, hackable install, docs SSL workaround). - Docs: add verbose installer troubleshooting guidance. - Docs: add macOS VM guide with local/hosted options + VPS/nodes guidance. (#1693) Thanks @f-trycua. -- Docs: add Bedrock EC2 instance role setup + IAM steps. (#1625) Thanks @sergical. https://docs.clawd.bot/bedrock +- Docs: add Bedrock EC2 instance role setup + IAM steps. (#1625) Thanks @sergical. https://docs.molt.bot/bedrock - Docs: update Fly.io guide notes. - Dev: add prek pre-commit hooks + dependabot config for weekly updates. (#1720) Thanks @dguido. @@ -144,11 +144,11 @@ Status: unreleased. - Web UI: hide internal `message_id` hints in chat bubbles. - Gateway: allow Control UI token-only auth to skip device pairing even when device identity is present (`gateway.controlUi.allowInsecureAuth`). (#1679) Thanks @steipete. - Matrix: decrypt E2EE media attachments with preflight size guard. (#1744) Thanks @araa47. -- BlueBubbles: route phone-number targets to DMs, avoid leaking routing IDs, and auto-create missing DMs (Private API required). (#1751) Thanks @tyler6204. https://docs.clawd.bot/channels/bluebubbles +- BlueBubbles: route phone-number targets to DMs, avoid leaking routing IDs, and auto-create missing DMs (Private API required). (#1751) Thanks @tyler6204. https://docs.molt.bot/channels/bluebubbles - BlueBubbles: keep part-index GUIDs in reply tags when short IDs are missing. - iMessage: normalize chat_id/chat_guid/chat_identifier prefixes case-insensitively and keep service-prefixed handles stable. (#1708) Thanks @aaronn. - Signal: repair reaction sends (group/UUID targets + CLI author flags). (#1651) Thanks @vilkasdev. -- Signal: add configurable signal-cli startup timeout + external daemon mode docs. (#1677) https://docs.clawd.bot/channels/signal +- Signal: add configurable signal-cli startup timeout + external daemon mode docs. (#1677) https://docs.molt.bot/channels/signal - Telegram: set fetch duplex="half" for uploads on Node 22 to avoid sendPhoto failures. (#1684) Thanks @commdata2338. - Telegram: use wrapped fetch for long-polling on Node to normalize AbortSignal handling. (#1639) - Telegram: honor per-account proxy for outbound API calls. (#1774) Thanks @radek-paclt. @@ -186,25 +186,25 @@ Status: unreleased. ## 2026.1.23 ### Highlights -- TTS: move Telegram TTS into core + enable model-driven TTS tags by default for expressive audio replies. (#1559) Thanks @Glucksberg. https://docs.clawd.bot/tts -- Gateway: add `/tools/invoke` HTTP endpoint for direct tool calls (auth + tool policy enforced). (#1575) Thanks @vignesh07. https://docs.clawd.bot/gateway/tools-invoke-http-api -- Heartbeat: per-channel visibility controls (OK/alerts/indicator). (#1452) Thanks @dlauer. https://docs.clawd.bot/gateway/heartbeat -- Deploy: add Fly.io deployment support + guide. (#1570) https://docs.clawd.bot/platforms/fly -- Channels: add Tlon/Urbit channel plugin (DMs, group mentions, thread replies). (#1544) Thanks @wca4a. https://docs.clawd.bot/channels/tlon +- TTS: move Telegram TTS into core + enable model-driven TTS tags by default for expressive audio replies. (#1559) Thanks @Glucksberg. https://docs.molt.bot/tts +- Gateway: add `/tools/invoke` HTTP endpoint for direct tool calls (auth + tool policy enforced). (#1575) Thanks @vignesh07. https://docs.molt.bot/gateway/tools-invoke-http-api +- Heartbeat: per-channel visibility controls (OK/alerts/indicator). (#1452) Thanks @dlauer. https://docs.molt.bot/gateway/heartbeat +- Deploy: add Fly.io deployment support + guide. (#1570) https://docs.molt.bot/platforms/fly +- Channels: add Tlon/Urbit channel plugin (DMs, group mentions, thread replies). (#1544) Thanks @wca4a. https://docs.molt.bot/channels/tlon ### Changes -- Channels: allow per-group tool allow/deny policies across built-in + plugin channels. (#1546) Thanks @adam91holt. https://docs.clawd.bot/multi-agent-sandbox-tools -- Agents: add Bedrock auto-discovery defaults + config overrides. (#1553) Thanks @fal3. https://docs.clawd.bot/bedrock -- CLI: add `clawdbot system` for system events + heartbeat controls; remove standalone `wake`. (commit 71203829d) https://docs.clawd.bot/cli/system -- CLI: add live auth probes to `clawdbot models status` for per-profile verification. (commit 40181afde) https://docs.clawd.bot/cli/models +- Channels: allow per-group tool allow/deny policies across built-in + plugin channels. (#1546) Thanks @adam91holt. https://docs.molt.bot/multi-agent-sandbox-tools +- Agents: add Bedrock auto-discovery defaults + config overrides. (#1553) Thanks @fal3. https://docs.molt.bot/bedrock +- CLI: add `clawdbot system` for system events + heartbeat controls; remove standalone `wake`. (commit 71203829d) https://docs.molt.bot/cli/system +- CLI: add live auth probes to `clawdbot models status` for per-profile verification. (commit 40181afde) https://docs.molt.bot/cli/models - CLI: restart the gateway by default after `clawdbot update`; add `--no-restart` to skip it. (commit 2c85b1b40) - Browser: add node-host proxy auto-routing for remote gateways (configurable per gateway/node). (commit c3cb26f7c) -- Plugins: add optional `llm-task` JSON-only tool for workflows. (#1498) Thanks @vignesh07. https://docs.clawd.bot/tools/llm-task +- Plugins: add optional `llm-task` JSON-only tool for workflows. (#1498) Thanks @vignesh07. https://docs.molt.bot/tools/llm-task - Markdown: add per-channel table conversion (bullets for Signal/WhatsApp, code blocks elsewhere). (#1495) Thanks @odysseus0. - Agents: keep system prompt time zone-only and move current time to `session_status` for better cache hits. (commit 66eec295b) - Agents: remove redundant bash tool alias from tool registration/display. (#1571) Thanks @Takhoffman. -- Docs: add cron vs heartbeat decision guide (with Lobster workflow notes). (#1533) Thanks @JustYannicc. https://docs.clawd.bot/automation/cron-vs-heartbeat -- Docs: clarify HEARTBEAT.md empty file skips heartbeats, missing file still runs. (#1535) Thanks @JustYannicc. https://docs.clawd.bot/gateway/heartbeat +- Docs: add cron vs heartbeat decision guide (with Lobster workflow notes). (#1533) Thanks @JustYannicc. https://docs.molt.bot/automation/cron-vs-heartbeat +- Docs: clarify HEARTBEAT.md empty file skips heartbeats, missing file still runs. (#1535) Thanks @JustYannicc. https://docs.molt.bot/gateway/heartbeat ### Fixes - Sessions: accept non-UUID sessionIds for history/send/status while preserving agent scoping. (#1518) @@ -282,14 +282,14 @@ Status: unreleased. ## 2026.1.21-2 ### Fixes -- Control UI: ignore bootstrap identity placeholder text for avatar values and fall back to the default avatar. https://docs.clawd.bot/cli/agents https://docs.clawd.bot/web/control-ui +- Control UI: ignore bootstrap identity placeholder text for avatar values and fall back to the default avatar. https://docs.molt.bot/cli/agents https://docs.molt.bot/web/control-ui - Slack: remove deprecated `filetype` field from `files.uploadV2` to eliminate API warnings. (#1447) ## 2026.1.21 ### Changes -- Highlight: Lobster optional plugin tool for typed workflows + approval gates. https://docs.clawd.bot/tools/lobster -- Lobster: allow workflow file args via `argsJson` in the plugin tool. https://docs.clawd.bot/tools/lobster +- Highlight: Lobster optional plugin tool for typed workflows + approval gates. https://docs.molt.bot/tools/lobster +- Lobster: allow workflow file args via `argsJson` in the plugin tool. https://docs.molt.bot/tools/lobster - Heartbeat: allow running heartbeats in an explicit session key. (#1256) Thanks @zknicker. - CLI: default exec approvals to the local host, add gateway/node targeting flags, and show target details in allowlist output. - CLI: exec approvals mutations render tables instead of raw JSON. @@ -301,16 +301,16 @@ Status: unreleased. - Sessions: add per-channel reset overrides via `session.resetByChannel`. (#1353) Thanks @cash-echo-bot. - Agents: add identity avatar config support and Control UI avatar rendering. (#1329, #1424) Thanks @dlauer. - UI: show per-session assistant identity in the Control UI. (#1420) Thanks @robbyczgw-cla. -- CLI: add `clawdbot update wizard` for interactive channel selection and restart prompts. https://docs.clawd.bot/cli/update +- CLI: add `clawdbot update wizard` for interactive channel selection and restart prompts. https://docs.molt.bot/cli/update - Signal: add typing indicators and DM read receipts via signal-cli. - MSTeams: add file uploads, adaptive cards, and attachment handling improvements. (#1410) Thanks @Evizero. - Onboarding: remove the run setup-token auth option (paste setup-token or reuse CLI creds instead). -- Docs: add troubleshooting entry for gateway.mode blocking gateway start. https://docs.clawd.bot/gateway/troubleshooting +- Docs: add troubleshooting entry for gateway.mode blocking gateway start. https://docs.molt.bot/gateway/troubleshooting - Docs: add /model allowlist troubleshooting note. (#1405) - Docs: add per-message Gmail search example for gog. (#1220) Thanks @mbelinky. ### Breaking -- **BREAKING:** Control UI now rejects insecure HTTP without device identity by default. Use HTTPS (Tailscale Serve) or set `gateway.controlUi.allowInsecureAuth: true` to allow token-only auth. https://docs.clawd.bot/web/control-ui#insecure-http +- **BREAKING:** Control UI now rejects insecure HTTP without device identity by default. Use HTTPS (Tailscale Serve) or set `gateway.controlUi.allowInsecureAuth: true` to allow token-only auth. https://docs.molt.bot/web/control-ui#insecure-http - **BREAKING:** Envelope and system event timestamps now default to host-local time (was UTC) so agents don’t have to constantly convert. ### Fixes @@ -336,68 +336,68 @@ Status: unreleased. ## 2026.1.20 ### Changes -- Control UI: add copy-as-markdown with error feedback. (#1345) https://docs.clawd.bot/web/control-ui -- Control UI: drop the legacy list view. (#1345) https://docs.clawd.bot/web/control-ui -- TUI: add syntax highlighting for code blocks. (#1200) https://docs.clawd.bot/tui -- TUI: session picker shows derived titles, fuzzy search, relative times, and last message preview. (#1271) https://docs.clawd.bot/tui -- TUI: add a searchable model picker for quicker model selection. (#1198) https://docs.clawd.bot/tui -- TUI: add input history (up/down) for submitted messages. (#1348) https://docs.clawd.bot/tui -- ACP: add `clawdbot acp` for IDE integrations. https://docs.clawd.bot/cli/acp -- ACP: add `clawdbot acp client` interactive harness for debugging. https://docs.clawd.bot/cli/acp -- Skills: add download installs with OS-filtered options. https://docs.clawd.bot/tools/skills -- Skills: add the local sherpa-onnx-tts skill. https://docs.clawd.bot/tools/skills -- Memory: add hybrid BM25 + vector search (FTS5) with weighted merging and fallback. https://docs.clawd.bot/concepts/memory -- Memory: add SQLite embedding cache to speed up reindexing and frequent updates. https://docs.clawd.bot/concepts/memory -- Memory: add OpenAI batch indexing for embeddings when configured. https://docs.clawd.bot/concepts/memory -- Memory: enable OpenAI batch indexing by default for OpenAI embeddings. https://docs.clawd.bot/concepts/memory -- Memory: allow parallel OpenAI batch indexing jobs (default concurrency: 2). https://docs.clawd.bot/concepts/memory -- Memory: render progress immediately, color batch statuses in verbose logs, and poll OpenAI batch status every 2s by default. https://docs.clawd.bot/concepts/memory -- Memory: add `--verbose` logging for memory status + batch indexing details. https://docs.clawd.bot/concepts/memory -- Memory: add native Gemini embeddings provider for memory search. (#1151) https://docs.clawd.bot/concepts/memory -- Browser: allow config defaults for efficient snapshots in the tool/CLI. (#1336) https://docs.clawd.bot/tools/browser -- Nostr: add the Nostr channel plugin with profile management + onboarding defaults. (#1323) https://docs.clawd.bot/channels/nostr -- Matrix: migrate to matrix-bot-sdk with E2EE support, location handling, and group allowlist upgrades. (#1298) https://docs.clawd.bot/channels/matrix -- Slack: add HTTP webhook mode via Bolt HTTP receiver. (#1143) https://docs.clawd.bot/channels/slack -- Telegram: enrich forwarded-message context with normalized origin details + legacy fallback. (#1090) https://docs.clawd.bot/channels/telegram +- Control UI: add copy-as-markdown with error feedback. (#1345) https://docs.molt.bot/web/control-ui +- Control UI: drop the legacy list view. (#1345) https://docs.molt.bot/web/control-ui +- TUI: add syntax highlighting for code blocks. (#1200) https://docs.molt.bot/tui +- TUI: session picker shows derived titles, fuzzy search, relative times, and last message preview. (#1271) https://docs.molt.bot/tui +- TUI: add a searchable model picker for quicker model selection. (#1198) https://docs.molt.bot/tui +- TUI: add input history (up/down) for submitted messages. (#1348) https://docs.molt.bot/tui +- ACP: add `clawdbot acp` for IDE integrations. https://docs.molt.bot/cli/acp +- ACP: add `clawdbot acp client` interactive harness for debugging. https://docs.molt.bot/cli/acp +- Skills: add download installs with OS-filtered options. https://docs.molt.bot/tools/skills +- Skills: add the local sherpa-onnx-tts skill. https://docs.molt.bot/tools/skills +- Memory: add hybrid BM25 + vector search (FTS5) with weighted merging and fallback. https://docs.molt.bot/concepts/memory +- Memory: add SQLite embedding cache to speed up reindexing and frequent updates. https://docs.molt.bot/concepts/memory +- Memory: add OpenAI batch indexing for embeddings when configured. https://docs.molt.bot/concepts/memory +- Memory: enable OpenAI batch indexing by default for OpenAI embeddings. https://docs.molt.bot/concepts/memory +- Memory: allow parallel OpenAI batch indexing jobs (default concurrency: 2). https://docs.molt.bot/concepts/memory +- Memory: render progress immediately, color batch statuses in verbose logs, and poll OpenAI batch status every 2s by default. https://docs.molt.bot/concepts/memory +- Memory: add `--verbose` logging for memory status + batch indexing details. https://docs.molt.bot/concepts/memory +- Memory: add native Gemini embeddings provider for memory search. (#1151) https://docs.molt.bot/concepts/memory +- Browser: allow config defaults for efficient snapshots in the tool/CLI. (#1336) https://docs.molt.bot/tools/browser +- Nostr: add the Nostr channel plugin with profile management + onboarding defaults. (#1323) https://docs.molt.bot/channels/nostr +- Matrix: migrate to matrix-bot-sdk with E2EE support, location handling, and group allowlist upgrades. (#1298) https://docs.molt.bot/channels/matrix +- Slack: add HTTP webhook mode via Bolt HTTP receiver. (#1143) https://docs.molt.bot/channels/slack +- Telegram: enrich forwarded-message context with normalized origin details + legacy fallback. (#1090) https://docs.molt.bot/channels/telegram - Discord: fall back to `/skill` when native command limits are exceeded. (#1287) - Discord: expose `/skill` globally. (#1287) -- Zalouser: add channel dock metadata, config schema, setup wiring, probe, and status issues. (#1219) https://docs.clawd.bot/plugins/zalouser -- Plugins: require manifest-embedded config schemas with preflight validation warnings. (#1272) https://docs.clawd.bot/plugins/manifest -- Plugins: move channel catalog metadata into plugin manifests. (#1290) https://docs.clawd.bot/plugins/manifest -- Plugins: align Nextcloud Talk policy helpers with core patterns. (#1290) https://docs.clawd.bot/plugins/manifest -- Plugins/UI: let channel plugin metadata drive UI labels/icons and cron channel options. (#1306) https://docs.clawd.bot/web/control-ui -- Agents/UI: add agent avatar support in identity config, IDENTITY.md, and the Control UI. (#1329) https://docs.clawd.bot/gateway/configuration -- Plugins: add plugin slots with a dedicated memory slot selector. https://docs.clawd.bot/plugins/agent-tools -- Plugins: ship the bundled BlueBubbles channel plugin (disabled by default). https://docs.clawd.bot/channels/bluebubbles +- Zalouser: add channel dock metadata, config schema, setup wiring, probe, and status issues. (#1219) https://docs.molt.bot/plugins/zalouser +- Plugins: require manifest-embedded config schemas with preflight validation warnings. (#1272) https://docs.molt.bot/plugins/manifest +- Plugins: move channel catalog metadata into plugin manifests. (#1290) https://docs.molt.bot/plugins/manifest +- Plugins: align Nextcloud Talk policy helpers with core patterns. (#1290) https://docs.molt.bot/plugins/manifest +- Plugins/UI: let channel plugin metadata drive UI labels/icons and cron channel options. (#1306) https://docs.molt.bot/web/control-ui +- Agents/UI: add agent avatar support in identity config, IDENTITY.md, and the Control UI. (#1329) https://docs.molt.bot/gateway/configuration +- Plugins: add plugin slots with a dedicated memory slot selector. https://docs.molt.bot/plugins/agent-tools +- Plugins: ship the bundled BlueBubbles channel plugin (disabled by default). https://docs.molt.bot/channels/bluebubbles - Plugins: migrate bundled messaging extensions to the plugin SDK and resolve plugin-sdk imports in the loader. -- Plugins: migrate the Zalo plugin to the shared plugin SDK runtime. https://docs.clawd.bot/channels/zalo -- Plugins: migrate the Zalo Personal plugin to the shared plugin SDK runtime. https://docs.clawd.bot/plugins/zalouser -- Plugins: allow optional agent tools with explicit allowlists and add the plugin tool authoring guide. https://docs.clawd.bot/plugins/agent-tools +- Plugins: migrate the Zalo plugin to the shared plugin SDK runtime. https://docs.molt.bot/channels/zalo +- Plugins: migrate the Zalo Personal plugin to the shared plugin SDK runtime. https://docs.molt.bot/plugins/zalouser +- Plugins: allow optional agent tools with explicit allowlists and add the plugin tool authoring guide. https://docs.molt.bot/plugins/agent-tools - Plugins: auto-enable bundled channel/provider plugins when configuration is present. - Plugins: sync plugin sources on channel switches and update npm-installed plugins during `clawdbot update`. - Plugins: share npm plugin update logic between `clawdbot update` and `clawdbot plugins update`. - Gateway/API: add `/v1/responses` (OpenResponses) with item-based input + semantic streaming events. (#1229) - Gateway/API: expand `/v1/responses` to support file/image inputs, tool_choice, usage, and output limits. (#1229) -- Usage: add `/usage cost` summaries and macOS menu cost charts. https://docs.clawd.bot/reference/api-usage-costs -- Security: warn when <=300B models run without sandboxing while web tools are enabled. https://docs.clawd.bot/cli/security -- Exec: add host/security/ask routing for gateway + node exec. https://docs.clawd.bot/tools/exec -- Exec: add `/exec` directive for per-session exec defaults (host/security/ask/node). https://docs.clawd.bot/tools/exec -- Exec approvals: migrate approvals to `~/.clawdbot/exec-approvals.json` with per-agent allowlists + skill auto-allow toggle, and add approvals UI + node exec lifecycle events. https://docs.clawd.bot/tools/exec-approvals -- Nodes: add headless node host (`clawdbot node start`) for `system.run`/`system.which`. https://docs.clawd.bot/cli/node -- Nodes: add node daemon service install/status/start/stop/restart. https://docs.clawd.bot/cli/node +- Usage: add `/usage cost` summaries and macOS menu cost charts. https://docs.molt.bot/reference/api-usage-costs +- Security: warn when <=300B models run without sandboxing while web tools are enabled. https://docs.molt.bot/cli/security +- Exec: add host/security/ask routing for gateway + node exec. https://docs.molt.bot/tools/exec +- Exec: add `/exec` directive for per-session exec defaults (host/security/ask/node). https://docs.molt.bot/tools/exec +- Exec approvals: migrate approvals to `~/.clawdbot/exec-approvals.json` with per-agent allowlists + skill auto-allow toggle, and add approvals UI + node exec lifecycle events. https://docs.molt.bot/tools/exec-approvals +- Nodes: add headless node host (`clawdbot node start`) for `system.run`/`system.which`. https://docs.molt.bot/cli/node +- Nodes: add node daemon service install/status/start/stop/restart. https://docs.molt.bot/cli/node - Bridge: add `skills.bins` RPC to support node host auto-allow skill bins. -- Sessions: add daily reset policy with per-type overrides and idle windows (default 4am local), preserving legacy idle-only configs. (#1146) https://docs.clawd.bot/concepts/session -- Sessions: allow `sessions_spawn` to override thinking level for sub-agent runs. https://docs.clawd.bot/tools/subagents -- Channels: unify thread/topic allowlist matching + command/mention gating helpers across core providers. https://docs.clawd.bot/concepts/groups -- Models: add Qwen Portal OAuth provider support. (#1120) https://docs.clawd.bot/providers/qwen -- Onboarding: add allowlist prompts and username-to-id resolution across core and extension channels. https://docs.clawd.bot/start/onboarding -- Docs: clarify allowlist input types and onboarding behavior for messaging channels. https://docs.clawd.bot/start/onboarding -- Docs: refresh Android node discovery docs for the Gateway WS service type. https://docs.clawd.bot/platforms/android -- Docs: surface Amazon Bedrock in provider lists and clarify Bedrock auth env vars. (#1289) https://docs.clawd.bot/bedrock -- Docs: clarify WhatsApp voice notes. https://docs.clawd.bot/channels/whatsapp -- Docs: clarify Windows WSL portproxy LAN access notes. https://docs.clawd.bot/platforms/windows -- Docs: refresh bird skill install metadata and usage notes. (#1302) https://docs.clawd.bot/tools/browser-login +- Sessions: add daily reset policy with per-type overrides and idle windows (default 4am local), preserving legacy idle-only configs. (#1146) https://docs.molt.bot/concepts/session +- Sessions: allow `sessions_spawn` to override thinking level for sub-agent runs. https://docs.molt.bot/tools/subagents +- Channels: unify thread/topic allowlist matching + command/mention gating helpers across core providers. https://docs.molt.bot/concepts/groups +- Models: add Qwen Portal OAuth provider support. (#1120) https://docs.molt.bot/providers/qwen +- Onboarding: add allowlist prompts and username-to-id resolution across core and extension channels. https://docs.molt.bot/start/onboarding +- Docs: clarify allowlist input types and onboarding behavior for messaging channels. https://docs.molt.bot/start/onboarding +- Docs: refresh Android node discovery docs for the Gateway WS service type. https://docs.molt.bot/platforms/android +- Docs: surface Amazon Bedrock in provider lists and clarify Bedrock auth env vars. (#1289) https://docs.molt.bot/bedrock +- Docs: clarify WhatsApp voice notes. https://docs.molt.bot/channels/whatsapp +- Docs: clarify Windows WSL portproxy LAN access notes. https://docs.molt.bot/platforms/windows +- Docs: refresh bird skill install metadata and usage notes. (#1302) https://docs.molt.bot/tools/browser-login - Agents: add local docs path resolution and include docs/mirror/source/community pointers in the system prompt. - Agents: clarify node_modules read-only guidance in agent instructions. - Config: stamp last-touched metadata on write and warn if the config is newer than the running build. @@ -522,19 +522,19 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic ## 2026.1.16-1 ### Highlights -- Hooks: add hooks system with bundled hooks, CLI tooling, and docs. (#1028) — thanks @ThomsenDrake. https://docs.clawd.bot/hooks -- Media: add inbound media understanding (image/audio/video) with provider + CLI fallbacks. https://docs.clawd.bot/nodes/media-understanding -- Plugins: add Zalo Personal plugin (`@clawdbot/zalouser`) and unify channel directory for plugins. (#1032) — thanks @suminhthanh. https://docs.clawd.bot/plugins/zalouser -- Models: add Vercel AI Gateway auth choice + onboarding updates. (#1016) — thanks @timolins. https://docs.clawd.bot/providers/vercel-ai-gateway -- Sessions: add `session.identityLinks` for cross-platform DM session li nking. (#1033) — thanks @thewilloftheshadow. https://docs.clawd.bot/concepts/session -- Web search: add `country`/`language` parameters (schema + Brave API) and docs. (#1046) — thanks @YuriNachos. https://docs.clawd.bot/tools/web +- Hooks: add hooks system with bundled hooks, CLI tooling, and docs. (#1028) — thanks @ThomsenDrake. https://docs.molt.bot/hooks +- Media: add inbound media understanding (image/audio/video) with provider + CLI fallbacks. https://docs.molt.bot/nodes/media-understanding +- Plugins: add Zalo Personal plugin (`@clawdbot/zalouser`) and unify channel directory for plugins. (#1032) — thanks @suminhthanh. https://docs.molt.bot/plugins/zalouser +- Models: add Vercel AI Gateway auth choice + onboarding updates. (#1016) — thanks @timolins. https://docs.molt.bot/providers/vercel-ai-gateway +- Sessions: add `session.identityLinks` for cross-platform DM session li nking. (#1033) — thanks @thewilloftheshadow. https://docs.molt.bot/concepts/session +- Web search: add `country`/`language` parameters (schema + Brave API) and docs. (#1046) — thanks @YuriNachos. https://docs.molt.bot/tools/web ### Breaking - **BREAKING:** `clawdbot message` and message tool now require `target` (dropping `to`/`channelId` for destinations). (#1034) — thanks @tobalsan. - **BREAKING:** Channel auth now prefers config over env for Discord/Telegram/Matrix (env is fallback only). (#1040) — thanks @thewilloftheshadow. - **BREAKING:** Drop legacy `chatType: "room"` support; use `chatType: "channel"`. - **BREAKING:** remove legacy provider-specific target resolution fallbacks; target resolution is centralized with plugin hints + directory lookups. -- **BREAKING:** `clawdbot hooks` is now `clawdbot webhooks`; hooks live under `clawdbot hooks`. https://docs.clawd.bot/cli/webhooks +- **BREAKING:** `clawdbot hooks` is now `clawdbot webhooks`; hooks live under `clawdbot hooks`. https://docs.molt.bot/cli/webhooks - **BREAKING:** `clawdbot plugins install ` now copies into `~/.clawdbot/extensions` (use `--link` to keep path-based loading). ### Changes @@ -545,7 +545,7 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic - Tools: send Chrome-like headers by default for `web_fetch` to improve extraction on bot-sensitive sites. - Tools: Firecrawl fallback now uses bot-circumvention + cache by default; remove basic HTML fallback when extraction fails. - Tools: default `exec` exit notifications and auto-migrate legacy `tools.bash` to `tools.exec`. -- Tools: add `exec` PTY support for interactive sessions. https://docs.clawd.bot/tools/exec +- Tools: add `exec` PTY support for interactive sessions. https://docs.molt.bot/tools/exec - Tools: add tmux-style `process send-keys` and bracketed paste helpers for PTY sessions. - Tools: add `process submit` helper to send CR for PTY sessions. - Tools: respond to PTY cursor position queries to unblock interactive TUIs. @@ -600,7 +600,7 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic - Sessions: hard-stop `sessions.delete` cleanup. - Channels: treat replies to the bot as implicit mentions across supported channels. - Channels: normalize object-format capabilities in channel capability parsing. -- Security: default-deny slash/control commands unless a channel computed `CommandAuthorized` (fixes accidental “open” behavior), and ensure WhatsApp + Zalo plugin channels gate inline `/…` tokens correctly. https://docs.clawd.bot/gateway/security +- Security: default-deny slash/control commands unless a channel computed `CommandAuthorized` (fixes accidental “open” behavior), and ensure WhatsApp + Zalo plugin channels gate inline `/…` tokens correctly. https://docs.molt.bot/gateway/security - Security: redact sensitive text in gateway WS logs. - Tools: cap pending `exec` process output to avoid unbounded buffers. - CLI: speed up `clawdbot sandbox-explain` by avoiding heavy plugin imports when normalizing channel ids. @@ -906,7 +906,7 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic - Agents: add pre-compaction memory flush config (`agents.defaults.compaction.*`) with a soft threshold + system prompt. - Config: add `$include` directive for modular config files. (#731) — thanks @pasogott. - Build: set pnpm minimum release age to 2880 minutes (2 days). (#718) — thanks @dan-dr. -- macOS: prompt to install the global `clawdbot` CLI when missing in local mode; install via `clawd.bot/install-cli.sh` (no onboarding) and use external launchd/CLI instead of the embedded gateway runtime. +- macOS: prompt to install the global `clawdbot` CLI when missing in local mode; install via `molt.bot/install-cli.sh` (no onboarding) and use external launchd/CLI instead of the embedded gateway runtime. - Docs: add gog calendar event color IDs from `gog calendar colors`. (#715) — thanks @mjrussell. - Cron/CLI: add `--model` flag to cron add/edit commands. (#711) — thanks @mjrussell. - Cron/CLI: trim model overrides on cron edits and document main-session guidance. (#711) — thanks @mjrussell. @@ -920,7 +920,7 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic ### Installer - Postinstall: replace `git apply` with builtin JS patcher (works npm/pnpm/bun; no git dependency) plus regression tests. - Postinstall: skip pnpm patch fallback when the new patcher is active. -- Installer tests: add root+non-root docker smokes, CI workflow to fetch clawd.bot scripts and run install sh/cli with onboarding skipped. +- Installer tests: add root+non-root docker smokes, CI workflow to fetch molt.bot scripts and run install sh/cli with onboarding skipped. - Installer UX: support `CLAWDBOT_NO_ONBOARD=1` for non-interactive installs; fix npm prefix on Linux and auto-install git. - Installer UX: add `install.sh --help` with flags/env and git install hint. - Installer UX: add `--install-method git|npm` and auto-detect source checkouts (prompt to update git checkout vs migrate to npm). diff --git a/README.md b/README.md index a3f0b11d1..9f1f93193 100644 --- a/README.md +++ b/README.md @@ -21,55 +21,56 @@ It answers you on the channels you already use (WhatsApp, Telegram, Slack, Disco If you want a personal, single-user assistant that feels local, fast, and always-on, this is it. -[Website](https://clawdbot.com) · [Docs](https://docs.clawd.bot) · [Getting Started](https://docs.clawd.bot/start/getting-started) · [Updating](https://docs.clawd.bot/install/updating) · [Showcase](https://docs.clawd.bot/start/showcase) · [FAQ](https://docs.clawd.bot/start/faq) · [Wizard](https://docs.clawd.bot/start/wizard) · [Nix](https://github.com/clawdbot/nix-clawdbot) · [Docker](https://docs.clawd.bot/install/docker) · [Discord](https://discord.gg/clawd) +[Website](https://molt.bot) · [Docs](https://docs.molt.bot) · [Getting Started](https://docs.molt.bot/start/getting-started) · [Updating](https://docs.molt.bot/install/updating) · [Showcase](https://docs.molt.bot/start/showcase) · [FAQ](https://docs.molt.bot/start/faq) · [Wizard](https://docs.molt.bot/start/wizard) · [Nix](https://github.com/clawdbot/nix-clawdbot) · [Docker](https://docs.molt.bot/install/docker) · [Discord](https://discord.gg/clawd) Preferred setup: run the onboarding wizard (`clawdbot onboard`). It walks through gateway, workspace, channels, and skills. The CLI wizard is the recommended path and works on **macOS, Linux, and Windows (via WSL2; strongly recommended)**. Works with npm, pnpm, or bun. -New install? Start here: [Getting started](https://docs.clawd.bot/start/getting-started) +New install? Start here: [Getting started](https://docs.molt.bot/start/getting-started) **Subscriptions (OAuth):** - **[Anthropic](https://www.anthropic.com/)** (Claude Pro/Max) - **[OpenAI](https://openai.com/)** (ChatGPT/Codex) -Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.5** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.clawd.bot/start/onboarding). +Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.5** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.molt.bot/start/onboarding). ## Models (selection + auth) -- Models config + CLI: [Models](https://docs.clawd.bot/concepts/models) -- Auth profile rotation (OAuth vs API keys) + fallbacks: [Model failover](https://docs.clawd.bot/concepts/model-failover) +- Models config + CLI: [Models](https://docs.molt.bot/concepts/models) +- Auth profile rotation (OAuth vs API keys) + fallbacks: [Model failover](https://docs.molt.bot/concepts/model-failover) ## Install (recommended) Runtime: **Node ≥22**. ```bash -npm install -g clawdbot@latest -# or: pnpm add -g clawdbot@latest +npm install -g moltbot@latest +# or: pnpm add -g moltbot@latest -clawdbot onboard --install-daemon +moltbot onboard --install-daemon ``` The wizard installs the Gateway daemon (launchd/systemd user service) so it stays running. +Legacy note: `clawdbot` remains available as a compatibility shim. ## Quick start (TL;DR) Runtime: **Node ≥22**. -Full beginner guide (auth, pairing, channels): [Getting started](https://docs.clawd.bot/start/getting-started) +Full beginner guide (auth, pairing, channels): [Getting started](https://docs.molt.bot/start/getting-started) ```bash -clawdbot onboard --install-daemon +moltbot onboard --install-daemon -clawdbot gateway --port 18789 --verbose +moltbot gateway --port 18789 --verbose # Send a message -clawdbot message send --to +1234567890 --message "Hello from Clawdbot" +moltbot message send --to +1234567890 --message "Hello from Moltbot" # Talk to the assistant (optionally deliver back to any connected channel: WhatsApp/Telegram/Slack/Discord/Google Chat/Signal/iMessage/BlueBubbles/Microsoft Teams/Matrix/Zalo/Zalo Personal/WebChat) -clawdbot agent --message "Ship checklist" --thinking high +moltbot agent --message "Ship checklist" --thinking high ``` -Upgrading? [Updating guide](https://docs.clawd.bot/install/updating) (and run `clawdbot doctor`). +Upgrading? [Updating guide](https://docs.molt.bot/install/updating) (and run `moltbot doctor`). ## Development channels @@ -78,7 +79,7 @@ Upgrading? [Updating guide](https://docs.clawd.bot/install/updating) (and run `c - **dev**: moving head of `main`, npm dist-tag `dev` (when published). Switch channels (git + npm): `clawdbot update --channel stable|beta|dev`. -Details: [Development channels](https://docs.clawd.bot/install/development-channels). +Details: [Development channels](https://docs.molt.bot/install/development-channels). ## From source (development) @@ -92,19 +93,19 @@ pnpm install pnpm ui:build # auto-installs UI deps on first run pnpm build -pnpm clawdbot onboard --install-daemon +pnpm moltbot onboard --install-daemon # Dev loop (auto-reload on TS changes) pnpm gateway:watch ``` -Note: `pnpm clawdbot ...` runs TypeScript directly (via `tsx`). `pnpm build` produces `dist/` for running via Node / the packaged `clawdbot` binary. +Note: `pnpm moltbot ...` runs TypeScript directly (via `tsx`). `pnpm build` produces `dist/` for running via Node / the packaged `moltbot` binary. ## Security defaults (DM access) Clawdbot connects to real messaging surfaces. Treat inbound DMs as **untrusted input**. -Full security guide: [Security](https://docs.clawd.bot/gateway/security) +Full security guide: [Security](https://docs.molt.bot/gateway/security) Default behavior on Telegram/WhatsApp/Signal/iMessage/Microsoft Teams/Discord/Google Chat/Slack: - **DM pairing** (`dmPolicy="pairing"` / `channels.discord.dm.policy="pairing"` / `channels.slack.dm.policy="pairing"`): unknown senders receive a short pairing code and the bot does not process their message. @@ -115,14 +116,14 @@ Run `clawdbot doctor` to surface risky/misconfigured DM policies. ## Highlights -- **[Local-first Gateway](https://docs.clawd.bot/gateway)** — single control plane for sessions, channels, tools, and events. -- **[Multi-channel inbox](https://docs.clawd.bot/channels)** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, BlueBubbles, Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android. -- **[Multi-agent routing](https://docs.clawd.bot/gateway/configuration)** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions). -- **[Voice Wake](https://docs.clawd.bot/nodes/voicewake) + [Talk Mode](https://docs.clawd.bot/nodes/talk)** — always-on speech for macOS/iOS/Android with ElevenLabs. -- **[Live Canvas](https://docs.clawd.bot/platforms/mac/canvas)** — agent-driven visual workspace with [A2UI](https://docs.clawd.bot/platforms/mac/canvas#canvas-a2ui). -- **[First-class tools](https://docs.clawd.bot/tools)** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions. -- **[Companion apps](https://docs.clawd.bot/platforms/macos)** — macOS menu bar app + iOS/Android [nodes](https://docs.clawd.bot/nodes). -- **[Onboarding](https://docs.clawd.bot/start/wizard) + [skills](https://docs.clawd.bot/tools/skills)** — wizard-driven setup with bundled/managed/workspace skills. +- **[Local-first Gateway](https://docs.molt.bot/gateway)** — single control plane for sessions, channels, tools, and events. +- **[Multi-channel inbox](https://docs.molt.bot/channels)** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, BlueBubbles, Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android. +- **[Multi-agent routing](https://docs.molt.bot/gateway/configuration)** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions). +- **[Voice Wake](https://docs.molt.bot/nodes/voicewake) + [Talk Mode](https://docs.molt.bot/nodes/talk)** — always-on speech for macOS/iOS/Android with ElevenLabs. +- **[Live Canvas](https://docs.molt.bot/platforms/mac/canvas)** — agent-driven visual workspace with [A2UI](https://docs.molt.bot/platforms/mac/canvas#canvas-a2ui). +- **[First-class tools](https://docs.molt.bot/tools)** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions. +- **[Companion apps](https://docs.molt.bot/platforms/macos)** — macOS menu bar app + iOS/Android [nodes](https://docs.molt.bot/nodes). +- **[Onboarding](https://docs.molt.bot/start/wizard) + [skills](https://docs.molt.bot/tools/skills)** — wizard-driven setup with bundled/managed/workspace skills. ## Star History @@ -131,40 +132,40 @@ Run `clawdbot doctor` to surface risky/misconfigured DM policies. ## Everything we built so far ### Core platform -- [Gateway WS control plane](https://docs.clawd.bot/gateway) with sessions, presence, config, cron, webhooks, [Control UI](https://docs.clawd.bot/web), and [Canvas host](https://docs.clawd.bot/platforms/mac/canvas#canvas-a2ui). -- [CLI surface](https://docs.clawd.bot/tools/agent-send): gateway, agent, send, [wizard](https://docs.clawd.bot/start/wizard), and [doctor](https://docs.clawd.bot/gateway/doctor). -- [Pi agent runtime](https://docs.clawd.bot/concepts/agent) in RPC mode with tool streaming and block streaming. -- [Session model](https://docs.clawd.bot/concepts/session): `main` for direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: [Groups](https://docs.clawd.bot/concepts/groups). -- [Media pipeline](https://docs.clawd.bot/nodes/images): images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: [Audio](https://docs.clawd.bot/nodes/audio). +- [Gateway WS control plane](https://docs.molt.bot/gateway) with sessions, presence, config, cron, webhooks, [Control UI](https://docs.molt.bot/web), and [Canvas host](https://docs.molt.bot/platforms/mac/canvas#canvas-a2ui). +- [CLI surface](https://docs.molt.bot/tools/agent-send): gateway, agent, send, [wizard](https://docs.molt.bot/start/wizard), and [doctor](https://docs.molt.bot/gateway/doctor). +- [Pi agent runtime](https://docs.molt.bot/concepts/agent) in RPC mode with tool streaming and block streaming. +- [Session model](https://docs.molt.bot/concepts/session): `main` for direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: [Groups](https://docs.molt.bot/concepts/groups). +- [Media pipeline](https://docs.molt.bot/nodes/images): images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: [Audio](https://docs.molt.bot/nodes/audio). ### Channels -- [Channels](https://docs.clawd.bot/channels): [WhatsApp](https://docs.clawd.bot/channels/whatsapp) (Baileys), [Telegram](https://docs.clawd.bot/channels/telegram) (grammY), [Slack](https://docs.clawd.bot/channels/slack) (Bolt), [Discord](https://docs.clawd.bot/channels/discord) (discord.js), [Google Chat](https://docs.clawd.bot/channels/googlechat) (Chat API), [Signal](https://docs.clawd.bot/channels/signal) (signal-cli), [iMessage](https://docs.clawd.bot/channels/imessage) (imsg), [BlueBubbles](https://docs.clawd.bot/channels/bluebubbles) (extension), [Microsoft Teams](https://docs.clawd.bot/channels/msteams) (extension), [Matrix](https://docs.clawd.bot/channels/matrix) (extension), [Zalo](https://docs.clawd.bot/channels/zalo) (extension), [Zalo Personal](https://docs.clawd.bot/channels/zalouser) (extension), [WebChat](https://docs.clawd.bot/web/webchat). -- [Group routing](https://docs.clawd.bot/concepts/group-messages): mention gating, reply tags, per-channel chunking and routing. Channel rules: [Channels](https://docs.clawd.bot/channels). +- [Channels](https://docs.molt.bot/channels): [WhatsApp](https://docs.molt.bot/channels/whatsapp) (Baileys), [Telegram](https://docs.molt.bot/channels/telegram) (grammY), [Slack](https://docs.molt.bot/channels/slack) (Bolt), [Discord](https://docs.molt.bot/channels/discord) (discord.js), [Google Chat](https://docs.molt.bot/channels/googlechat) (Chat API), [Signal](https://docs.molt.bot/channels/signal) (signal-cli), [iMessage](https://docs.molt.bot/channels/imessage) (imsg), [BlueBubbles](https://docs.molt.bot/channels/bluebubbles) (extension), [Microsoft Teams](https://docs.molt.bot/channels/msteams) (extension), [Matrix](https://docs.molt.bot/channels/matrix) (extension), [Zalo](https://docs.molt.bot/channels/zalo) (extension), [Zalo Personal](https://docs.molt.bot/channels/zalouser) (extension), [WebChat](https://docs.molt.bot/web/webchat). +- [Group routing](https://docs.molt.bot/concepts/group-messages): mention gating, reply tags, per-channel chunking and routing. Channel rules: [Channels](https://docs.molt.bot/channels). ### Apps + nodes -- [macOS app](https://docs.clawd.bot/platforms/macos): menu bar control plane, [Voice Wake](https://docs.clawd.bot/nodes/voicewake)/PTT, [Talk Mode](https://docs.clawd.bot/nodes/talk) overlay, [WebChat](https://docs.clawd.bot/web/webchat), debug tools, [remote gateway](https://docs.clawd.bot/gateway/remote) control. -- [iOS node](https://docs.clawd.bot/platforms/ios): [Canvas](https://docs.clawd.bot/platforms/mac/canvas), [Voice Wake](https://docs.clawd.bot/nodes/voicewake), [Talk Mode](https://docs.clawd.bot/nodes/talk), camera, screen recording, Bonjour pairing. -- [Android node](https://docs.clawd.bot/platforms/android): [Canvas](https://docs.clawd.bot/platforms/mac/canvas), [Talk Mode](https://docs.clawd.bot/nodes/talk), camera, screen recording, optional SMS. -- [macOS node mode](https://docs.clawd.bot/nodes): system.run/notify + canvas/camera exposure. +- [macOS app](https://docs.molt.bot/platforms/macos): menu bar control plane, [Voice Wake](https://docs.molt.bot/nodes/voicewake)/PTT, [Talk Mode](https://docs.molt.bot/nodes/talk) overlay, [WebChat](https://docs.molt.bot/web/webchat), debug tools, [remote gateway](https://docs.molt.bot/gateway/remote) control. +- [iOS node](https://docs.molt.bot/platforms/ios): [Canvas](https://docs.molt.bot/platforms/mac/canvas), [Voice Wake](https://docs.molt.bot/nodes/voicewake), [Talk Mode](https://docs.molt.bot/nodes/talk), camera, screen recording, Bonjour pairing. +- [Android node](https://docs.molt.bot/platforms/android): [Canvas](https://docs.molt.bot/platforms/mac/canvas), [Talk Mode](https://docs.molt.bot/nodes/talk), camera, screen recording, optional SMS. +- [macOS node mode](https://docs.molt.bot/nodes): system.run/notify + canvas/camera exposure. ### Tools + automation -- [Browser control](https://docs.clawd.bot/tools/browser): dedicated clawd Chrome/Chromium, snapshots, actions, uploads, profiles. -- [Canvas](https://docs.clawd.bot/platforms/mac/canvas): [A2UI](https://docs.clawd.bot/platforms/mac/canvas#canvas-a2ui) push/reset, eval, snapshot. -- [Nodes](https://docs.clawd.bot/nodes): camera snap/clip, screen record, [location.get](https://docs.clawd.bot/nodes/location-command), notifications. -- [Cron + wakeups](https://docs.clawd.bot/automation/cron-jobs); [webhooks](https://docs.clawd.bot/automation/webhook); [Gmail Pub/Sub](https://docs.clawd.bot/automation/gmail-pubsub). -- [Skills platform](https://docs.clawd.bot/tools/skills): bundled, managed, and workspace skills with install gating + UI. +- [Browser control](https://docs.molt.bot/tools/browser): dedicated clawd Chrome/Chromium, snapshots, actions, uploads, profiles. +- [Canvas](https://docs.molt.bot/platforms/mac/canvas): [A2UI](https://docs.molt.bot/platforms/mac/canvas#canvas-a2ui) push/reset, eval, snapshot. +- [Nodes](https://docs.molt.bot/nodes): camera snap/clip, screen record, [location.get](https://docs.molt.bot/nodes/location-command), notifications. +- [Cron + wakeups](https://docs.molt.bot/automation/cron-jobs); [webhooks](https://docs.molt.bot/automation/webhook); [Gmail Pub/Sub](https://docs.molt.bot/automation/gmail-pubsub). +- [Skills platform](https://docs.molt.bot/tools/skills): bundled, managed, and workspace skills with install gating + UI. ### Runtime + safety -- [Channel routing](https://docs.clawd.bot/concepts/channel-routing), [retry policy](https://docs.clawd.bot/concepts/retry), and [streaming/chunking](https://docs.clawd.bot/concepts/streaming). -- [Presence](https://docs.clawd.bot/concepts/presence), [typing indicators](https://docs.clawd.bot/concepts/typing-indicators), and [usage tracking](https://docs.clawd.bot/concepts/usage-tracking). -- [Models](https://docs.clawd.bot/concepts/models), [model failover](https://docs.clawd.bot/concepts/model-failover), and [session pruning](https://docs.clawd.bot/concepts/session-pruning). -- [Security](https://docs.clawd.bot/gateway/security) and [troubleshooting](https://docs.clawd.bot/channels/troubleshooting). +- [Channel routing](https://docs.molt.bot/concepts/channel-routing), [retry policy](https://docs.molt.bot/concepts/retry), and [streaming/chunking](https://docs.molt.bot/concepts/streaming). +- [Presence](https://docs.molt.bot/concepts/presence), [typing indicators](https://docs.molt.bot/concepts/typing-indicators), and [usage tracking](https://docs.molt.bot/concepts/usage-tracking). +- [Models](https://docs.molt.bot/concepts/models), [model failover](https://docs.molt.bot/concepts/model-failover), and [session pruning](https://docs.molt.bot/concepts/session-pruning). +- [Security](https://docs.molt.bot/gateway/security) and [troubleshooting](https://docs.molt.bot/channels/troubleshooting). ### Ops + packaging -- [Control UI](https://docs.clawd.bot/web) + [WebChat](https://docs.clawd.bot/web/webchat) served directly from the Gateway. -- [Tailscale Serve/Funnel](https://docs.clawd.bot/gateway/tailscale) or [SSH tunnels](https://docs.clawd.bot/gateway/remote) with token/password auth. -- [Nix mode](https://docs.clawd.bot/install/nix) for declarative config; [Docker](https://docs.clawd.bot/install/docker)-based installs. -- [Doctor](https://docs.clawd.bot/gateway/doctor) migrations, [logging](https://docs.clawd.bot/logging). +- [Control UI](https://docs.molt.bot/web) + [WebChat](https://docs.molt.bot/web/webchat) served directly from the Gateway. +- [Tailscale Serve/Funnel](https://docs.molt.bot/gateway/tailscale) or [SSH tunnels](https://docs.molt.bot/gateway/remote) with token/password auth. +- [Nix mode](https://docs.molt.bot/install/nix) for declarative config; [Docker](https://docs.molt.bot/install/docker)-based installs. +- [Doctor](https://docs.molt.bot/gateway/doctor) migrations, [logging](https://docs.molt.bot/logging). ## How it works (short) @@ -187,12 +188,12 @@ WhatsApp / Telegram / Slack / Discord / Google Chat / Signal / iMessage / BlueBu ## Key subsystems -- **[Gateway WebSocket network](https://docs.clawd.bot/concepts/architecture)** — single WS control plane for clients, tools, and events (plus ops: [Gateway runbook](https://docs.clawd.bot/gateway)). -- **[Tailscale exposure](https://docs.clawd.bot/gateway/tailscale)** — Serve/Funnel for the Gateway dashboard + WS (remote access: [Remote](https://docs.clawd.bot/gateway/remote)). -- **[Browser control](https://docs.clawd.bot/tools/browser)** — clawd‑managed Chrome/Chromium with CDP control. -- **[Canvas + A2UI](https://docs.clawd.bot/platforms/mac/canvas)** — agent‑driven visual workspace (A2UI host: [Canvas/A2UI](https://docs.clawd.bot/platforms/mac/canvas#canvas-a2ui)). -- **[Voice Wake](https://docs.clawd.bot/nodes/voicewake) + [Talk Mode](https://docs.clawd.bot/nodes/talk)** — always‑on speech and continuous conversation. -- **[Nodes](https://docs.clawd.bot/nodes)** — Canvas, camera snap/clip, screen record, `location.get`, notifications, plus macOS‑only `system.run`/`system.notify`. +- **[Gateway WebSocket network](https://docs.molt.bot/concepts/architecture)** — single WS control plane for clients, tools, and events (plus ops: [Gateway runbook](https://docs.molt.bot/gateway)). +- **[Tailscale exposure](https://docs.molt.bot/gateway/tailscale)** — Serve/Funnel for the Gateway dashboard + WS (remote access: [Remote](https://docs.molt.bot/gateway/remote)). +- **[Browser control](https://docs.molt.bot/tools/browser)** — clawd‑managed Chrome/Chromium with CDP control. +- **[Canvas + A2UI](https://docs.molt.bot/platforms/mac/canvas)** — agent‑driven visual workspace (A2UI host: [Canvas/A2UI](https://docs.molt.bot/platforms/mac/canvas#canvas-a2ui)). +- **[Voice Wake](https://docs.molt.bot/nodes/voicewake) + [Talk Mode](https://docs.molt.bot/nodes/talk)** — always‑on speech and continuous conversation. +- **[Nodes](https://docs.molt.bot/nodes)** — Canvas, camera snap/clip, screen record, `location.get`, notifications, plus macOS‑only `system.run`/`system.notify`. ## Tailscale access (Gateway dashboard) @@ -208,7 +209,7 @@ Notes: - Funnel refuses to start unless `gateway.auth.mode: "password"` is set. - Optional: `gateway.tailscale.resetOnExit` to undo Serve/Funnel on shutdown. -Details: [Tailscale guide](https://docs.clawd.bot/gateway/tailscale) · [Web surfaces](https://docs.clawd.bot/web) +Details: [Tailscale guide](https://docs.molt.bot/gateway/tailscale) · [Web surfaces](https://docs.molt.bot/web) ## Remote Gateway (Linux is great) @@ -218,7 +219,7 @@ It’s perfectly fine to run the Gateway on a small Linux instance. Clients (mac - **Device nodes** run device‑local actions (`system.run`, camera, screen recording, notifications) via `node.invoke`. In short: exec runs where the Gateway lives; device actions run where the device lives. -Details: [Remote access](https://docs.clawd.bot/gateway/remote) · [Nodes](https://docs.clawd.bot/nodes) · [Security](https://docs.clawd.bot/gateway/security) +Details: [Remote access](https://docs.molt.bot/gateway/remote) · [Nodes](https://docs.molt.bot/nodes) · [Security](https://docs.molt.bot/gateway/security) ## macOS permissions via the Gateway protocol @@ -233,7 +234,7 @@ Elevated bash (host permissions) is separate from macOS TCC: - Use `/elevated on|off` to toggle per‑session elevated access when enabled + allowlisted. - Gateway persists the per‑session toggle via `sessions.patch` (WS method) alongside `thinkingLevel`, `verboseLevel`, `model`, `sendPolicy`, and `groupActivation`. -Details: [Nodes](https://docs.clawd.bot/nodes) · [macOS app](https://docs.clawd.bot/platforms/macos) · [Gateway protocol](https://docs.clawd.bot/concepts/architecture) +Details: [Nodes](https://docs.molt.bot/nodes) · [macOS app](https://docs.molt.bot/platforms/macos) · [Gateway protocol](https://docs.molt.bot/concepts/architecture) ## Agent to Agent (sessions_* tools) @@ -242,7 +243,7 @@ Details: [Nodes](https://docs.clawd.bot/nodes) · [macOS app](https://docs.clawd - `sessions_history` — fetch transcript logs for a session. - `sessions_send` — message another session; optional reply‑back ping‑pong + announce step (`REPLY_SKIP`, `ANNOUNCE_SKIP`). -Details: [Session tools](https://docs.clawd.bot/concepts/session-tool) +Details: [Session tools](https://docs.molt.bot/concepts/session-tool) ## Skills registry (ClawdHub) @@ -284,13 +285,13 @@ Note: signed builds required for macOS permissions to stick across rebuilds (see - Voice trigger forwarding + Canvas surface. - Controlled via `clawdbot nodes …`. -Runbook: [iOS connect](https://docs.clawd.bot/platforms/ios). +Runbook: [iOS connect](https://docs.molt.bot/platforms/ios). ### Android node (optional) - Pairs via the same Bridge + pairing flow as iOS. - Exposes Canvas, Camera, and Screen capture commands. -- Runbook: [Android connect](https://docs.clawd.bot/platforms/android). +- Runbook: [Android connect](https://docs.molt.bot/platforms/android). ## Agent workspace + skills @@ -310,7 +311,7 @@ Minimal `~/.clawdbot/clawdbot.json` (model + defaults): } ``` -[Full configuration reference (all keys + examples).](https://docs.clawd.bot/gateway/configuration) +[Full configuration reference (all keys + examples).](https://docs.molt.bot/gateway/configuration) ## Security model (important) @@ -318,15 +319,15 @@ Minimal `~/.clawdbot/clawdbot.json` (model + defaults): - **Group/channel safety:** set `agents.defaults.sandbox.mode: "non-main"` to run **non‑main sessions** (groups/channels) inside per‑session Docker sandboxes; bash then runs in Docker for those sessions. - **Sandbox defaults:** allowlist `bash`, `process`, `read`, `write`, `edit`, `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`; denylist `browser`, `canvas`, `nodes`, `cron`, `discord`, `gateway`. -Details: [Security guide](https://docs.clawd.bot/gateway/security) · [Docker + sandboxing](https://docs.clawd.bot/install/docker) · [Sandbox config](https://docs.clawd.bot/gateway/configuration) +Details: [Security guide](https://docs.molt.bot/gateway/security) · [Docker + sandboxing](https://docs.molt.bot/install/docker) · [Sandbox config](https://docs.molt.bot/gateway/configuration) -### [WhatsApp](https://docs.clawd.bot/channels/whatsapp) +### [WhatsApp](https://docs.molt.bot/channels/whatsapp) - Link the device: `pnpm clawdbot channels login` (stores creds in `~/.clawdbot/credentials`). - Allowlist who can talk to the assistant via `channels.whatsapp.allowFrom`. - If `channels.whatsapp.groups` is set, it becomes a group allowlist; include `"*"` to allow all. -### [Telegram](https://docs.clawd.bot/channels/telegram) +### [Telegram](https://docs.molt.bot/channels/telegram) - Set `TELEGRAM_BOT_TOKEN` or `channels.telegram.botToken` (env wins). - Optional: set `channels.telegram.groups` (with `channels.telegram.groups."*".requireMention`); when set, it is a group allowlist (include `"*"` to allow all). Also `channels.telegram.allowFrom` or `channels.telegram.webhookUrl` as needed. @@ -341,11 +342,11 @@ Details: [Security guide](https://docs.clawd.bot/gateway/security) · [Docker + } ``` -### [Slack](https://docs.clawd.bot/channels/slack) +### [Slack](https://docs.molt.bot/channels/slack) - Set `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` (or `channels.slack.botToken` + `channels.slack.appToken`). -### [Discord](https://docs.clawd.bot/channels/discord) +### [Discord](https://docs.molt.bot/channels/discord) - Set `DISCORD_BOT_TOKEN` or `channels.discord.token` (env wins). - Optional: set `commands.native`, `commands.text`, or `commands.useAccessGroups`, plus `channels.discord.dm.allowFrom`, `channels.discord.guilds`, or `channels.discord.mediaMaxMb` as needed. @@ -360,21 +361,21 @@ Details: [Security guide](https://docs.clawd.bot/gateway/security) · [Docker + } ``` -### [Signal](https://docs.clawd.bot/channels/signal) +### [Signal](https://docs.molt.bot/channels/signal) - Requires `signal-cli` and a `channels.signal` config section. -### [iMessage](https://docs.clawd.bot/channels/imessage) +### [iMessage](https://docs.molt.bot/channels/imessage) - macOS only; Messages must be signed in. - If `channels.imessage.groups` is set, it becomes a group allowlist; include `"*"` to allow all. -### [Microsoft Teams](https://docs.clawd.bot/channels/msteams) +### [Microsoft Teams](https://docs.molt.bot/channels/msteams) - Configure a Teams app + Bot Framework, then add a `msteams` config section. - Allowlist who can talk via `msteams.allowFrom`; group access via `msteams.groupAllowFrom` or `msteams.groupPolicy: "open"`. -### [WebChat](https://docs.clawd.bot/web/webchat) +### [WebChat](https://docs.molt.bot/web/webchat) - Uses the Gateway WebSocket; no separate WebChat port/config. @@ -392,69 +393,69 @@ Browser control (optional): ## Docs Use these when you’re past the onboarding flow and want the deeper reference. -- [Start with the docs index for navigation and “what’s where.”](https://docs.clawd.bot) -- [Read the architecture overview for the gateway + protocol model.](https://docs.clawd.bot/concepts/architecture) -- [Use the full configuration reference when you need every key and example.](https://docs.clawd.bot/gateway/configuration) -- [Run the Gateway by the book with the operational runbook.](https://docs.clawd.bot/gateway) -- [Learn how the Control UI/Web surfaces work and how to expose them safely.](https://docs.clawd.bot/web) -- [Understand remote access over SSH tunnels or tailnets.](https://docs.clawd.bot/gateway/remote) -- [Follow the onboarding wizard flow for a guided setup.](https://docs.clawd.bot/start/wizard) -- [Wire external triggers via the webhook surface.](https://docs.clawd.bot/automation/webhook) -- [Set up Gmail Pub/Sub triggers.](https://docs.clawd.bot/automation/gmail-pubsub) -- [Learn the macOS menu bar companion details.](https://docs.clawd.bot/platforms/mac/menu-bar) -- [Platform guides: Windows (WSL2)](https://docs.clawd.bot/platforms/windows), [Linux](https://docs.clawd.bot/platforms/linux), [macOS](https://docs.clawd.bot/platforms/macos), [iOS](https://docs.clawd.bot/platforms/ios), [Android](https://docs.clawd.bot/platforms/android) -- [Debug common failures with the troubleshooting guide.](https://docs.clawd.bot/channels/troubleshooting) -- [Review security guidance before exposing anything.](https://docs.clawd.bot/gateway/security) +- [Start with the docs index for navigation and “what’s where.”](https://docs.molt.bot) +- [Read the architecture overview for the gateway + protocol model.](https://docs.molt.bot/concepts/architecture) +- [Use the full configuration reference when you need every key and example.](https://docs.molt.bot/gateway/configuration) +- [Run the Gateway by the book with the operational runbook.](https://docs.molt.bot/gateway) +- [Learn how the Control UI/Web surfaces work and how to expose them safely.](https://docs.molt.bot/web) +- [Understand remote access over SSH tunnels or tailnets.](https://docs.molt.bot/gateway/remote) +- [Follow the onboarding wizard flow for a guided setup.](https://docs.molt.bot/start/wizard) +- [Wire external triggers via the webhook surface.](https://docs.molt.bot/automation/webhook) +- [Set up Gmail Pub/Sub triggers.](https://docs.molt.bot/automation/gmail-pubsub) +- [Learn the macOS menu bar companion details.](https://docs.molt.bot/platforms/mac/menu-bar) +- [Platform guides: Windows (WSL2)](https://docs.molt.bot/platforms/windows), [Linux](https://docs.molt.bot/platforms/linux), [macOS](https://docs.molt.bot/platforms/macos), [iOS](https://docs.molt.bot/platforms/ios), [Android](https://docs.molt.bot/platforms/android) +- [Debug common failures with the troubleshooting guide.](https://docs.molt.bot/channels/troubleshooting) +- [Review security guidance before exposing anything.](https://docs.molt.bot/gateway/security) ## Advanced docs (discovery + control) -- [Discovery + transports](https://docs.clawd.bot/gateway/discovery) -- [Bonjour/mDNS](https://docs.clawd.bot/gateway/bonjour) -- [Gateway pairing](https://docs.clawd.bot/gateway/pairing) -- [Remote gateway README](https://docs.clawd.bot/gateway/remote-gateway-readme) -- [Control UI](https://docs.clawd.bot/web/control-ui) -- [Dashboard](https://docs.clawd.bot/web/dashboard) +- [Discovery + transports](https://docs.molt.bot/gateway/discovery) +- [Bonjour/mDNS](https://docs.molt.bot/gateway/bonjour) +- [Gateway pairing](https://docs.molt.bot/gateway/pairing) +- [Remote gateway README](https://docs.molt.bot/gateway/remote-gateway-readme) +- [Control UI](https://docs.molt.bot/web/control-ui) +- [Dashboard](https://docs.molt.bot/web/dashboard) ## Operations & troubleshooting -- [Health checks](https://docs.clawd.bot/gateway/health) -- [Gateway lock](https://docs.clawd.bot/gateway/gateway-lock) -- [Background process](https://docs.clawd.bot/gateway/background-process) -- [Browser troubleshooting (Linux)](https://docs.clawd.bot/tools/browser-linux-troubleshooting) -- [Logging](https://docs.clawd.bot/logging) +- [Health checks](https://docs.molt.bot/gateway/health) +- [Gateway lock](https://docs.molt.bot/gateway/gateway-lock) +- [Background process](https://docs.molt.bot/gateway/background-process) +- [Browser troubleshooting (Linux)](https://docs.molt.bot/tools/browser-linux-troubleshooting) +- [Logging](https://docs.molt.bot/logging) ## Deep dives -- [Agent loop](https://docs.clawd.bot/concepts/agent-loop) -- [Presence](https://docs.clawd.bot/concepts/presence) -- [TypeBox schemas](https://docs.clawd.bot/concepts/typebox) -- [RPC adapters](https://docs.clawd.bot/reference/rpc) -- [Queue](https://docs.clawd.bot/concepts/queue) +- [Agent loop](https://docs.molt.bot/concepts/agent-loop) +- [Presence](https://docs.molt.bot/concepts/presence) +- [TypeBox schemas](https://docs.molt.bot/concepts/typebox) +- [RPC adapters](https://docs.molt.bot/reference/rpc) +- [Queue](https://docs.molt.bot/concepts/queue) ## Workspace & skills -- [Skills config](https://docs.clawd.bot/tools/skills-config) -- [Default AGENTS](https://docs.clawd.bot/reference/AGENTS.default) -- [Templates: AGENTS](https://docs.clawd.bot/reference/templates/AGENTS) -- [Templates: BOOTSTRAP](https://docs.clawd.bot/reference/templates/BOOTSTRAP) -- [Templates: IDENTITY](https://docs.clawd.bot/reference/templates/IDENTITY) -- [Templates: SOUL](https://docs.clawd.bot/reference/templates/SOUL) -- [Templates: TOOLS](https://docs.clawd.bot/reference/templates/TOOLS) -- [Templates: USER](https://docs.clawd.bot/reference/templates/USER) +- [Skills config](https://docs.molt.bot/tools/skills-config) +- [Default AGENTS](https://docs.molt.bot/reference/AGENTS.default) +- [Templates: AGENTS](https://docs.molt.bot/reference/templates/AGENTS) +- [Templates: BOOTSTRAP](https://docs.molt.bot/reference/templates/BOOTSTRAP) +- [Templates: IDENTITY](https://docs.molt.bot/reference/templates/IDENTITY) +- [Templates: SOUL](https://docs.molt.bot/reference/templates/SOUL) +- [Templates: TOOLS](https://docs.molt.bot/reference/templates/TOOLS) +- [Templates: USER](https://docs.molt.bot/reference/templates/USER) ## Platform internals -- [macOS dev setup](https://docs.clawd.bot/platforms/mac/dev-setup) -- [macOS menu bar](https://docs.clawd.bot/platforms/mac/menu-bar) -- [macOS voice wake](https://docs.clawd.bot/platforms/mac/voicewake) -- [iOS node](https://docs.clawd.bot/platforms/ios) -- [Android node](https://docs.clawd.bot/platforms/android) -- [Windows (WSL2)](https://docs.clawd.bot/platforms/windows) -- [Linux app](https://docs.clawd.bot/platforms/linux) +- [macOS dev setup](https://docs.molt.bot/platforms/mac/dev-setup) +- [macOS menu bar](https://docs.molt.bot/platforms/mac/menu-bar) +- [macOS voice wake](https://docs.molt.bot/platforms/mac/voicewake) +- [iOS node](https://docs.molt.bot/platforms/ios) +- [Android node](https://docs.molt.bot/platforms/android) +- [Windows (WSL2)](https://docs.molt.bot/platforms/windows) +- [Linux app](https://docs.molt.bot/platforms/linux) ## Email hooks (Gmail) -- [docs.clawd.bot/gmail-pubsub](https://docs.clawd.bot/automation/gmail-pubsub) +- [docs.molt.bot/gmail-pubsub](https://docs.molt.bot/automation/gmail-pubsub) ## Clawd diff --git a/SECURITY.md b/SECURITY.md index 5bc9c9112..1d0849a54 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,7 +11,7 @@ If you believe you've found a security issue in Clawdbot, please report it priva For threat model + hardening guidance (including `clawdbot security audit --deep` and `--fix`), see: -- `https://docs.clawd.bot/gateway/security` +- `https://docs.molt.bot/gateway/security` ### Web Interface Safety diff --git a/appcast.xml b/appcast.xml index 8158ac244..df325a7b6 100644 --- a/appcast.xml +++ b/appcast.xml @@ -28,28 +28,28 @@ Clawdbot 2026.1.24

Highlights

Changes

@@ -61,10 +61,10 @@
  • Web UI: hide internal message_id hints in chat bubbles.
  • Gateway: allow Control UI token-only auth to skip device pairing even when device identity is present (gateway.controlUi.allowInsecureAuth). (#1679) Thanks @steipete.
  • Matrix: decrypt E2EE media attachments with preflight size guard. (#1744) Thanks @araa47.
  • -
  • BlueBubbles: route phone-number targets to DMs, avoid leaking routing IDs, and auto-create missing DMs (Private API required). (#1751) Thanks @tyler6204. https://docs.clawd.bot/channels/bluebubbles
  • +
  • BlueBubbles: route phone-number targets to DMs, avoid leaking routing IDs, and auto-create missing DMs (Private API required). (#1751) Thanks @tyler6204. https://docs.molt.bot/channels/bluebubbles
  • BlueBubbles: keep part-index GUIDs in reply tags when short IDs are missing.
  • Signal: repair reaction sends (group/UUID targets + CLI author flags). (#1651) Thanks @vilkasdev.
  • -
  • Signal: add configurable signal-cli startup timeout + external daemon mode docs. (#1677) https://docs.clawd.bot/channels/signal
  • +
  • Signal: add configurable signal-cli startup timeout + external daemon mode docs. (#1677) https://docs.molt.bot/channels/signal
  • Telegram: set fetch duplex="half" for uploads on Node 22 to avoid sendPhoto failures. (#1684) Thanks @commdata2338.
  • Telegram: use wrapped fetch for long-polling on Node to normalize AbortSignal handling. (#1639)
  • Telegram: honor per-account proxy for outbound API calls. (#1774) Thanks @radek-paclt.
  • diff --git a/apps/macos/Sources/Clawdbot/CLIInstaller.swift b/apps/macos/Sources/Clawdbot/CLIInstaller.swift index b9113e27a..c020ccef9 100644 --- a/apps/macos/Sources/Clawdbot/CLIInstaller.swift +++ b/apps/macos/Sources/Clawdbot/CLIInstaller.swift @@ -70,7 +70,7 @@ enum CLIInstaller { let escapedVersion = self.shellEscape(version) let escapedPrefix = self.shellEscape(prefix) let script = """ - curl -fsSL https://clawd.bot/install-cli.sh | \ + curl -fsSL https://molt.bot/install-cli.sh | \ bash -s -- --json --no-onboard --prefix \(escapedPrefix) --version \(escapedVersion) """ return ["/bin/bash", "-lc", script] diff --git a/assets/chrome-extension/options.html b/assets/chrome-extension/options.html index f66608f43..7cd4e27ce 100644 --- a/assets/chrome-extension/options.html +++ b/assets/chrome-extension/options.html @@ -171,7 +171,7 @@ Start Clawdbot’s browser relay on this machine (Gateway or node host), then click the toolbar button again.

    - Full guide (install, remote Gateway, security): docs.clawd.bot/tools/chrome-extension + Full guide (install, remote Gateway, security): docs.molt.bot/tools/chrome-extension

    diff --git a/docker-setup.sh b/docker-setup.sh index 776541827..906bbb09c 100755 --- a/docker-setup.sh +++ b/docker-setup.sh @@ -191,7 +191,7 @@ echo "Telegram (bot token):" echo " ${COMPOSE_HINT} run --rm clawdbot-cli providers add --provider telegram --token " echo "Discord (bot token):" echo " ${COMPOSE_HINT} run --rm clawdbot-cli providers add --provider discord --token " -echo "Docs: https://docs.clawd.bot/providers" +echo "Docs: https://docs.molt.bot/providers" echo "" echo "==> Starting gateway" diff --git a/docs/CNAME b/docs/CNAME index afc13c7fe..43ca6ac7f 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -clawdbot.com +docs.molt.bot diff --git a/docs/channels/googlechat.md b/docs/channels/googlechat.md index 00cfa7c72..298e6f9ab 100644 --- a/docs/channels/googlechat.md +++ b/docs/channels/googlechat.md @@ -25,7 +25,7 @@ Status: ready for DMs + spaces via Google Chat API webhooks (HTTP only). 5) Create a Google Chat app in the [Google Cloud Console Chat Configuration](https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat): - Fill in the **Application info**: - **App name**: (e.g. `Clawdbot`) - - **Avatar URL**: (e.g. `https://clawd.bot/logo.png`) + - **Avatar URL**: (e.g. `https://molt.bot/logo.png`) - **Description**: (e.g. `Personal AI Assistant`) - Enable **Interactive features**. - Under **Functionality**, check **Join spaces and group conversations**. diff --git a/docs/cli/browser.md b/docs/cli/browser.md index 6d54b8a10..d0f1d5a7d 100644 --- a/docs/cli/browser.md +++ b/docs/cli/browser.md @@ -53,7 +53,7 @@ clawdbot browser --browser-profile work tabs ```bash clawdbot browser tabs -clawdbot browser open https://docs.clawd.bot +clawdbot browser open https://docs.molt.bot clawdbot browser focus clawdbot browser close ``` diff --git a/docs/cli/hooks.md b/docs/cli/hooks.md index 825550b05..ee867be69 100644 --- a/docs/cli/hooks.md +++ b/docs/cli/hooks.md @@ -85,7 +85,7 @@ Details: Source: clawdbot-bundled Path: /path/to/clawdbot/hooks/bundled/session-memory/HOOK.md Handler: /path/to/clawdbot/hooks/bundled/session-memory/handler.ts - Homepage: https://docs.clawd.bot/hooks#session-memory + Homepage: https://docs.molt.bot/hooks#session-memory Events: command:new Requirements: diff --git a/docs/concepts/markdown-formatting.md b/docs/concepts/markdown-formatting.md index 91799a3e9..5c92669d2 100644 --- a/docs/concepts/markdown-formatting.md +++ b/docs/concepts/markdown-formatting.md @@ -39,7 +39,7 @@ stay consistent across channels. Input Markdown: ```markdown -Hello **world** — see [docs](https://docs.clawd.bot). +Hello **world** — see [docs](https://docs.molt.bot). ``` IR (schematic): @@ -51,7 +51,7 @@ IR (schematic): { "start": 6, "end": 11, "style": "bold" } ], "links": [ - { "start": 19, "end": 23, "href": "https://docs.clawd.bot" } + { "start": 19, "end": 23, "href": "https://docs.molt.bot" } ] } ``` diff --git a/docs/gateway/security/index.md b/docs/gateway/security/index.md index 5f5990b9e..9b9090d36 100644 --- a/docs/gateway/security/index.md +++ b/docs/gateway/security/index.md @@ -750,7 +750,7 @@ Mario asking for find ~ Found a vulnerability in Clawdbot? Please report responsibly: -1. Email: security@clawd.bot +1. Email: security@molt.bot 2. Don't post publicly until fixed 3. We'll credit you (unless you prefer anonymity) diff --git a/docs/gateway/troubleshooting.md b/docs/gateway/troubleshooting.md index 697654b80..4f192b40f 100644 --- a/docs/gateway/troubleshooting.md +++ b/docs/gateway/troubleshooting.md @@ -501,12 +501,12 @@ upgrades in place and rewrites the gateway service to point at the new install. Switch **to git install**: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git --no-onboard +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git --no-onboard ``` Switch **to npm global**: ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` Notes: diff --git a/docs/help/faq.md b/docs/help/faq.md index 554597165..55db3e637 100644 --- a/docs/help/faq.md +++ b/docs/help/faq.md @@ -18,7 +18,7 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS, - [It is stuck on "wake up my friend" / onboarding will not hatch. What now?](#it-is-stuck-on-wake-up-my-friend-onboarding-will-not-hatch-what-now) - [Can I migrate my setup to a new machine (Mac mini) without redoing onboarding?](#can-i-migrate-my-setup-to-a-new-machine-mac-mini-without-redoing-onboarding) - [Where do I see what’s new in the latest version?](#where-do-i-see-whats-new-in-the-latest-version) - - [I can't access docs.clawd.bot (SSL error). What now?](#i-cant-access-docsclawdbot-ssl-error-what-now) + - [I can't access docs.molt.bot (SSL error). What now?](#i-cant-access-docsclawdbot-ssl-error-what-now) - [What’s the difference between stable and beta?](#whats-the-difference-between-stable-and-beta) - [How do I install the beta version, and what’s the difference between beta and dev?](#how-do-i-install-the-beta-version-and-whats-the-difference-between-beta-and-dev) - [How do I try the latest bits?](#how-do-i-try-the-latest-bits) @@ -258,7 +258,7 @@ setup (PATH, services, permissions, auth files). Give them the **full source che the hackable (git) install: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git ``` This installs Clawdbot **from a git checkout**, so the agent can read the code + docs and @@ -296,7 +296,7 @@ Install docs: [Install](/install), [Installer flags](/install/installer), [Updat The repo recommends running from source and using the onboarding wizard: ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash clawdbot onboard --install-daemon ``` @@ -416,8 +416,8 @@ section is the latest shipped version. Entries are grouped by **Highlights**, ** ### I cant access docsclawdbot SSL error What now -Some Comcast/Xfinity connections incorrectly block `docs.clawd.bot` via Xfinity -Advanced Security. Disable it or allowlist `docs.clawd.bot`, then retry. More +Some Comcast/Xfinity connections incorrectly block `docs.molt.bot` via Xfinity +Advanced Security. Disable it or allowlist `docs.molt.bot`, then retry. More detail: [Troubleshooting](/help/troubleshooting#docsclawdbot-shows-an-ssl-error-comcastxfinity). Please help us unblock it by reporting here: https://spa.xfinity.com/check_url_status. @@ -445,15 +445,15 @@ https://github.com/clawdbot/clawdbot/blob/main/CHANGELOG.md One‑liners (macOS/Linux): ```bash -curl -fsSL --proto '=https' --tlsv1.2 https://clawd.bot/install.sh | bash -s -- --beta +curl -fsSL --proto '=https' --tlsv1.2 https://molt.bot/install.sh | bash -s -- --beta ``` ```bash -curl -fsSL --proto '=https' --tlsv1.2 https://clawd.bot/install.sh | bash -s -- --install-method git +curl -fsSL --proto '=https' --tlsv1.2 https://molt.bot/install.sh | bash -s -- --install-method git ``` Windows installer (PowerShell): -https://clawd.bot/install.ps1 +https://molt.bot/install.ps1 More detail: [Development channels](/install/development-channels) and [Installer flags](/install/installer). @@ -478,7 +478,7 @@ This switches to the `main` branch and updates from source. 2) **Hackable install (from the installer site):** ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git ``` That gives you a local repo you can edit, then update via git. @@ -498,19 +498,19 @@ Docs: [Update](/cli/update), [Development channels](/install/development-channel Re-run the installer with **verbose output**: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --verbose +curl -fsSL https://molt.bot/install.sh | bash -s -- --verbose ``` Beta install with verbose: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --beta --verbose +curl -fsSL https://molt.bot/install.sh | bash -s -- --beta --verbose ``` For a hackable (git) install: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git --verbose +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git --verbose ``` More options: [Installer flags](/install/installer). @@ -541,7 +541,7 @@ Use the **hackable (git) install** so you have the full source and docs locally, your bot (or Claude/Codex) *from that folder* so it can read the repo and answer precisely. ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git ``` More detail: [Install](/install) and [Installer flags](/install/installer). @@ -946,7 +946,7 @@ Advantages: - **Always-on Gateway** (run on a VPS, interact from anywhere) - **Nodes** for local browser/screen/camera/exec -Showcase: https://clawd.bot/showcase +Showcase: https://molt.bot/showcase ## Skills and automation diff --git a/docs/help/troubleshooting.md b/docs/help/troubleshooting.md index 4a7d2ced3..b142de4eb 100644 --- a/docs/help/troubleshooting.md +++ b/docs/help/troubleshooting.md @@ -38,13 +38,13 @@ Almost always a Node/npm PATH issue. Start here: Re-run the installer in verbose mode to see the full trace and npm output: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --verbose +curl -fsSL https://molt.bot/install.sh | bash -s -- --verbose ``` For beta installs: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --beta --verbose +curl -fsSL https://molt.bot/install.sh | bash -s -- --beta --verbose ``` You can also set `CLAWDBOT_VERBOSE=1` instead of the flag. @@ -59,10 +59,10 @@ You can also set `CLAWDBOT_VERBOSE=1` instead of the flag. - [Gateway troubleshooting](/gateway/troubleshooting) - [Control UI](/web/control-ui#insecure-http) -### `docs.clawd.bot` shows an SSL error (Comcast/Xfinity) +### `docs.molt.bot` shows an SSL error (Comcast/Xfinity) -Some Comcast/Xfinity connections block `docs.clawd.bot` via Xfinity Advanced Security. -Disable Advanced Security or add `docs.clawd.bot` to the allowlist, then retry. +Some Comcast/Xfinity connections block `docs.molt.bot` via Xfinity Advanced Security. +Disable Advanced Security or add `docs.molt.bot` to the allowlist, then retry. - Xfinity Advanced Security help: https://www.xfinity.com/support/articles/using-xfinity-xfi-advanced-security - Quick sanity checks: try a mobile hotspot or VPN to confirm it’s ISP-level filtering diff --git a/docs/hooks.md b/docs/hooks.md index 9870dda88..880c31f19 100644 --- a/docs/hooks.md +++ b/docs/hooks.md @@ -124,7 +124,7 @@ The `HOOK.md` file contains metadata in YAML frontmatter plus Markdown documenta --- name: my-hook description: "Short description of what this hook does" -homepage: https://docs.clawd.bot/hooks#my-hook +homepage: https://docs.molt.bot/hooks#my-hook metadata: {"clawdbot":{"emoji":"🔗","events":["command:new"],"requires":{"bins":["node"]}}} --- diff --git a/docs/install/index.md b/docs/install/index.md index 7ccab0ca8..f5f5b7476 100644 --- a/docs/install/index.md +++ b/docs/install/index.md @@ -12,13 +12,13 @@ Use the installer unless you have a reason not to. It sets up the CLI and runs o ## Quick install (recommended) ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` Windows (PowerShell): ```powershell -iwr -useb https://clawd.bot/install.ps1 | iex +iwr -useb https://molt.bot/install.ps1 | iex ``` Next step (if you skipped onboarding): @@ -40,13 +40,13 @@ clawdbot onboard --install-daemon Installs `clawdbot` globally via npm and runs onboarding. ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` Installer flags: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --help +curl -fsSL https://molt.bot/install.sh | bash -s -- --help ``` Details: [Installer internals](/install/installer). @@ -54,7 +54,7 @@ Details: [Installer internals](/install/installer). Non-interactive (skip onboarding): ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --no-onboard +curl -fsSL https://molt.bot/install.sh | bash -s -- --no-onboard ``` ### 2) Global install (manual) @@ -123,10 +123,10 @@ The installer supports two methods: ```bash # Explicit npm -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method npm +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method npm # Install from GitHub (source checkout) -curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git +curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git ``` Common flags: diff --git a/docs/install/installer.md b/docs/install/installer.md index 7cd485756..d60f972d4 100644 --- a/docs/install/installer.md +++ b/docs/install/installer.md @@ -1,29 +1,29 @@ --- summary: "How the installer scripts work (install.sh + install-cli.sh), flags, and automation" read_when: - - You want to understand `clawd.bot/install.sh` + - You want to understand `molt.bot/install.sh` - You want to automate installs (CI / headless) - You want to install from a GitHub checkout --- # Installer internals -Clawdbot ships two installer scripts (served from `clawd.bot`): +Clawdbot ships two installer scripts (served from `molt.bot`): -- `https://clawd.bot/install.sh` — “recommended” installer (global npm install by default; can also install from a GitHub checkout) -- `https://clawd.bot/install-cli.sh` — non-root-friendly CLI installer (installs into a prefix with its own Node) - - `https://clawd.bot/install.ps1` — Windows PowerShell installer (npm by default; optional git install) +- `https://molt.bot/install.sh` — “recommended” installer (global npm install by default; can also install from a GitHub checkout) +- `https://molt.bot/install-cli.sh` — non-root-friendly CLI installer (installs into a prefix with its own Node) + - `https://molt.bot/install.ps1` — Windows PowerShell installer (npm by default; optional git install) To see the current flags/behavior, run: ```bash -curl -fsSL https://clawd.bot/install.sh | bash -s -- --help +curl -fsSL https://molt.bot/install.sh | bash -s -- --help ``` Windows (PowerShell) help: ```powershell -& ([scriptblock]::Create((iwr -useb https://clawd.bot/install.ps1))) -? +& ([scriptblock]::Create((iwr -useb https://molt.bot/install.ps1))) -? ``` If the installer completes but `clawdbot` is not found in a new terminal, it’s usually a Node/npm PATH issue. See: [Install](/install#nodejs--npm-path-sanity). @@ -45,7 +45,7 @@ What it does (high level): If you *want* `sharp` to link against a globally-installed libvips (or you’re debugging), set: ```bash -SHARP_IGNORE_GLOBAL_LIBVIPS=0 curl -fsSL https://clawd.bot/install.sh | bash +SHARP_IGNORE_GLOBAL_LIBVIPS=0 curl -fsSL https://molt.bot/install.sh | bash ``` ### Discoverability / “git install” prompt @@ -78,7 +78,7 @@ This script installs `clawdbot` into a prefix (default: `~/.clawdbot`) and also Help: ```bash -curl -fsSL https://clawd.bot/install-cli.sh | bash -s -- --help +curl -fsSL https://molt.bot/install-cli.sh | bash -s -- --help ``` ## install.ps1 (Windows PowerShell) @@ -94,15 +94,15 @@ What it does (high level): Examples: ```powershell -iwr -useb https://clawd.bot/install.ps1 | iex +iwr -useb https://molt.bot/install.ps1 | iex ``` ```powershell -iwr -useb https://clawd.bot/install.ps1 | iex -InstallMethod git +iwr -useb https://molt.bot/install.ps1 | iex -InstallMethod git ``` ```powershell -iwr -useb https://clawd.bot/install.ps1 | iex -InstallMethod git -GitDir "C:\\clawdbot" +iwr -useb https://molt.bot/install.ps1 | iex -InstallMethod git -GitDir "C:\\clawdbot" ``` Environment variables: diff --git a/docs/install/uninstall.md b/docs/install/uninstall.md index 5849a6780..1c8e65919 100644 --- a/docs/install/uninstall.md +++ b/docs/install/uninstall.md @@ -113,7 +113,7 @@ If you used a profile, delete the matching task name and `~\.clawdbot-\ ### Normal install (install.sh / npm / pnpm / bun) -If you used `https://clawd.bot/install.sh` or `install.ps1`, the CLI was installed with `npm install -g clawdbot@latest`. +If you used `https://molt.bot/install.sh` or `install.ps1`, the CLI was installed with `npm install -g clawdbot@latest`. Remove it with `npm rm -g clawdbot` (or `pnpm remove -g` / `bun remove -g` if you installed that way). ### Source checkout (git clone) diff --git a/docs/install/updating.md b/docs/install/updating.md index 1d39fa6e4..6cca10566 100644 --- a/docs/install/updating.md +++ b/docs/install/updating.md @@ -1,32 +1,33 @@ --- -summary: "Updating Clawdbot safely (global install or source), plus rollback strategy" +summary: "Updating Moltbot safely (global install or source), plus rollback strategy" read_when: - - Updating Clawdbot + - Updating Moltbot - Something breaks after an update --- # Updating -Clawdbot is moving fast (pre “1.0”). Treat updates like shipping infra: update → run checks → restart (or use `clawdbot update`, which restarts) → verify. +Moltbot is moving fast (pre “1.0”). Treat updates like shipping infra: update → run checks → restart (or use `moltbot update`, which restarts) → verify. ## Recommended: re-run the website installer (upgrade in place) The **preferred** update path is to re-run the installer from the website. It -detects existing installs, upgrades in place, and runs `clawdbot doctor` when +detects existing installs, upgrades in place, and runs `moltbot doctor` when needed. ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` Notes: - Add `--no-onboard` if you don’t want the onboarding wizard to run again. - For **source installs**, use: ```bash - curl -fsSL https://clawd.bot/install.sh | bash -s -- --install-method git --no-onboard + curl -fsSL https://molt.bot/install.sh | bash -s -- --install-method git --no-onboard ``` The installer will `git pull --rebase` **only** if the repo is clean. -- For **global installs**, the script uses `npm install -g clawdbot@latest` under the hood. +- For **global installs**, the script uses `npm install -g moltbot@latest` under the hood. +- Legacy note: `clawdbot` remains available as a compatibility shim. ## Before you update @@ -42,20 +43,20 @@ Notes: Global install (pick one): ```bash -npm i -g clawdbot@latest +npm i -g moltbot@latest ``` ```bash -pnpm add -g clawdbot@latest +pnpm add -g moltbot@latest ``` We do **not** recommend Bun for the Gateway runtime (WhatsApp/Telegram bugs). To switch update channels (git + npm installs): ```bash -clawdbot update --channel beta -clawdbot update --channel dev -clawdbot update --channel stable +moltbot update --channel beta +moltbot update --channel dev +moltbot update --channel stable ``` Use `--tag ` for a one-off install tag/version. @@ -67,36 +68,36 @@ Note: on npm installs, the gateway logs an update hint on startup (checks the cu Then: ```bash -clawdbot doctor -clawdbot gateway restart -clawdbot health +moltbot doctor +moltbot gateway restart +moltbot health ``` Notes: -- If your Gateway runs as a service, `clawdbot gateway restart` is preferred over killing PIDs. +- If your Gateway runs as a service, `moltbot gateway restart` is preferred over killing PIDs. - If you’re pinned to a specific version, see “Rollback / pinning” below. -## Update (`clawdbot update`) +## Update (`moltbot update`) For **source installs** (git checkout), prefer: ```bash -clawdbot update +moltbot update ``` It runs a safe-ish update flow: - Requires a clean worktree. - Switches to the selected channel (tag or branch). - Fetches + rebases against the configured upstream (dev channel). -- Installs deps, builds, builds the Control UI, and runs `clawdbot doctor`. +- Installs deps, builds, builds the Control UI, and runs `moltbot doctor`. - Restarts the gateway by default (use `--no-restart` to skip). -If you installed via **npm/pnpm** (no git metadata), `clawdbot update` will try to update via your package manager. If it can’t detect the install, use “Update (global install)” instead. +If you installed via **npm/pnpm** (no git metadata), `moltbot update` will try to update via your package manager. If it can’t detect the install, use “Update (global install)” instead. ## Update (Control UI / RPC) The Control UI has **Update & Restart** (RPC: `update.run`). It: -1) Runs the same source-update flow as `clawdbot update` (git checkout only). +1) Runs the same source-update flow as `moltbot update` (git checkout only). 2) Writes a restart sentinel with a structured report (stdout/stderr tail). 3) Restarts the gateway and pings the last active session with the report. @@ -109,7 +110,7 @@ From the repo checkout: Preferred: ```bash -clawdbot update +moltbot update ``` Manual (equivalent-ish): @@ -119,21 +120,21 @@ git pull pnpm install pnpm build pnpm ui:build # auto-installs UI deps on first run -clawdbot doctor -clawdbot health +moltbot doctor +moltbot health ``` Notes: -- `pnpm build` matters when you run the packaged `clawdbot` binary ([`dist/entry.js`](https://github.com/clawdbot/clawdbot/blob/main/dist/entry.js)) or use Node to run `dist/`. -- If you run from a repo checkout without a global install, use `pnpm clawdbot ...` for CLI commands. -- If you run directly from TypeScript (`pnpm clawdbot ...`), a rebuild is usually unnecessary, but **config migrations still apply** → run doctor. -- Switching between global and git installs is easy: install the other flavor, then run `clawdbot doctor` so the gateway service entrypoint is rewritten to the current install. +- `pnpm build` matters when you run the packaged `moltbot` binary ([`dist/entry.js`](https://github.com/clawdbot/clawdbot/blob/main/dist/entry.js)) or use Node to run `dist/`. +- If you run from a repo checkout without a global install, use `pnpm moltbot ...` for CLI commands. +- If you run directly from TypeScript (`pnpm moltbot ...`), a rebuild is usually unnecessary, but **config migrations still apply** → run doctor. +- Switching between global and git installs is easy: install the other flavor, then run `moltbot doctor` so the gateway service entrypoint is rewritten to the current install. -## Always run: `clawdbot doctor` +## Always Run: `moltbot doctor` Doctor is the “safe update” command. It’s intentionally boring: repair + migrate + warn. -Note: if you’re on a **source install** (git checkout), `clawdbot doctor` will offer to run `clawdbot update` first. +Note: if you’re on a **source install** (git checkout), `moltbot doctor` will offer to run `moltbot update` first. Typical things it does: - Migrate deprecated config keys / legacy config file locations. @@ -149,18 +150,18 @@ Details: [Doctor](/gateway/doctor) CLI (works regardless of OS): ```bash -clawdbot gateway status -clawdbot gateway stop -clawdbot gateway restart -clawdbot gateway --port 18789 -clawdbot logs --follow +moltbot gateway status +moltbot gateway stop +moltbot gateway restart +moltbot gateway --port 18789 +moltbot logs --follow ``` If you’re supervised: - macOS launchd (app-bundled LaunchAgent): `launchctl kickstart -k gui/$UID/com.clawdbot.gateway` (use `com.clawdbot.` if set) - Linux systemd user service: `systemctl --user restart clawdbot-gateway[-].service` - Windows (WSL2): `systemctl --user restart clawdbot-gateway[-].service` - - `launchctl`/`systemctl` only work if the service is installed; otherwise run `clawdbot gateway install`. + - `launchctl`/`systemctl` only work if the service is installed; otherwise run `moltbot gateway install`. Runbook + exact service labels: [Gateway runbook](/gateway) @@ -171,20 +172,20 @@ Runbook + exact service labels: [Gateway runbook](/gateway) Install a known-good version (replace `` with the last working one): ```bash -npm i -g clawdbot@ +npm i -g moltbot@ ``` ```bash -pnpm add -g clawdbot@ +pnpm add -g moltbot@ ``` -Tip: to see the current published version, run `npm view clawdbot version`. +Tip: to see the current published version, run `npm view moltbot version`. Then restart + re-run doctor: ```bash -clawdbot doctor -clawdbot gateway restart +moltbot doctor +moltbot gateway restart ``` ### Pin (source) by date @@ -201,7 +202,7 @@ Then reinstall deps + restart: ```bash pnpm install pnpm build -clawdbot gateway restart +moltbot gateway restart ``` If you want to go back to latest later: @@ -213,6 +214,6 @@ git pull ## If you’re stuck -- Run `clawdbot doctor` again and read the output carefully (it often tells you the fix). +- Run `moltbot doctor` again and read the output carefully (it often tells you the fix). - Check: [Troubleshooting](/gateway/troubleshooting) - Ask in Discord: https://channels.discord.gg/clawd diff --git a/docs/platforms/digitalocean.md b/docs/platforms/digitalocean.md index afefe3676..ac46a5b47 100644 --- a/docs/platforms/digitalocean.md +++ b/docs/platforms/digitalocean.md @@ -65,7 +65,7 @@ curl -fsSL https://deb.nodesource.com/setup_22.x | bash - apt install -y nodejs # Install Clawdbot -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash # Verify clawdbot --version diff --git a/docs/platforms/oracle.md b/docs/platforms/oracle.md index d8006754b..52db36049 100644 --- a/docs/platforms/oracle.md +++ b/docs/platforms/oracle.md @@ -97,7 +97,7 @@ tailscale status ## 5) Install Clawdbot ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash source ~/.bashrc ``` diff --git a/docs/platforms/raspberry-pi.md b/docs/platforms/raspberry-pi.md index b34e3fcfe..ba6b339cf 100644 --- a/docs/platforms/raspberry-pi.md +++ b/docs/platforms/raspberry-pi.md @@ -110,7 +110,7 @@ sudo sysctl -p ### Option A: Standard Install (Recommended) ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` ### Option B: Hackable Install (For tinkering) diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index a4c68e3e9..c107ac119 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -42,7 +42,7 @@ When the operator says “release”, immediately do this preflight (no extra qu - [ ] `CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke` (Docker install smoke test, fast path; required before release) - If the immediate previous npm release is known broken, set `CLAWDBOT_INSTALL_SMOKE_PREVIOUS=` or `CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS=1` for the preinstall step. - [ ] (Optional) Full installer smoke (adds non-root + CLI coverage): `pnpm test:install:smoke` -- [ ] (Optional) Installer E2E (Docker, runs `curl -fsSL https://clawd.bot/install.sh | bash`, onboards, then runs real tool calls): +- [ ] (Optional) Installer E2E (Docker, runs `curl -fsSL https://molt.bot/install.sh | bash`, onboards, then runs real tool calls): - `pnpm test:install:e2e:openai` (requires `OPENAI_API_KEY`) - `pnpm test:install:e2e:anthropic` (requires `ANTHROPIC_API_KEY`) - `pnpm test:install:e2e` (requires both keys; runs both providers) diff --git a/docs/start/getting-started.md b/docs/start/getting-started.md index 790a79dfc..92a772c4d 100644 --- a/docs/start/getting-started.md +++ b/docs/start/getting-started.md @@ -54,7 +54,7 @@ Windows: use **WSL2** (Ubuntu recommended). WSL2 is strongly recommended; native ## 1) Install the CLI (recommended) ```bash -curl -fsSL https://clawd.bot/install.sh | bash +curl -fsSL https://molt.bot/install.sh | bash ``` Installer options (install method, non-interactive, from GitHub): [Install](/install). @@ -62,7 +62,7 @@ Installer options (install method, non-interactive, from GitHub): [Install](/ins Windows (PowerShell): ```powershell -iwr -useb https://clawd.bot/install.ps1 | iex +iwr -useb https://molt.bot/install.ps1 | iex ``` Alternative (global install): diff --git a/extensions/lobster/src/lobster-tool.test.ts b/extensions/lobster/src/lobster-tool.test.ts index 5c887cc76..7314c9d5e 100644 --- a/extensions/lobster/src/lobster-tool.test.ts +++ b/extensions/lobster/src/lobster-tool.test.ts @@ -83,6 +83,26 @@ describe("lobster plugin tool", () => { expect(res.details).toMatchObject({ ok: true, status: "ok" }); }); + it("tolerates noisy stdout before the JSON envelope", async () => { + const payload = { ok: true, status: "ok", output: [], requiresApproval: null }; + const { binPath } = await writeFakeLobsterScript( + `const payload = ${JSON.stringify(payload)};\n` + + `console.log("noise before json");\n` + + `process.stdout.write(JSON.stringify(payload));\n`, + "clawdbot-lobster-plugin-noisy-", + ); + + const tool = createLobsterTool(fakeApi()); + const res = await tool.execute("call-noisy", { + action: "run", + pipeline: "noop", + lobsterPath: binPath, + timeoutMs: 1000, + }); + + expect(res.details).toMatchObject({ ok: true, status: "ok" }); + }); + it("requires absolute lobsterPath when provided", async () => { const tool = createLobsterTool(fakeApi()); await expect( diff --git a/extensions/lobster/src/lobster-tool.ts b/extensions/lobster/src/lobster-tool.ts index 368389ab8..e6e8441ff 100644 --- a/extensions/lobster/src/lobster-tool.ts +++ b/extensions/lobster/src/lobster-tool.ts @@ -131,10 +131,28 @@ async function runLobsterSubprocess(params: { } function parseEnvelope(stdout: string): LobsterEnvelope { - let parsed: unknown; - try { - parsed = JSON.parse(stdout); - } catch { + const trimmed = stdout.trim(); + + const tryParse = (input: string) => { + try { + return JSON.parse(input) as unknown; + } catch { + return undefined; + } + }; + + let parsed: unknown = tryParse(trimmed); + + // Some environments can leak extra stdout (e.g. warnings/logs) before the + // final JSON envelope. Be tolerant and parse the last JSON-looking suffix. + if (parsed === undefined) { + const suffixMatch = trimmed.match(/({[\s\S]*}|\[[\s\S]*])\s*$/); + if (suffixMatch?.[1]) { + parsed = tryParse(suffixMatch[1]); + } + } + + if (parsed === undefined) { throw new Error("lobster returned invalid JSON"); } diff --git a/extensions/mattermost/src/onboarding.ts b/extensions/mattermost/src/onboarding.ts index 431c648ae..31578b3e7 100644 --- a/extensions/mattermost/src/onboarding.ts +++ b/extensions/mattermost/src/onboarding.ts @@ -17,7 +17,7 @@ async function noteMattermostSetup(prompter: WizardPrompter): Promise { "2) Create a bot + copy its token", "3) Use your server base URL (e.g., https://chat.example.com)", "Tip: the bot must be a member of any channel you want it to monitor.", - "Docs: https://docs.clawd.bot/channels/mattermost", + "Docs: https://docs.molt.bot/channels/mattermost", ].join("\n"), "Mattermost bot token", ); diff --git a/extensions/tlon/README.md b/extensions/tlon/README.md index aa02cab93..19c8fbb27 100644 --- a/extensions/tlon/README.md +++ b/extensions/tlon/README.md @@ -2,4 +2,4 @@ Tlon/Urbit channel plugin for Clawdbot. Supports DMs, group mentions, and thread replies. -Docs: https://docs.clawd.bot/channels/tlon +Docs: https://docs.molt.bot/channels/tlon diff --git a/extensions/twitch/README.md b/extensions/twitch/README.md index 2d3e4ceea..377b49baa 100644 --- a/extensions/twitch/README.md +++ b/extensions/twitch/README.md @@ -80,7 +80,7 @@ Multi-account config (advanced): ## Full documentation -See https://docs.clawd.bot/channels/twitch for: +See https://docs.molt.bot/channels/twitch for: - Token refresh setup - Access control patterns diff --git a/extensions/voice-call/README.md b/extensions/voice-call/README.md index 5f009aa28..269a67d11 100644 --- a/extensions/voice-call/README.md +++ b/extensions/voice-call/README.md @@ -8,8 +8,8 @@ Providers: - **Plivo** (Voice API + XML transfer + GetInput speech) - **Mock** (dev/no network) -Docs: `https://docs.clawd.bot/plugins/voice-call` -Plugin system: `https://docs.clawd.bot/plugin` +Docs: `https://docs.molt.bot/plugins/voice-call` +Plugin system: `https://docs.molt.bot/plugin` ## Install (local dev) diff --git a/extensions/voice-call/src/cli.ts b/extensions/voice-call/src/cli.ts index 6291ef137..7769ae09f 100644 --- a/extensions/voice-call/src/cli.ts +++ b/extensions/voice-call/src/cli.ts @@ -45,7 +45,7 @@ export function registerVoiceCallCli(params: { const root = program .command("voicecall") .description("Voice call utilities") - .addHelpText("after", () => `\nDocs: https://docs.clawd.bot/cli/voicecall\n`); + .addHelpText("after", () => `\nDocs: https://docs.molt.bot/cli/voicecall\n`); root .command("call") diff --git a/extensions/voice-call/src/core-bridge.ts b/extensions/voice-call/src/core-bridge.ts index a1d01e10f..bc008a515 100644 --- a/extensions/voice-call/src/core-bridge.ts +++ b/extensions/voice-call/src/core-bridge.ts @@ -88,7 +88,7 @@ function findPackageRoot(startDir: string, name: string): string | null { function resolveClawdbotRoot(): string { if (coreRootCache) return coreRootCache; - const override = process.env.CLAWDBOT_ROOT?.trim(); + const override = process.env.MOLTBOT_ROOT?.trim() || process.env.CLAWDBOT_ROOT?.trim(); if (override) { coreRootCache = override; return override; @@ -107,15 +107,17 @@ function resolveClawdbotRoot(): string { } for (const start of candidates) { - const found = findPackageRoot(start, "clawdbot"); - if (found) { - coreRootCache = found; - return found; + for (const name of ["moltbot", "clawdbot"]) { + const found = findPackageRoot(start, name); + if (found) { + coreRootCache = found; + return found; + } } } throw new Error( - "Unable to resolve Clawdbot root. Set CLAWDBOT_ROOT to the package root.", + "Unable to resolve core root. Set MOLTBOT_ROOT (or legacy CLAWDBOT_ROOT) to the package root.", ); } diff --git a/extensions/zalo/src/onboarding.ts b/extensions/zalo/src/onboarding.ts index 4cb681dbe..3c4e5c197 100644 --- a/extensions/zalo/src/onboarding.ts +++ b/extensions/zalo/src/onboarding.ts @@ -132,7 +132,7 @@ async function noteZaloTokenHelp(prompter: WizardPrompter): Promise { "2) Create a bot and get the token", "3) Token looks like 12345689:abc-xyz", "Tip: you can also set ZALO_BOT_TOKEN in your env.", - "Docs: https://docs.clawd.bot/channels/zalo", + "Docs: https://docs.molt.bot/channels/zalo", ].join("\n"), "Zalo bot token", ); diff --git a/extensions/zalouser/src/channel.ts b/extensions/zalouser/src/channel.ts index 6554d7874..712143f65 100644 --- a/extensions/zalouser/src/channel.ts +++ b/extensions/zalouser/src/channel.ts @@ -471,7 +471,7 @@ export const zalouserPlugin: ChannelPlugin = { const ok = await checkZcaInstalled(); if (!ok) { throw new Error( - "Missing dependency: `zca` not found in PATH. See docs.clawd.bot/channels/zalouser", + "Missing dependency: `zca` not found in PATH. See docs.molt.bot/channels/zalouser", ); } runtime.log( diff --git a/extensions/zalouser/src/onboarding.ts b/extensions/zalouser/src/onboarding.ts index a5c205015..2a318d281 100644 --- a/extensions/zalouser/src/onboarding.ts +++ b/extensions/zalouser/src/onboarding.ts @@ -53,7 +53,7 @@ async function noteZalouserHelp(prompter: WizardPrompter): Promise { "1) Install zca-cli", "2) You'll scan a QR code with your Zalo app", "", - "Docs: https://docs.clawd.bot/channels/zalouser", + "Docs: https://docs.molt.bot/channels/zalouser", ].join("\n"), "Zalo Personal Setup", ); @@ -316,7 +316,7 @@ export const zalouserOnboardingAdapter: ChannelOnboardingAdapter = { "The `zca` binary was not found in PATH.", "", "Install zca-cli, then re-run onboarding:", - "Docs: https://docs.clawd.bot/channels/zalouser", + "Docs: https://docs.molt.bot/channels/zalouser", ].join("\n"), "Missing Dependency", ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1c55dd8d..82f0a96e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -316,7 +316,7 @@ importers: devDependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot extensions/imessage: {} @@ -324,7 +324,7 @@ importers: devDependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot extensions/llm-task: {} @@ -350,7 +350,7 @@ importers: devDependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot extensions/mattermost: {} @@ -385,7 +385,7 @@ importers: version: 1.2.2 clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot express: specifier: ^5.2.1 version: 5.2.1 @@ -399,7 +399,7 @@ importers: dependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot nostr-tools: specifier: ^2.20.0 version: 2.20.0(typescript@5.9.3) @@ -441,7 +441,7 @@ importers: devDependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot extensions/voice-call: dependencies: @@ -461,7 +461,7 @@ importers: dependencies: clawdbot: specifier: workspace:* - version: link:../.. + version: link:../../packages/clawdbot undici: specifier: 7.19.0 version: 7.19.0 @@ -472,6 +472,12 @@ importers: specifier: 0.34.47 version: 0.34.47 clawdbot: + specifier: workspace:* + version: link:../../packages/clawdbot + + packages/clawdbot: + dependencies: + moltbot: specifier: workspace:* version: link:../.. diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 115f9a8c0..acf898add 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - . - ui + - packages/* - extensions/* onlyBuiltDependencies: diff --git a/scripts/docker/install-sh-e2e/run.sh b/scripts/docker/install-sh-e2e/run.sh index 474fc329e..0cc4a27e4 100755 --- a/scripts/docker/install-sh-e2e/run.sh +++ b/scripts/docker/install-sh-e2e/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://clawd.bot/install.sh}" +INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}" MODELS_MODE="${CLAWDBOT_E2E_MODELS:-both}" # both|openai|anthropic INSTALL_TAG="${CLAWDBOT_INSTALL_TAG:-latest}" E2E_PREVIOUS_VERSION="${CLAWDBOT_INSTALL_E2E_PREVIOUS:-}" diff --git a/scripts/docker/install-sh-nonroot/run.sh b/scripts/docker/install-sh-nonroot/run.sh index 82e2275ae..bdb91bb13 100644 --- a/scripts/docker/install-sh-nonroot/run.sh +++ b/scripts/docker/install-sh-nonroot/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://clawd.bot/install.sh}" +INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}" echo "==> Pre-flight: ensure git absent" if command -v git >/dev/null; then diff --git a/scripts/docker/install-sh-smoke/run.sh b/scripts/docker/install-sh-smoke/run.sh index b73864ee1..de0e2536f 100755 --- a/scripts/docker/install-sh-smoke/run.sh +++ b/scripts/docker/install-sh-smoke/run.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://clawd.bot/install.sh}" +INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}" SMOKE_PREVIOUS_VERSION="${CLAWDBOT_INSTALL_SMOKE_PREVIOUS:-}" SKIP_PREVIOUS="${CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS:-0}" diff --git a/scripts/test-install-sh-docker.sh b/scripts/test-install-sh-docker.sh index ba87eeb65..03cde30be 100755 --- a/scripts/test-install-sh-docker.sh +++ b/scripts/test-install-sh-docker.sh @@ -4,8 +4,8 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SMOKE_IMAGE="${CLAWDBOT_INSTALL_SMOKE_IMAGE:-clawdbot-install-smoke:local}" NONROOT_IMAGE="${CLAWDBOT_INSTALL_NONROOT_IMAGE:-clawdbot-install-nonroot:local}" -INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://clawd.bot/install.sh}" -CLI_INSTALL_URL="${CLAWDBOT_INSTALL_CLI_URL:-https://clawd.bot/install-cli.sh}" +INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}" +CLI_INSTALL_URL="${CLAWDBOT_INSTALL_CLI_URL:-https://molt.bot/install-cli.sh}" SKIP_NONROOT="${CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT:-0}" LATEST_DIR="$(mktemp -d)" LATEST_FILE="${LATEST_DIR}/latest" diff --git a/scripts/test-install-sh-e2e-docker.sh b/scripts/test-install-sh-e2e-docker.sh index 0ad79aaf8..600be4e56 100755 --- a/scripts/test-install-sh-e2e-docker.sh +++ b/scripts/test-install-sh-e2e-docker.sh @@ -3,7 +3,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" IMAGE_NAME="${CLAWDBOT_INSTALL_E2E_IMAGE:-clawdbot-install-e2e:local}" -INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://clawd.bot/install.sh}" +INSTALL_URL="${CLAWDBOT_INSTALL_URL:-https://molt.bot/install.sh}" OPENAI_API_KEY="${OPENAI_API_KEY:-}" ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-}" diff --git a/src/agents/clawdbot-gateway-tool.test.ts b/src/agents/clawdbot-gateway-tool.test.ts index 76d8ff8e4..8def33988 100644 --- a/src/agents/clawdbot-gateway-tool.test.ts +++ b/src/agents/clawdbot-gateway-tool.test.ts @@ -50,7 +50,7 @@ describe("gateway tool", () => { }; expect(parsed.payload?.kind).toBe("restart"); expect(parsed.payload?.doctorHint).toBe( - "Run: clawdbot --profile isolated doctor --non-interactive", + "Run: moltbot --profile isolated doctor --non-interactive", ); expect(kill).not.toHaveBeenCalled(); diff --git a/src/agents/system-prompt.ts b/src/agents/system-prompt.ts index 1d1a6a5eb..4d4512298 100644 --- a/src/agents/system-prompt.ts +++ b/src/agents/system-prompt.ts @@ -116,7 +116,7 @@ function buildDocsSection(params: { docsPath?: string; isMinimal: boolean; readT return [ "## Documentation", `Clawdbot docs: ${docsPath}`, - "Mirror: https://docs.clawd.bot", + "Mirror: https://docs.molt.bot", "Source: https://github.com/clawdbot/clawdbot", "Community: https://discord.com/invite/clawd", "Find new skills: https://clawdhub.com", diff --git a/src/agents/tools/web-search.ts b/src/agents/tools/web-search.ts index 50d3d19a1..7cec8f21c 100644 --- a/src/agents/tools/web-search.ts +++ b/src/agents/tools/web-search.ts @@ -128,13 +128,13 @@ function missingSearchKeyPayload(provider: (typeof SEARCH_PROVIDERS)[number]) { error: "missing_perplexity_api_key", message: "web_search (perplexity) needs an API key. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the Gateway environment, or configure tools.web.search.perplexity.apiKey.", - docs: "https://docs.clawd.bot/tools/web", + docs: "https://docs.molt.bot/tools/web", }; } return { error: "missing_brave_api_key", message: `web_search needs a Brave Search API key. Run \`${formatCliCommand("clawdbot configure --section web")}\` to store it, or set BRAVE_API_KEY in the Gateway environment.`, - docs: "https://docs.clawd.bot/tools/web", + docs: "https://docs.molt.bot/tools/web", }; } @@ -279,7 +279,7 @@ async function runPerplexitySearch(params: { headers: { "Content-Type": "application/json", Authorization: `Bearer ${params.apiKey}`, - "HTTP-Referer": "https://clawdbot.com", + "HTTP-Referer": "https://molt.bot", "X-Title": "Clawdbot Web Search", }, body: JSON.stringify({ @@ -447,7 +447,7 @@ export function createWebSearchTool(options?: { return jsonResult({ error: "unsupported_freshness", message: "freshness is only supported by the Brave web_search provider.", - docs: "https://docs.clawd.bot/tools/web", + docs: "https://docs.molt.bot/tools/web", }); } const freshness = rawFreshness ? normalizeFreshness(rawFreshness) : undefined; @@ -456,7 +456,7 @@ export function createWebSearchTool(options?: { error: "invalid_freshness", message: "freshness must be one of pd, pw, pm, py, or a range like YYYY-MM-DDtoYYYY-MM-DD.", - docs: "https://docs.clawd.bot/tools/web", + docs: "https://docs.molt.bot/tools/web", }); } const result = await runWebSearch({ diff --git a/src/auto-reply/reply/bash-command.ts b/src/auto-reply/reply/bash-command.ts index a83bf3952..47ea45504 100644 --- a/src/auto-reply/reply/bash-command.ts +++ b/src/auto-reply/reply/bash-command.ts @@ -189,7 +189,7 @@ export async function handleBashChatCommand(params: { }): Promise { if (params.cfg.commands?.bash !== true) { return { - text: "⚠️ bash is disabled. Set commands.bash=true to enable. Docs: https://docs.clawd.bot/tools/slash-commands#config", + text: "⚠️ bash is disabled. Set commands.bash=true to enable. Docs: https://docs.molt.bot/tools/slash-commands#config", }; } diff --git a/src/canvas-host/a2ui/.bundle.hash b/src/canvas-host/a2ui/.bundle.hash index 19a232f5c..01a6e013f 100644 --- a/src/canvas-host/a2ui/.bundle.hash +++ b/src/canvas-host/a2ui/.bundle.hash @@ -1 +1 @@ -2567ca5bbc065b922d96717a488d5db3120b5b033c5d0508682d1aa8fbba470a +b3c955e808e8d11cdbb6f716a038f26ccdd4b69228ad0c4ce76fd81e98496d56 diff --git a/src/channels/plugins/catalog.test.ts b/src/channels/plugins/catalog.test.ts index 2470dbd33..a50aa2b36 100644 --- a/src/channels/plugins/catalog.test.ts +++ b/src/channels/plugins/catalog.test.ts @@ -8,7 +8,7 @@ import { getChannelPluginCatalogEntry, listChannelPluginCatalogEntries } from ". describe("channel plugin catalog", () => { it("includes Microsoft Teams", () => { const entry = getChannelPluginCatalogEntry("msteams"); - expect(entry?.install.npmSpec).toBe("@clawdbot/msteams"); + expect(entry?.install.npmSpec).toBe("@moltbot/msteams"); expect(entry?.meta.aliases).toContain("teams"); }); diff --git a/src/channels/plugins/onboarding/telegram.ts b/src/channels/plugins/onboarding/telegram.ts index fdbc044c5..90920ab40 100644 --- a/src/channels/plugins/onboarding/telegram.ts +++ b/src/channels/plugins/onboarding/telegram.ts @@ -38,7 +38,7 @@ async function noteTelegramTokenHelp(prompter: WizardPrompter): Promise { "3) Copy the token (looks like 123456:ABC...)", "Tip: you can also set TELEGRAM_BOT_TOKEN in your env.", `Docs: ${formatDocsLink("/telegram")}`, - "Website: https://clawd.bot", + "Website: https://molt.bot", ].join("\n"), "Telegram bot token", ); @@ -51,7 +51,7 @@ async function noteTelegramUserIdHelp(prompter: WizardPrompter): Promise { "2) Or call https://api.telegram.org/bot/getUpdates and read message.from.id", "3) Third-party: DM @userinfobot or @getidsbot", `Docs: ${formatDocsLink("/telegram")}`, - "Website: https://clawd.bot", + "Website: https://molt.bot", ].join("\n"), "Telegram user id", ); diff --git a/src/channels/registry.test.ts b/src/channels/registry.test.ts index 84940aa42..44b53ef6d 100644 --- a/src/channels/registry.test.ts +++ b/src/channels/registry.test.ts @@ -33,6 +33,6 @@ describe("channel registry", () => { ); expect(line).not.toContain("Docs:"); expect(line).toContain("/channels/telegram"); - expect(line).toContain("https://clawd.bot"); + expect(line).toContain("https://molt.bot"); }); }); diff --git a/src/channels/registry.ts b/src/channels/registry.ts index 10ddeed4a..6afe1996c 100644 --- a/src/channels/registry.ts +++ b/src/channels/registry.ts @@ -22,7 +22,7 @@ export const DEFAULT_CHAT_CHANNEL: ChatChannelId = "whatsapp"; export type ChatChannelMeta = ChannelMeta; -const WEBSITE_URL = "https://clawd.bot"; +const WEBSITE_URL = "https://molt.bot"; const CHAT_CHANNEL_META: Record = { telegram: { diff --git a/src/cli/acp-cli.ts b/src/cli/acp-cli.ts index f2283d23d..8669d77fa 100644 --- a/src/cli/acp-cli.ts +++ b/src/cli/acp-cli.ts @@ -21,7 +21,7 @@ export function registerAcpCli(program: Command) { .option("--verbose, -v", "Verbose logging to stderr", false) .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/acp", "docs.clawd.bot/cli/acp")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/acp", "docs.molt.bot/cli/acp")}\n`, ) .action((opts) => { try { @@ -46,7 +46,7 @@ export function registerAcpCli(program: Command) { .command("client") .description("Run an interactive ACP client against the local ACP bridge") .option("--cwd ", "Working directory for the ACP session") - .option("--server ", "ACP server command (default: clawdbot)") + .option("--server ", "ACP server command (default: moltbot)") .option("--server-args ", "Extra arguments for the ACP server") .option("--server-verbose", "Enable verbose logging on the ACP server", false) .option("--verbose, -v", "Verbose client logging", false) diff --git a/src/cli/banner.ts b/src/cli/banner.ts index 7a811f56e..87803c9c7 100644 --- a/src/cli/banner.ts +++ b/src/cli/banner.ts @@ -2,6 +2,7 @@ import { resolveCommitHash } from "../infra/git-commit.js"; import { visibleWidth } from "../terminal/ansi.js"; import { isRich, theme } from "../terminal/theme.js"; import { pickTagline, type TaglineOptions } from "./tagline.js"; +import { resolveCliName } from "./cli-name.js"; type BannerOptions = TaglineOptions & { argv?: string[]; @@ -37,7 +38,8 @@ export function formatCliBannerLine(version: string, options: BannerOptions = {} const commitLabel = commit ?? "unknown"; const tagline = pickTagline(options); const rich = options.richTty ?? isRich(); - const title = "🦞 Clawdbot"; + const cliName = resolveCliName(options.argv ?? process.argv, options.env); + const title = cliName === "clawdbot" ? "🦞 Clawdbot" : "🦞 Moltbot"; const prefix = "🦞 "; const columns = options.columns ?? process.stdout.columns ?? 120; const plainFullLine = `${title} ${version} (${commitLabel}) — ${tagline}`; diff --git a/src/cli/browser-cli-extension.ts b/src/cli/browser-cli-extension.ts index 3bd7c5b3a..6775216e6 100644 --- a/src/cli/browser-cli-extension.ts +++ b/src/cli/browser-cli-extension.ts @@ -90,7 +90,7 @@ export function registerBrowserExtensionCommands( `- “Load unpacked” → select: ${displayPath}`, `- Pin “Clawdbot Browser Relay”, then click it on the tab (badge shows ON)`, "", - `${theme.muted("Docs:")} ${formatDocsLink("/tools/chrome-extension", "docs.clawd.bot/tools/chrome-extension")}`, + `${theme.muted("Docs:")} ${formatDocsLink("/tools/chrome-extension", "docs.molt.bot/tools/chrome-extension")}`, ].join("\n"), ), ); @@ -107,7 +107,7 @@ export function registerBrowserExtensionCommands( danger( [ `Chrome extension is not installed. Run: "${formatCliCommand("clawdbot browser extension install")}"`, - `Docs: ${formatDocsLink("/tools/chrome-extension", "docs.clawd.bot/tools/chrome-extension")}`, + `Docs: ${formatDocsLink("/tools/chrome-extension", "docs.molt.bot/tools/chrome-extension")}`, ].join("\n"), ), ); diff --git a/src/cli/browser-cli.ts b/src/cli/browser-cli.ts index 50c71ef01..cda4d4275 100644 --- a/src/cli/browser-cli.ts +++ b/src/cli/browser-cli.ts @@ -31,7 +31,7 @@ export function registerBrowserCli(program: Command) { true, )}\n\n${theme.muted("Docs:")} ${formatDocsLink( "/cli/browser", - "docs.clawd.bot/cli/browser", + "docs.molt.bot/cli/browser", )}\n`, ) .action(() => { diff --git a/src/cli/channels-cli.ts b/src/cli/channels-cli.ts index 97fbee520..6d90ae935 100644 --- a/src/cli/channels-cli.ts +++ b/src/cli/channels-cli.ts @@ -76,7 +76,7 @@ export function registerChannelsCli(program: Command) { () => `\n${theme.muted("Docs:")} ${formatDocsLink( "/cli/channels", - "docs.clawd.bot/cli/channels", + "docs.molt.bot/cli/channels", )}\n`, ); diff --git a/src/cli/command-format.ts b/src/cli/command-format.ts index 9e5eef160..e62806cd4 100644 --- a/src/cli/command-format.ts +++ b/src/cli/command-format.ts @@ -1,6 +1,7 @@ import { normalizeProfileName } from "./profile-utils.js"; +import { replaceCliName, resolveCliName } from "./cli-name.js"; -const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+clawdbot\b|^clawdbot\b/; +const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+(?:clawdbot|moltbot)\b|^(?:clawdbot|moltbot)\b/; const PROFILE_FLAG_RE = /(?:^|\s)--profile(?:\s|=|$)/; const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/; @@ -8,9 +9,13 @@ export function formatCliCommand( command: string, env: Record = process.env as Record, ): string { + const cliName = resolveCliName(undefined, env); + const normalizedCommand = replaceCliName(command, cliName); const profile = normalizeProfileName(env.CLAWDBOT_PROFILE); - if (!profile) return command; - if (!CLI_PREFIX_RE.test(command)) return command; - if (PROFILE_FLAG_RE.test(command) || DEV_FLAG_RE.test(command)) return command; - return command.replace(CLI_PREFIX_RE, (match) => `${match} --profile ${profile}`); + if (!profile) return normalizedCommand; + if (!CLI_PREFIX_RE.test(normalizedCommand)) return normalizedCommand; + if (PROFILE_FLAG_RE.test(normalizedCommand) || DEV_FLAG_RE.test(normalizedCommand)) { + return normalizedCommand; + } + return normalizedCommand.replace(CLI_PREFIX_RE, (match) => `${match} --profile ${profile}`); } diff --git a/src/cli/config-cli.ts b/src/cli/config-cli.ts index 605482251..80550599d 100644 --- a/src/cli/config-cli.ts +++ b/src/cli/config-cli.ts @@ -185,7 +185,7 @@ export function registerConfigCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.clawd.bot/cli/config")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.molt.bot/cli/config")}\n`, ) .option( "--section
    ", diff --git a/src/cli/cron-cli/register.ts b/src/cli/cron-cli/register.ts index 7989e08fb..aa115f1fa 100644 --- a/src/cli/cron-cli/register.ts +++ b/src/cli/cron-cli/register.ts @@ -15,7 +15,7 @@ export function registerCronCli(program: Command) { .description("Manage cron jobs (via Gateway)") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.clawd.bot/cli/cron")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.molt.bot/cli/cron")}\n`, ); registerCronStatusCommand(cron); diff --git a/src/cli/daemon-cli/register.ts b/src/cli/daemon-cli/register.ts index 92b47690d..8c180c732 100644 --- a/src/cli/daemon-cli/register.ts +++ b/src/cli/daemon-cli/register.ts @@ -18,7 +18,7 @@ export function registerDaemonCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/gateway", "docs.clawd.bot/cli/gateway")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/gateway", "docs.molt.bot/cli/gateway")}\n`, ); daemon diff --git a/src/cli/daemon-cli/status.print.ts b/src/cli/daemon-cli/status.print.ts index 801980d24..dc34e00e6 100644 --- a/src/cli/daemon-cli/status.print.ts +++ b/src/cli/daemon-cli/status.print.ts @@ -322,5 +322,5 @@ export function printDaemonStatus(status: DaemonStatus, opts: { json: boolean }) } defaultRuntime.log(`${label("Troubles:")} run ${formatCliCommand("clawdbot status")}`); - defaultRuntime.log(`${label("Troubleshooting:")} https://docs.clawd.bot/troubleshooting`); + defaultRuntime.log(`${label("Troubleshooting:")} https://docs.molt.bot/troubleshooting`); } diff --git a/src/cli/directory-cli.ts b/src/cli/directory-cli.ts index d58663d8a..51fdd6049 100644 --- a/src/cli/directory-cli.ts +++ b/src/cli/directory-cli.ts @@ -39,7 +39,7 @@ export function registerDirectoryCli(program: Command) { () => `\n${theme.muted("Docs:")} ${formatDocsLink( "/cli/directory", - "docs.clawd.bot/cli/directory", + "docs.molt.bot/cli/directory", )}\n`, ) .action(() => { diff --git a/src/cli/dns-cli.ts b/src/cli/dns-cli.ts index 7798415e8..c063163a5 100644 --- a/src/cli/dns-cli.ts +++ b/src/cli/dns-cli.ts @@ -97,7 +97,7 @@ export function registerDnsCli(program: Command) { .description("DNS helpers for wide-area discovery (Tailscale + CoreDNS)") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/dns", "docs.clawd.bot/cli/dns")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/dns", "docs.molt.bot/cli/dns")}\n`, ); dns diff --git a/src/cli/docs-cli.ts b/src/cli/docs-cli.ts index 8078b8afe..0bcbe3bac 100644 --- a/src/cli/docs-cli.ts +++ b/src/cli/docs-cli.ts @@ -13,7 +13,7 @@ export function registerDocsCli(program: Command) { .argument("[query...]", "Search query") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/docs", "docs.clawd.bot/cli/docs")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/docs", "docs.molt.bot/cli/docs")}\n`, ) .action(async (queryParts: string[]) => { await runCommandWithRuntime(defaultRuntime, async () => { diff --git a/src/cli/exec-approvals-cli.ts b/src/cli/exec-approvals-cli.ts index f59b5475b..8b420db50 100644 --- a/src/cli/exec-approvals-cli.ts +++ b/src/cli/exec-approvals-cli.ts @@ -233,7 +233,7 @@ export function registerExecApprovalsCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/approvals", "docs.clawd.bot/cli/approvals")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/approvals", "docs.molt.bot/cli/approvals")}\n`, ); const getCmd = approvals @@ -337,7 +337,7 @@ export function registerExecApprovalsCli(program: Command) { )}\n${formatExample( 'clawdbot approvals allowlist remove "~/Projects/**/bin/rg"', "Remove an allowlist pattern.", - )}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/approvals", "docs.clawd.bot/cli/approvals")}\n`, + )}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/approvals", "docs.molt.bot/cli/approvals")}\n`, ); const allowlistAdd = allowlist diff --git a/src/cli/gateway-cli/register.ts b/src/cli/gateway-cli/register.ts index 8334cc6f7..eec58dd58 100644 --- a/src/cli/gateway-cli/register.ts +++ b/src/cli/gateway-cli/register.ts @@ -103,7 +103,7 @@ export function registerGatewayCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/gateway", "docs.clawd.bot/cli/gateway")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/gateway", "docs.molt.bot/cli/gateway")}\n`, ), ); diff --git a/src/cli/hooks-cli.test.ts b/src/cli/hooks-cli.test.ts index edbaf797d..6a4ee37fc 100644 --- a/src/cli/hooks-cli.test.ts +++ b/src/cli/hooks-cli.test.ts @@ -16,7 +16,7 @@ const report: HookStatusReport = { handlerPath: "/tmp/hooks/session-memory/handler.js", hookKey: "session-memory", emoji: "💾", - homepage: "https://docs.clawd.bot/hooks#session-memory", + homepage: "https://docs.molt.bot/hooks#session-memory", events: ["command:new"], always: false, disabled: false, diff --git a/src/cli/hooks-cli.ts b/src/cli/hooks-cli.ts index 022c7c295..a0eab75f5 100644 --- a/src/cli/hooks-cli.ts +++ b/src/cli/hooks-cli.ts @@ -424,7 +424,7 @@ export function registerHooksCli(program: Command): void { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/hooks", "docs.clawd.bot/cli/hooks")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/hooks", "docs.molt.bot/cli/hooks")}\n`, ); hooks diff --git a/src/cli/logs-cli.ts b/src/cli/logs-cli.ts index e5af23af8..8fcd8fffa 100644 --- a/src/cli/logs-cli.ts +++ b/src/cli/logs-cli.ts @@ -180,7 +180,7 @@ export function registerLogsCli(program: Command) { .option("--no-color", "Disable ANSI colors") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/logs", "docs.clawd.bot/cli/logs")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/logs", "docs.molt.bot/cli/logs")}\n`, ); addGatewayClientOptions(logs); diff --git a/src/cli/memory-cli.ts b/src/cli/memory-cli.ts index a184fa1b4..68894adf5 100644 --- a/src/cli/memory-cli.ts +++ b/src/cli/memory-cli.ts @@ -424,7 +424,7 @@ export function registerMemoryCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/memory", "docs.clawd.bot/cli/memory")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/memory", "docs.molt.bot/cli/memory")}\n`, ); memory diff --git a/src/cli/models-cli.ts b/src/cli/models-cli.ts index d914629e7..f68631d18 100644 --- a/src/cli/models-cli.ts +++ b/src/cli/models-cli.ts @@ -44,7 +44,7 @@ export function registerModelsCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/models", "docs.clawd.bot/cli/models")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/models", "docs.molt.bot/cli/models")}\n`, ); models diff --git a/src/cli/node-cli/register.ts b/src/cli/node-cli/register.ts index 8712c6a44..8f5c5b5ad 100644 --- a/src/cli/node-cli/register.ts +++ b/src/cli/node-cli/register.ts @@ -23,7 +23,7 @@ export function registerNodeCli(program: Command) { .description("Run a headless node host (system.run/system.which)") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/node", "docs.clawd.bot/cli/node")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/node", "docs.molt.bot/cli/node")}\n`, ); node diff --git a/src/cli/nodes-camera.test.ts b/src/cli/nodes-camera.test.ts index a024b535a..55d62cf06 100644 --- a/src/cli/nodes-camera.test.ts +++ b/src/cli/nodes-camera.test.ts @@ -51,11 +51,11 @@ describe("nodes camera helpers", () => { tmpDir: "/tmp", id: "id1", }); - expect(p).toBe(path.join("/tmp", "clawdbot-camera-snap-front-id1.jpg")); + expect(p).toBe(path.join("/tmp", "moltbot-camera-snap-front-id1.jpg")); }); it("writes base64 to file", async () => { - const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-test-")); + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "moltbot-test-")); const out = path.join(dir, "x.bin"); await writeBase64ToFile(out, "aGk="); await expect(fs.readFile(out, "utf8")).resolves.toBe("hi"); diff --git a/src/cli/nodes-camera.ts b/src/cli/nodes-camera.ts index d91053e76..f5bf2f2ea 100644 --- a/src/cli/nodes-camera.ts +++ b/src/cli/nodes-camera.ts @@ -3,6 +3,8 @@ import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; +import { resolveCliName } from "./cli-name.js"; + export type CameraFacing = "front" | "back"; export type CameraSnapPayload = { @@ -70,7 +72,8 @@ export function cameraTempPath(opts: { const id = opts.id ?? randomUUID(); const facingPart = opts.facing ? `-${opts.facing}` : ""; const ext = opts.ext.startsWith(".") ? opts.ext : `.${opts.ext}`; - return path.join(tmpDir, `clawdbot-camera-${opts.kind}${facingPart}-${id}${ext}`); + const cliName = resolveCliName(); + return path.join(tmpDir, `${cliName}-camera-${opts.kind}${facingPart}-${id}${ext}`); } export async function writeBase64ToFile(filePath: string, base64: string) { diff --git a/src/cli/nodes-canvas.ts b/src/cli/nodes-canvas.ts index b021ef22f..577c20560 100644 --- a/src/cli/nodes-canvas.ts +++ b/src/cli/nodes-canvas.ts @@ -2,6 +2,8 @@ import { randomUUID } from "node:crypto"; import * as os from "node:os"; import * as path from "node:path"; +import { resolveCliName } from "./cli-name.js"; + export type CanvasSnapshotPayload = { format: string; base64: string; @@ -29,5 +31,6 @@ export function canvasSnapshotTempPath(opts: { ext: string; tmpDir?: string; id? const tmpDir = opts.tmpDir ?? os.tmpdir(); const id = opts.id ?? randomUUID(); const ext = opts.ext.startsWith(".") ? opts.ext : `.${opts.ext}`; - return path.join(tmpDir, `clawdbot-canvas-snapshot-${id}${ext}`); + const cliName = resolveCliName(); + return path.join(tmpDir, `${cliName}-canvas-snapshot-${id}${ext}`); } diff --git a/src/cli/nodes-cli/register.ts b/src/cli/nodes-cli/register.ts index 20dd61902..501b28103 100644 --- a/src/cli/nodes-cli/register.ts +++ b/src/cli/nodes-cli/register.ts @@ -17,7 +17,7 @@ export function registerNodesCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/nodes", "docs.clawd.bot/cli/nodes")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/nodes", "docs.molt.bot/cli/nodes")}\n`, ); registerNodesStatusCommands(nodes); diff --git a/src/cli/pairing-cli.ts b/src/cli/pairing-cli.ts index 4d405bff5..a5d0ae137 100644 --- a/src/cli/pairing-cli.ts +++ b/src/cli/pairing-cli.ts @@ -53,7 +53,7 @@ export function registerPairingCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/pairing", "docs.clawd.bot/cli/pairing")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/pairing", "docs.molt.bot/cli/pairing")}\n`, ); pairing diff --git a/src/cli/plugins-cli.ts b/src/cli/plugins-cli.ts index 303231bdb..57709e04a 100644 --- a/src/cli/plugins-cli.ts +++ b/src/cli/plugins-cli.ts @@ -98,7 +98,7 @@ export function registerPluginsCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/plugins", "docs.clawd.bot/cli/plugins")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/plugins", "docs.molt.bot/cli/plugins")}\n`, ); plugins @@ -521,7 +521,7 @@ export function registerPluginsCli(program: Command) { lines.push(`- ${target}${diag.message}`); } } - const docs = formatDocsLink("/plugin", "docs.clawd.bot/plugin"); + const docs = formatDocsLink("/plugin", "docs.molt.bot/plugin"); lines.push(""); lines.push(`${theme.muted("Docs:")} ${docs}`); defaultRuntime.log(lines.join("\n")); diff --git a/src/cli/profile.test.ts b/src/cli/profile.test.ts index 0470bcf2c..f17e56214 100644 --- a/src/cli/profile.test.ts +++ b/src/cli/profile.test.ts @@ -80,60 +80,60 @@ describe("applyCliProfileEnv", () => { describe("formatCliCommand", () => { it("returns command unchanged when no profile is set", () => { - expect(formatCliCommand("clawdbot doctor --fix", {})).toBe("clawdbot doctor --fix"); + expect(formatCliCommand("clawdbot doctor --fix", {})).toBe("moltbot doctor --fix"); }); it("returns command unchanged when profile is default", () => { expect(formatCliCommand("clawdbot doctor --fix", { CLAWDBOT_PROFILE: "default" })).toBe( - "clawdbot doctor --fix", + "moltbot doctor --fix", ); }); it("returns command unchanged when profile is Default (case-insensitive)", () => { expect(formatCliCommand("clawdbot doctor --fix", { CLAWDBOT_PROFILE: "Default" })).toBe( - "clawdbot doctor --fix", + "moltbot doctor --fix", ); }); it("returns command unchanged when profile is invalid", () => { expect(formatCliCommand("clawdbot doctor --fix", { CLAWDBOT_PROFILE: "bad profile" })).toBe( - "clawdbot doctor --fix", + "moltbot doctor --fix", ); }); it("returns command unchanged when --profile is already present", () => { expect( formatCliCommand("clawdbot --profile work doctor --fix", { CLAWDBOT_PROFILE: "work" }), - ).toBe("clawdbot --profile work doctor --fix"); + ).toBe("moltbot --profile work doctor --fix"); }); it("returns command unchanged when --dev is already present", () => { expect(formatCliCommand("clawdbot --dev doctor", { CLAWDBOT_PROFILE: "dev" })).toBe( - "clawdbot --dev doctor", + "moltbot --dev doctor", ); }); it("inserts --profile flag when profile is set", () => { expect(formatCliCommand("clawdbot doctor --fix", { CLAWDBOT_PROFILE: "work" })).toBe( - "clawdbot --profile work doctor --fix", + "moltbot --profile work doctor --fix", ); }); it("trims whitespace from profile", () => { expect(formatCliCommand("clawdbot doctor --fix", { CLAWDBOT_PROFILE: " jbclawd " })).toBe( - "clawdbot --profile jbclawd doctor --fix", + "moltbot --profile jbclawd doctor --fix", ); }); it("handles command with no args after clawdbot", () => { expect(formatCliCommand("clawdbot", { CLAWDBOT_PROFILE: "test" })).toBe( - "clawdbot --profile test", + "moltbot --profile test", ); }); it("handles pnpm wrapper", () => { expect(formatCliCommand("pnpm clawdbot doctor", { CLAWDBOT_PROFILE: "work" })).toBe( - "pnpm clawdbot --profile work doctor", + "pnpm moltbot --profile work doctor", ); }); }); diff --git a/src/cli/program.nodes-media.test.ts b/src/cli/program.nodes-media.test.ts index 60513b8e1..3132a98b9 100644 --- a/src/cli/program.nodes-media.test.ts +++ b/src/cli/program.nodes-media.test.ts @@ -174,7 +174,7 @@ describe("cli program (nodes media)", () => { const out = String(runtime.log.mock.calls[0]?.[0] ?? ""); const mediaPath = out.replace(/^MEDIA:/, "").trim(); - expect(mediaPath).toMatch(/clawdbot-camera-clip-front-.*\.mp4$/); + expect(mediaPath).toMatch(/moltbot-camera-clip-front-.*\.mp4$/); try { await expect(fs.readFile(mediaPath, "utf8")).resolves.toBe("hi"); @@ -421,7 +421,7 @@ describe("cli program (nodes media)", () => { const out = String(runtime.log.mock.calls[0]?.[0] ?? ""); const mediaPath = out.replace(/^MEDIA:/, "").trim(); - expect(mediaPath).toMatch(/clawdbot-canvas-snapshot-.*\.png$/); + expect(mediaPath).toMatch(/moltbot-canvas-snapshot-.*\.png$/); try { await expect(fs.readFile(mediaPath, "utf8")).resolves.toBe("hi"); diff --git a/src/cli/program/help.ts b/src/cli/program/help.ts index c90f9eb96..9ad704c16 100644 --- a/src/cli/program/help.ts +++ b/src/cli/program/help.ts @@ -2,8 +2,11 @@ import type { Command } from "commander"; import { formatDocsLink } from "../../terminal/links.js"; import { isRich, theme } from "../../terminal/theme.js"; import { formatCliBannerLine, hasEmittedCliBanner } from "../banner.js"; +import { replaceCliName, resolveCliName } from "../cli-name.js"; import type { ProgramContext } from "./context.js"; +const CLI_NAME = resolveCliName(); + const EXAMPLES = [ [ "clawdbot channels login --verbose", @@ -29,7 +32,7 @@ const EXAMPLES = [ export function configureProgramHelp(program: Command, ctx: ProgramContext) { program - .name("clawdbot") + .name(CLI_NAME) .description("") .version(ctx.programVersion) .option( @@ -77,12 +80,12 @@ export function configureProgramHelp(program: Command, ctx: ProgramContext) { }); const fmtExamples = EXAMPLES.map( - ([cmd, desc]) => ` ${theme.command(cmd)}\n ${theme.muted(desc)}`, + ([cmd, desc]) => ` ${theme.command(replaceCliName(cmd, CLI_NAME))}\n ${theme.muted(desc)}`, ).join("\n"); program.addHelpText("afterAll", ({ command }) => { if (command !== program) return ""; - const docs = formatDocsLink("/cli", "docs.clawd.bot/cli"); + const docs = formatDocsLink("/cli", "docs.molt.bot/cli"); return `\n${theme.heading("Examples:")}\n${fmtExamples}\n\n${theme.muted("Docs:")} ${docs}\n`; }); } diff --git a/src/cli/program/preaction.ts b/src/cli/program/preaction.ts index 1607e0634..acdcde387 100644 --- a/src/cli/program/preaction.ts +++ b/src/cli/program/preaction.ts @@ -6,6 +6,7 @@ import { ensureConfigReady } from "./config-guard.js"; import { ensurePluginRegistryLoaded } from "../plugin-registry.js"; import { isTruthyEnvValue } from "../../infra/env.js"; import { setVerbose } from "../../globals.js"; +import { resolveCliName } from "../cli-name.js"; function setProcessTitleForCommand(actionCommand: Command) { let current: Command = actionCommand; @@ -13,8 +14,9 @@ function setProcessTitleForCommand(actionCommand: Command) { current = current.parent; } const name = current.name(); - if (!name || name === "clawdbot") return; - process.title = `clawdbot-${name}`; + const cliName = resolveCliName(); + if (!name || name === cliName) return; + process.title = `${cliName}-${name}`; } // Commands that need channel plugins loaded diff --git a/src/cli/program/register.agent.ts b/src/cli/program/register.agent.ts index d597efde9..80eb9a35f 100644 --- a/src/cli/program/register.agent.ts +++ b/src/cli/program/register.agent.ts @@ -68,7 +68,7 @@ ${formatHelpExamples([ ], ])} -${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.clawd.bot/cli/agent")}`, +${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.molt.bot/cli/agent")}`, ) .action(async (opts) => { const verboseLevel = typeof opts.verbose === "string" ? opts.verbose.toLowerCase() : ""; @@ -86,7 +86,7 @@ ${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.clawd.bot/cli/agent .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/agents", "docs.clawd.bot/cli/agents")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/agents", "docs.molt.bot/cli/agents")}\n`, ); agents diff --git a/src/cli/program/register.configure.ts b/src/cli/program/register.configure.ts index a10805e88..55bec5209 100644 --- a/src/cli/program/register.configure.ts +++ b/src/cli/program/register.configure.ts @@ -16,7 +16,7 @@ export function registerConfigureCommand(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/configure", "docs.clawd.bot/cli/configure")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/configure", "docs.molt.bot/cli/configure")}\n`, ) .option( "--section
    ", diff --git a/src/cli/program/register.maintenance.ts b/src/cli/program/register.maintenance.ts index 023965c5c..efb8b7851 100644 --- a/src/cli/program/register.maintenance.ts +++ b/src/cli/program/register.maintenance.ts @@ -15,7 +15,7 @@ export function registerMaintenanceCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/doctor", "docs.clawd.bot/cli/doctor")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/doctor", "docs.molt.bot/cli/doctor")}\n`, ) .option("--no-workspace-suggestions", "Disable workspace memory system suggestions", false) .option("--yes", "Accept defaults without prompting", false) @@ -45,7 +45,7 @@ export function registerMaintenanceCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/dashboard", "docs.clawd.bot/cli/dashboard")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/dashboard", "docs.molt.bot/cli/dashboard")}\n`, ) .option("--no-open", "Print URL but do not launch a browser", false) .action(async (opts) => { @@ -62,7 +62,7 @@ export function registerMaintenanceCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/reset", "docs.clawd.bot/cli/reset")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/reset", "docs.molt.bot/cli/reset")}\n`, ) .option("--scope ", "config|config+creds+sessions|full (default: interactive prompt)") .option("--yes", "Skip confirmation prompts", false) @@ -85,7 +85,7 @@ export function registerMaintenanceCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/uninstall", "docs.clawd.bot/cli/uninstall")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/uninstall", "docs.molt.bot/cli/uninstall")}\n`, ) .option("--service", "Remove the gateway service", false) .option("--state", "Remove state + config", false) diff --git a/src/cli/program/register.message.ts b/src/cli/program/register.message.ts index 24af5f37f..b9fa22a47 100644 --- a/src/cli/program/register.message.ts +++ b/src/cli/program/register.message.ts @@ -46,7 +46,7 @@ ${formatHelpExamples([ ], ])} -${theme.muted("Docs:")} ${formatDocsLink("/cli/message", "docs.clawd.bot/cli/message")}`, +${theme.muted("Docs:")} ${formatDocsLink("/cli/message", "docs.molt.bot/cli/message")}`, ) .action(() => { message.help({ error: true }); diff --git a/src/cli/program/register.onboard.ts b/src/cli/program/register.onboard.ts index eac6a60df..8f31635f0 100644 --- a/src/cli/program/register.onboard.ts +++ b/src/cli/program/register.onboard.ts @@ -38,7 +38,7 @@ export function registerOnboardCommand(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/onboard", "docs.clawd.bot/cli/onboard")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/onboard", "docs.molt.bot/cli/onboard")}\n`, ) .option("--workspace ", "Agent workspace directory (default: ~/clawd)") .option("--reset", "Reset config + credentials + sessions + workspace before running wizard") diff --git a/src/cli/program/register.setup.ts b/src/cli/program/register.setup.ts index aa79a5dda..ad36a70e5 100644 --- a/src/cli/program/register.setup.ts +++ b/src/cli/program/register.setup.ts @@ -14,7 +14,7 @@ export function registerSetupCommand(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/setup", "docs.clawd.bot/cli/setup")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/setup", "docs.molt.bot/cli/setup")}\n`, ) .option( "--workspace ", diff --git a/src/cli/program/register.status-health-sessions.ts b/src/cli/program/register.status-health-sessions.ts index 66d0c4abb..42913588f 100644 --- a/src/cli/program/register.status-health-sessions.ts +++ b/src/cli/program/register.status-health-sessions.ts @@ -53,7 +53,7 @@ export function registerStatusHealthSessionsCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/status", "docs.clawd.bot/cli/status")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/status", "docs.molt.bot/cli/status")}\n`, ) .action(async (opts) => { const verbose = resolveVerbose(opts); @@ -87,7 +87,7 @@ export function registerStatusHealthSessionsCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/health", "docs.clawd.bot/cli/health")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/health", "docs.molt.bot/cli/health")}\n`, ) .action(async (opts) => { const verbose = resolveVerbose(opts); @@ -130,7 +130,7 @@ export function registerStatusHealthSessionsCommands(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/sessions", "docs.clawd.bot/cli/sessions")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/sessions", "docs.molt.bot/cli/sessions")}\n`, ) .action(async (opts) => { setVerbose(Boolean(opts.verbose)); diff --git a/src/cli/sandbox-cli.ts b/src/cli/sandbox-cli.ts index 746566f82..bcf9df54a 100644 --- a/src/cli/sandbox-cli.ts +++ b/src/cli/sandbox-cli.ts @@ -68,7 +68,7 @@ export function registerSandboxCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/sandbox", "docs.clawd.bot/cli/sandbox")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/sandbox", "docs.molt.bot/cli/sandbox")}\n`, ) .action(() => { sandbox.help({ error: true }); diff --git a/src/cli/security-cli.ts b/src/cli/security-cli.ts index 2bd5a36b7..7a72ad6da 100644 --- a/src/cli/security-cli.ts +++ b/src/cli/security-cli.ts @@ -34,7 +34,7 @@ export function registerSecurityCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/security", "docs.clawd.bot/cli/security")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/security", "docs.molt.bot/cli/security")}\n`, ); security diff --git a/src/cli/skills-cli.ts b/src/cli/skills-cli.ts index 7488aee83..520b1a5c0 100644 --- a/src/cli/skills-cli.ts +++ b/src/cli/skills-cli.ts @@ -337,7 +337,7 @@ export function registerSkillsCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/skills", "docs.clawd.bot/cli/skills")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/skills", "docs.molt.bot/cli/skills")}\n`, ); skills diff --git a/src/cli/system-cli.ts b/src/cli/system-cli.ts index 4162c16de..9ade7aa15 100644 --- a/src/cli/system-cli.ts +++ b/src/cli/system-cli.ts @@ -23,7 +23,7 @@ export function registerSystemCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/system", "docs.clawd.bot/cli/system")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/system", "docs.molt.bot/cli/system")}\n`, ); addGatewayClientOptions( diff --git a/src/cli/tui-cli.ts b/src/cli/tui-cli.ts index 3fbf6bc86..795642410 100644 --- a/src/cli/tui-cli.ts +++ b/src/cli/tui-cli.ts @@ -20,7 +20,7 @@ export function registerTuiCli(program: Command) { .option("--history-limit ", "History entries to load", "200") .addHelpText( "after", - () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/tui", "docs.clawd.bot/cli/tui")}\n`, + () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/tui", "docs.molt.bot/cli/tui")}\n`, ) .action(async (opts) => { try { diff --git a/src/cli/update-cli.ts b/src/cli/update-cli.ts index 9e597e485..c80878f90 100644 --- a/src/cli/update-cli.ts +++ b/src/cli/update-cli.ts @@ -39,6 +39,7 @@ import { trimLogTail } from "../infra/restart-sentinel.js"; import { defaultRuntime } from "../runtime.js"; import { formatDocsLink } from "../terminal/links.js"; import { formatCliCommand } from "./command-format.js"; +import { replaceCliName, resolveCliName } from "./cli-name.js"; import { stylePromptHint, stylePromptMessage } from "../terminal/prompt-style.js"; import { theme } from "../terminal/theme.js"; import { renderTable } from "../terminal/table.js"; @@ -81,6 +82,7 @@ const STEP_LABELS: Record = { build: "Building", "ui:build": "Building UI", "clawdbot doctor": "Running doctor checks", + "moltbot doctor": "Running doctor checks", "git rev-parse HEAD (after)": "Verifying update", "global update": "Updating via package manager", "global install": "Installing global package", @@ -110,6 +112,9 @@ const UPDATE_QUIPS = [ ]; const MAX_LOG_CHARS = 8000; +const DEFAULT_PACKAGE_NAME = "moltbot"; +const CORE_PACKAGE_NAMES = new Set([DEFAULT_PACKAGE_NAME, "clawdbot"]); +const CLI_NAME = resolveCliName(); const CLAWDBOT_REPO_URL = "https://github.com/clawdbot/clawdbot.git"; const DEFAULT_GIT_DIR = path.join(os.homedir(), "clawdbot"); @@ -117,7 +122,11 @@ function normalizeTag(value?: string | null): string | null { if (!value) return null; const trimmed = value.trim(); if (!trimmed) return null; - return trimmed.startsWith("clawdbot@") ? trimmed.slice("clawdbot@".length) : trimmed; + if (trimmed.startsWith("clawdbot@")) return trimmed.slice("clawdbot@".length); + if (trimmed.startsWith(`${DEFAULT_PACKAGE_NAME}@`)) { + return trimmed.slice(`${DEFAULT_PACKAGE_NAME}@`.length); + } + return trimmed; } function pickUpdateQuip(): string { @@ -157,16 +166,22 @@ async function isGitCheckout(root: string): Promise { } } -async function isClawdbotPackage(root: string): Promise { +async function readPackageName(root: string): Promise { try { const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); const parsed = JSON.parse(raw) as { name?: string }; - return parsed?.name === "clawdbot"; + const name = parsed?.name?.trim(); + return name ? name : null; } catch { - return false; + return null; } } +async function isCorePackage(root: string): Promise { + const name = await readPackageName(root); + return Boolean(name && CORE_PACKAGE_NAMES.has(name)); +} + async function pathExists(targetPath: string): Promise { try { await fs.stat(targetPath); @@ -269,8 +284,8 @@ async function ensureGitCheckout(params: { }); } - if (!(await isClawdbotPackage(params.dir))) { - throw new Error(`CLAWDBOT_GIT_DIR does not look like a clawdbot checkout: ${params.dir}.`); + if (!(await isCorePackage(params.dir))) { + throw new Error(`CLAWDBOT_GIT_DIR does not look like a core checkout: ${params.dir}.`); } return null; @@ -691,10 +706,13 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise { return { stdout: res.stdout, stderr: res.stderr, code: res.code }; }; const pkgRoot = await resolveGlobalPackageRoot(manager, runCommand, timeoutMs ?? 20 * 60_000); + const packageName = + (pkgRoot ? await readPackageName(pkgRoot) : await readPackageName(root)) ?? + DEFAULT_PACKAGE_NAME; const beforeVersion = pkgRoot ? await readPackageVersion(pkgRoot) : null; const updateStep = await runUpdateStep({ name: "global update", - argv: globalInstallArgs(manager, `clawdbot@${tag}`), + argv: globalInstallArgs(manager, `${packageName}@${tag}`), timeoutMs: timeoutMs ?? 20 * 60_000, progress, }); @@ -705,7 +723,7 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise { const entryPath = path.join(pkgRoot, "dist", "entry.js"); if (await pathExists(entryPath)) { const doctorStep = await runUpdateStep({ - name: "clawdbot doctor", + name: `${CLI_NAME} doctor`, argv: [resolveNodeRunner(), entryPath, "doctor", "--non-interactive"], timeoutMs: timeoutMs ?? 20 * 60_000, progress, @@ -806,11 +824,13 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise { if (result.reason === "not-git-install") { defaultRuntime.log( theme.warn( - `Skipped: this Clawdbot install isn't a git checkout, and the package manager couldn't be detected. Update via your package manager, then run \`${formatCliCommand("clawdbot doctor")}\` and \`${formatCliCommand("clawdbot gateway restart")}\`.`, + `Skipped: this Clawdbot install isn't a git checkout, and the package manager couldn't be detected. Update via your package manager, then run \`${replaceCliName(formatCliCommand("clawdbot doctor"), CLI_NAME)}\` and \`${replaceCliName(formatCliCommand("clawdbot gateway restart"), CLI_NAME)}\`.`, ), ); defaultRuntime.log( - theme.muted("Examples: `npm i -g clawdbot@latest` or `pnpm add -g clawdbot@latest`"), + theme.muted( + `Examples: \`${replaceCliName("npm i -g clawdbot@latest", CLI_NAME)}\` or \`${replaceCliName("pnpm add -g clawdbot@latest", CLI_NAME)}\``, + ), ); } defaultRuntime.exit(0); @@ -926,7 +946,7 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise { defaultRuntime.log(theme.warn(`Daemon restart failed: ${String(err)}`)); defaultRuntime.log( theme.muted( - `You may need to restart the service manually: ${formatCliCommand("clawdbot gateway restart")}`, + `You may need to restart the service manually: ${replaceCliName(formatCliCommand("clawdbot gateway restart"), CLI_NAME)}`, ), ); } @@ -936,13 +956,13 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise { if (result.mode === "npm" || result.mode === "pnpm") { defaultRuntime.log( theme.muted( - `Tip: Run \`${formatCliCommand("clawdbot doctor")}\`, then \`${formatCliCommand("clawdbot gateway restart")}\` to apply updates to a running gateway.`, + `Tip: Run \`${replaceCliName(formatCliCommand("clawdbot doctor"), CLI_NAME)}\`, then \`${replaceCliName(formatCliCommand("clawdbot gateway restart"), CLI_NAME)}\` to apply updates to a running gateway.`, ), ); } else { defaultRuntime.log( theme.muted( - `Tip: Run \`${formatCliCommand("clawdbot gateway restart")}\` to apply updates to a running gateway.`, + `Tip: Run \`${replaceCliName(formatCliCommand("clawdbot gateway restart"), CLI_NAME)}\` to apply updates to a running gateway.`, ), ); } @@ -1137,7 +1157,7 @@ ${theme.heading("Notes:")} - Downgrades require confirmation (can break configuration) - Skips update if the working directory has uncommitted changes -${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.clawd.bot/cli/update")}`; +${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.molt.bot/cli/update")}`; }) .action(async (opts) => { try { @@ -1161,7 +1181,7 @@ ${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.clawd.bot/cli/upda .option("--timeout ", "Timeout for each update step in seconds (default: 1200)") .addHelpText( "after", - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.clawd.bot/cli/update")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.molt.bot/cli/update")}\n`, ) .action(async (opts) => { try { @@ -1188,7 +1208,7 @@ ${theme.muted("Docs:")} ${formatDocsLink("/cli/update", "docs.clawd.bot/cli/upda "- Shows current update channel (stable/beta/dev) and source", )}\n${theme.muted("- Includes git tag/branch/SHA for source checkouts")}\n\n${theme.muted( "Docs:", - )} ${formatDocsLink("/cli/update", "docs.clawd.bot/cli/update")}`, + )} ${formatDocsLink("/cli/update", "docs.molt.bot/cli/update")}`, ) .action(async (opts) => { try { diff --git a/src/cli/webhooks-cli.ts b/src/cli/webhooks-cli.ts index 08c77af4d..1792533c2 100644 --- a/src/cli/webhooks-cli.ts +++ b/src/cli/webhooks-cli.ts @@ -28,7 +28,7 @@ export function registerWebhooksCli(program: Command) { .addHelpText( "after", () => - `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/webhooks", "docs.clawd.bot/cli/webhooks")}\n`, + `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/webhooks", "docs.molt.bot/cli/webhooks")}\n`, ); const gmail = webhooks.command("gmail").description("Gmail Pub/Sub hooks (via gogcli)"); diff --git a/src/commands/agents.commands.add.ts b/src/commands/agents.commands.add.ts index 53b8ba049..5423ac79e 100644 --- a/src/commands/agents.commands.add.ts +++ b/src/commands/agents.commands.add.ts @@ -326,7 +326,7 @@ export async function agentsAddCommand( await prompter.note( [ "Routing unchanged. Add bindings when you're ready.", - "Docs: https://docs.clawd.bot/concepts/multi-agent", + "Docs: https://docs.molt.bot/concepts/multi-agent", ].join("\n"), "Routing", ); diff --git a/src/commands/auth-choice.apply.openai.ts b/src/commands/auth-choice.apply.openai.ts index 947b81181..d00208fab 100644 --- a/src/commands/auth-choice.apply.openai.ts +++ b/src/commands/auth-choice.apply.openai.ts @@ -138,7 +138,7 @@ export async function applyAuthChoiceOpenAI( spin.stop("OpenAI OAuth failed"); params.runtime.error(String(err)); await params.prompter.note( - "Trouble with OAuth? See https://docs.clawd.bot/start/faq", + "Trouble with OAuth? See https://docs.molt.bot/start/faq", "OAuth help", ); } diff --git a/src/commands/channels.adds-non-default-telegram-account.test.ts b/src/commands/channels.adds-non-default-telegram-account.test.ts index d5241a2fd..ff04b5c24 100644 --- a/src/commands/channels.adds-non-default-telegram-account.test.ts +++ b/src/commands/channels.adds-non-default-telegram-account.test.ts @@ -370,7 +370,7 @@ describe("channels command", () => { }); expect(lines.join("\n")).toMatch(/Warnings:/); expect(lines.join("\n")).toMatch(/Message Content Intent is disabled/i); - expect(lines.join("\n")).toMatch(/Run: clawdbot( --profile isolated)? doctor/); + expect(lines.join("\n")).toMatch(/Run: (?:clawdbot|moltbot)( --profile isolated)? doctor/); }); it("surfaces Discord permission audit issues in channels status output", () => { diff --git a/src/commands/configure.gateway.ts b/src/commands/configure.gateway.ts index d572e54a9..273231f31 100644 --- a/src/commands/configure.gateway.ts +++ b/src/commands/configure.gateway.ts @@ -139,9 +139,7 @@ export async function promptGatewayConfig( let tailscaleResetOnExit = false; if (tailscaleMode !== "off") { note( - ["Docs:", "https://docs.clawd.bot/gateway/tailscale", "https://docs.clawd.bot/web"].join( - "\n", - ), + ["Docs:", "https://docs.molt.bot/gateway/tailscale", "https://docs.molt.bot/web"].join("\n"), "Tailscale", ); tailscaleResetOnExit = Boolean( diff --git a/src/commands/configure.wizard.ts b/src/commands/configure.wizard.ts index 7563643e1..535efef31 100644 --- a/src/commands/configure.wizard.ts +++ b/src/commands/configure.wizard.ts @@ -100,7 +100,7 @@ async function promptWebToolsConfig( [ "Web search lets your agent look things up online using the `web_search` tool.", "It requires a Brave Search API key (you can store it in the config or set BRAVE_API_KEY in the Gateway environment).", - "Docs: https://docs.clawd.bot/tools/web", + "Docs: https://docs.molt.bot/tools/web", ].join("\n"), "Web search", ); @@ -136,7 +136,7 @@ async function promptWebToolsConfig( [ "No key stored yet, so web_search will stay unavailable.", "Store a key here or set BRAVE_API_KEY in the Gateway environment.", - "Docs: https://docs.clawd.bot/tools/web", + "Docs: https://docs.molt.bot/tools/web", ].join("\n"), "Web search", ); @@ -189,7 +189,7 @@ export async function runConfigureWizard( [ ...snapshot.issues.map((iss) => `- ${iss.path}: ${iss.message}`), "", - "Docs: https://docs.clawd.bot/gateway/configuration", + "Docs: https://docs.molt.bot/gateway/configuration", ].join("\n"), "Config issues", ); @@ -393,8 +393,8 @@ export async function runConfigureWizard( note( [ "Docs:", - "https://docs.clawd.bot/gateway/health", - "https://docs.clawd.bot/gateway/troubleshooting", + "https://docs.molt.bot/gateway/health", + "https://docs.molt.bot/gateway/troubleshooting", ].join("\n"), "Health check help", ); @@ -518,8 +518,8 @@ export async function runConfigureWizard( note( [ "Docs:", - "https://docs.clawd.bot/gateway/health", - "https://docs.clawd.bot/gateway/troubleshooting", + "https://docs.molt.bot/gateway/health", + "https://docs.molt.bot/gateway/troubleshooting", ].join("\n"), "Health check help", ); @@ -577,7 +577,7 @@ export async function runConfigureWizard( `Web UI: ${links.httpUrl}`, `Gateway WS: ${links.wsUrl}`, gatewayStatusLine, - "Docs: https://docs.clawd.bot/web/control-ui", + "Docs: https://docs.molt.bot/web/control-ui", ].join("\n"), "Control UI", ); diff --git a/src/commands/daemon-install-helpers.test.ts b/src/commands/daemon-install-helpers.test.ts index e3b873737..179da04a2 100644 --- a/src/commands/daemon-install-helpers.test.ts +++ b/src/commands/daemon-install-helpers.test.ts @@ -235,7 +235,7 @@ describe("gatewayInstallErrorHint", () => { it("returns platform-specific hints", () => { expect(gatewayInstallErrorHint("win32")).toContain("Run as administrator"); expect(gatewayInstallErrorHint("linux")).toMatch( - /clawdbot( --profile isolated)? gateway install/, + /(?:clawdbot|moltbot)( --profile isolated)? gateway install/, ); }); }); diff --git a/src/commands/docs.ts b/src/commands/docs.ts index 4ca479f65..d0f01ce6e 100644 --- a/src/commands/docs.ts +++ b/src/commands/docs.ts @@ -5,7 +5,7 @@ import { formatDocsLink } from "../terminal/links.js"; import { isRich, theme } from "../terminal/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; -const SEARCH_TOOL = "https://docs.clawd.bot/mcp.SearchClawdbot"; +const SEARCH_TOOL = "https://docs.molt.bot/mcp.SearchClawdbot"; const SEARCH_TIMEOUT_MS = 30_000; const DEFAULT_SNIPPET_MAX = 220; @@ -148,12 +148,12 @@ async function renderMarkdown(markdown: string, runtime: RuntimeEnv) { export async function docsSearchCommand(queryParts: string[], runtime: RuntimeEnv) { const query = queryParts.join(" ").trim(); if (!query) { - const docs = formatDocsLink("/", "docs.clawd.bot"); + const docs = formatDocsLink("/", "docs.molt.bot"); if (isRich()) { runtime.log(`${theme.muted("Docs:")} ${docs}`); runtime.log(`${theme.muted("Search:")} ${formatCliCommand('clawdbot docs "your query"')}`); } else { - runtime.log("Docs: https://docs.clawd.bot/"); + runtime.log("Docs: https://docs.molt.bot/"); runtime.log(`Search: ${formatCliCommand('clawdbot docs "your query"')}`); } return; diff --git a/src/commands/onboard-helpers.ts b/src/commands/onboard-helpers.ts index dd8288a60..27c74ae00 100644 --- a/src/commands/onboard-helpers.ts +++ b/src/commands/onboard-helpers.ts @@ -177,8 +177,8 @@ export function formatControlUiSshHint(params: { localUrl, authedUrl, "Docs:", - "https://docs.clawd.bot/gateway/remote", - "https://docs.clawd.bot/web/control-ui", + "https://docs.molt.bot/gateway/remote", + "https://docs.molt.bot/web/control-ui", ] .filter(Boolean) .join("\n"); diff --git a/src/commands/onboard-hooks.test.ts b/src/commands/onboard-hooks.test.ts index 10c99140a..e83f61399 100644 --- a/src/commands/onboard-hooks.test.ts +++ b/src/commands/onboard-hooks.test.ts @@ -239,7 +239,7 @@ describe("onboard-hooks", () => { // Second note should confirm configuration expect(noteCalls[1][0]).toContain("Enabled 1 hook: session-memory"); - expect(noteCalls[1][0]).toMatch(/clawdbot( --profile isolated)? hooks list/); + expect(noteCalls[1][0]).toMatch(/(?:clawdbot|moltbot)( --profile isolated)? hooks list/); }); }); }); diff --git a/src/commands/onboard-hooks.ts b/src/commands/onboard-hooks.ts index 10cdf1293..9fcc322a7 100644 --- a/src/commands/onboard-hooks.ts +++ b/src/commands/onboard-hooks.ts @@ -15,7 +15,7 @@ export async function setupInternalHooks( "Hooks let you automate actions when agent commands are issued.", "Example: Save session context to memory when you issue /new.", "", - "Learn more: https://docs.clawd.bot/hooks", + "Learn more: https://docs.molt.bot/hooks", ].join("\n"), "Hooks", ); diff --git a/src/commands/onboard-non-interactive/local.ts b/src/commands/onboard-non-interactive/local.ts index 8701bac7a..ec78dfba9 100644 --- a/src/commands/onboard-non-interactive/local.ts +++ b/src/commands/onboard-non-interactive/local.ts @@ -125,7 +125,7 @@ export async function runNonInteractiveOnboardingLocal(params: { if (!opts.json) { runtime.log( - `Tip: run \`${formatCliCommand("clawdbot configure --section web")}\` to store your Brave API key for web_search. Docs: https://docs.clawd.bot/tools/web`, + `Tip: run \`${formatCliCommand("clawdbot configure --section web")}\` to store your Brave API key for web_search. Docs: https://docs.molt.bot/tools/web`, ); } } diff --git a/src/commands/onboard-non-interactive/remote.ts b/src/commands/onboard-non-interactive/remote.ts index 1426448fc..6807434e0 100644 --- a/src/commands/onboard-non-interactive/remote.ts +++ b/src/commands/onboard-non-interactive/remote.ts @@ -47,7 +47,7 @@ export async function runNonInteractiveOnboardingRemote(params: { runtime.log(`Remote gateway: ${remoteUrl}`); runtime.log(`Auth: ${payload.auth}`); runtime.log( - `Tip: run \`${formatCliCommand("clawdbot configure --section web")}\` to store your Brave API key for web_search. Docs: https://docs.clawd.bot/tools/web`, + `Tip: run \`${formatCliCommand("clawdbot configure --section web")}\` to store your Brave API key for web_search. Docs: https://docs.molt.bot/tools/web`, ); } } diff --git a/src/commands/onboard-remote.ts b/src/commands/onboard-remote.ts index 24c8773c8..cb71cabdf 100644 --- a/src/commands/onboard-remote.ts +++ b/src/commands/onboard-remote.ts @@ -43,7 +43,7 @@ export async function promptRemoteGatewayConfig( await prompter.note( [ "Bonjour discovery requires dns-sd (macOS) or avahi-browse (Linux).", - "Docs: https://docs.clawd.bot/gateway/discovery", + "Docs: https://docs.molt.bot/gateway/discovery", ].join("\n"), "Discovery", ); @@ -96,7 +96,7 @@ export async function promptRemoteGatewayConfig( `ssh -N -L 18789:127.0.0.1:18789 @${host}${ selectedBeacon.sshPort ? ` -p ${selectedBeacon.sshPort}` : "" }`, - "Docs: https://docs.clawd.bot/gateway/remote", + "Docs: https://docs.molt.bot/gateway/remote", ].join("\n"), "SSH tunnel", ); diff --git a/src/commands/onboard-skills.ts b/src/commands/onboard-skills.ts index ce3b06123..8d90dccee 100644 --- a/src/commands/onboard-skills.ts +++ b/src/commands/onboard-skills.ts @@ -156,7 +156,7 @@ export async function setupSkills( runtime.log( `Tip: run \`${formatCliCommand("clawdbot doctor")}\` to review skills + requirements.`, ); - runtime.log("Docs: https://docs.clawd.bot/skills"); + runtime.log("Docs: https://docs.molt.bot/skills"); } } } diff --git a/src/commands/onboard.ts b/src/commands/onboard.ts index 348aca613..6ede2b768 100644 --- a/src/commands/onboard.ts +++ b/src/commands/onboard.ts @@ -44,7 +44,7 @@ export async function onboardCommand(opts: OnboardOptions, runtime: RuntimeEnv = runtime.error( [ "Non-interactive onboarding requires explicit risk acknowledgement.", - "Read: https://docs.clawd.bot/security", + "Read: https://docs.molt.bot/security", `Re-run with: ${formatCliCommand("clawdbot onboard --non-interactive --accept-risk ...")}`, ].join("\n"), ); @@ -65,7 +65,7 @@ export async function onboardCommand(opts: OnboardOptions, runtime: RuntimeEnv = [ "Windows detected.", "WSL2 is strongly recommended; native Windows is untested and more problematic.", - "Guide: https://docs.clawd.bot/windows", + "Guide: https://docs.molt.bot/windows", ].join("\n"), ); } diff --git a/src/commands/sandbox-explain.test.ts b/src/commands/sandbox-explain.test.ts index d3e5ea2ee..a2fa611d8 100644 --- a/src/commands/sandbox-explain.test.ts +++ b/src/commands/sandbox-explain.test.ts @@ -36,7 +36,7 @@ describe("sandbox explain command", () => { const out = logs.join(""); const parsed = JSON.parse(out); - expect(parsed).toHaveProperty("docsUrl", "https://docs.clawd.bot/sandbox"); + expect(parsed).toHaveProperty("docsUrl", "https://docs.molt.bot/sandbox"); expect(parsed).toHaveProperty("sandbox.mode", "all"); expect(parsed).toHaveProperty("sandbox.tools.sources.allow.source"); expect(Array.isArray(parsed.fixIt)).toBe(true); diff --git a/src/commands/sandbox-explain.ts b/src/commands/sandbox-explain.ts index daaa9e483..f7c4c1cdb 100644 --- a/src/commands/sandbox-explain.ts +++ b/src/commands/sandbox-explain.ts @@ -30,7 +30,7 @@ type SandboxExplainOptions = { json: boolean; }; -const SANDBOX_DOCS_URL = "https://docs.clawd.bot/sandbox"; +const SANDBOX_DOCS_URL = "https://docs.molt.bot/sandbox"; function normalizeExplainSessionKey(params: { cfg: ClawdbotConfig; @@ -307,7 +307,7 @@ export async function sandboxExplainCommand( lines.push(heading("Fix-it:")); for (const key of payload.fixIt) lines.push(` - ${key}`); lines.push(""); - lines.push(`${key("Docs:")} ${formatDocsLink("/sandbox", "docs.clawd.bot/sandbox")}`); + lines.push(`${key("Docs:")} ${formatDocsLink("/sandbox", "docs.molt.bot/sandbox")}`); runtime.log(`${lines.join("\n")}\n`); } diff --git a/src/commands/status-all/diagnosis.ts b/src/commands/status-all/diagnosis.ts index 90912da1b..5e73e3743 100644 --- a/src/commands/status-all/diagnosis.ts +++ b/src/commands/status-all/diagnosis.ts @@ -234,6 +234,6 @@ export async function appendStatusAllDiagnosis(params: { lines.push(""); lines.push(muted("Pasteable debug report. Auth tokens redacted.")); - lines.push("Troubleshooting: https://docs.clawd.bot/troubleshooting"); + lines.push("Troubleshooting: https://docs.molt.bot/troubleshooting"); lines.push(""); } diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index 1ce771ac8..c36b91c99 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -560,8 +560,8 @@ export async function statusCommand( } runtime.log(""); - runtime.log("FAQ: https://docs.clawd.bot/faq"); - runtime.log("Troubleshooting: https://docs.clawd.bot/troubleshooting"); + runtime.log("FAQ: https://docs.molt.bot/faq"); + runtime.log("Troubleshooting: https://docs.molt.bot/troubleshooting"); runtime.log(""); const updateHint = formatUpdateAvailableHint(update); if (updateHint) { diff --git a/src/commands/status.test.ts b/src/commands/status.test.ts index ca9d8ae96..047f43a07 100644 --- a/src/commands/status.test.ts +++ b/src/commands/status.test.ts @@ -330,6 +330,8 @@ describe("statusCommand", () => { expect( logs.some( (l) => + l.includes("moltbot status --all") || + l.includes("moltbot --profile isolated status --all") || l.includes("clawdbot status --all") || l.includes("clawdbot --profile isolated status --all"), ), diff --git a/src/hooks/bundled/README.md b/src/hooks/bundled/README.md index 48ad5ea95..77df25ee4 100644 --- a/src/hooks/bundled/README.md +++ b/src/hooks/bundled/README.md @@ -39,7 +39,7 @@ Swaps injected `SOUL.md` content with `SOUL_EVIL.md` during a purge window or by **Events**: `agent:bootstrap` **What it does**: Overrides the injected SOUL content before the system prompt is built. **Output**: No files written; swaps happen in-memory only. -**Docs**: https://docs.clawd.bot/hooks/soul-evil +**Docs**: https://docs.molt.bot/hooks/soul-evil **Enable**: @@ -82,7 +82,7 @@ session-memory/ --- name: my-hook description: "Short description" -homepage: https://docs.clawd.bot/hooks#my-hook +homepage: https://docs.molt.bot/hooks#my-hook metadata: { "clawdbot": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } } --- @@ -221,4 +221,4 @@ Test your hooks by: ## Documentation -Full documentation: https://docs.clawd.bot/hooks +Full documentation: https://docs.molt.bot/hooks diff --git a/src/hooks/bundled/boot-md/HOOK.md b/src/hooks/bundled/boot-md/HOOK.md index dac210b62..2572c50cc 100644 --- a/src/hooks/bundled/boot-md/HOOK.md +++ b/src/hooks/bundled/boot-md/HOOK.md @@ -1,7 +1,7 @@ --- name: boot-md description: "Run BOOT.md on gateway startup" -homepage: https://docs.clawd.bot/hooks#boot-md +homepage: https://docs.molt.bot/hooks#boot-md metadata: { "clawdbot": diff --git a/src/hooks/bundled/command-logger/HOOK.md b/src/hooks/bundled/command-logger/HOOK.md index 10034fab8..bf33cdeff 100644 --- a/src/hooks/bundled/command-logger/HOOK.md +++ b/src/hooks/bundled/command-logger/HOOK.md @@ -1,7 +1,7 @@ --- name: command-logger description: "Log all command events to a centralized audit file" -homepage: https://docs.clawd.bot/hooks#command-logger +homepage: https://docs.molt.bot/hooks#command-logger metadata: { "clawdbot": diff --git a/src/hooks/bundled/session-memory/HOOK.md b/src/hooks/bundled/session-memory/HOOK.md index cc3eab0a2..bb3ac1468 100644 --- a/src/hooks/bundled/session-memory/HOOK.md +++ b/src/hooks/bundled/session-memory/HOOK.md @@ -1,7 +1,7 @@ --- name: session-memory description: "Save session context to memory when /new command is issued" -homepage: https://docs.clawd.bot/hooks#session-memory +homepage: https://docs.molt.bot/hooks#session-memory metadata: { "clawdbot": diff --git a/src/hooks/bundled/soul-evil/HOOK.md b/src/hooks/bundled/soul-evil/HOOK.md index 776163bd0..7bb50620b 100644 --- a/src/hooks/bundled/soul-evil/HOOK.md +++ b/src/hooks/bundled/soul-evil/HOOK.md @@ -1,7 +1,7 @@ --- name: soul-evil description: "Swap SOUL.md with SOUL_EVIL.md during a purge window or by random chance" -homepage: https://docs.clawd.bot/hooks/soul-evil +homepage: https://docs.molt.bot/hooks/soul-evil metadata: { "clawdbot": diff --git a/src/hooks/bundled/soul-evil/README.md b/src/hooks/bundled/soul-evil/README.md index 3f0e09a85..a49bfe33d 100644 --- a/src/hooks/bundled/soul-evil/README.md +++ b/src/hooks/bundled/soul-evil/README.md @@ -2,7 +2,7 @@ Small persona swap hook for Clawdbot. -Docs: https://docs.clawd.bot/hooks/soul-evil +Docs: https://docs.molt.bot/hooks/soul-evil ## Setup diff --git a/src/hooks/frontmatter.test.ts b/src/hooks/frontmatter.test.ts index 761eaa75f..91545796d 100644 --- a/src/hooks/frontmatter.test.ts +++ b/src/hooks/frontmatter.test.ts @@ -233,7 +233,7 @@ describe("resolveClawdbotMetadata", () => { const content = `--- name: session-memory description: "Save session context to memory when /new command is issued" -homepage: https://docs.clawd.bot/hooks#session-memory +homepage: https://docs.molt.bot/hooks#session-memory metadata: { "clawdbot": diff --git a/src/infra/clawdbot-root.ts b/src/infra/clawdbot-root.ts index 9a3443ffb..d7d20467f 100644 --- a/src/infra/clawdbot-root.ts +++ b/src/infra/clawdbot-root.ts @@ -2,6 +2,8 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; +const CORE_PACKAGE_NAMES = new Set(["moltbot", "clawdbot"]); + async function readPackageName(dir: string): Promise { try { const raw = await fs.readFile(path.join(dir, "package.json"), "utf-8"); @@ -16,7 +18,7 @@ async function findPackageRoot(startDir: string, maxDepth = 12): Promise { @@ -714,7 +732,8 @@ export async function runGatewayUpdate(opts: UpdateRunnerOptions = {}): Promise< const beforeVersion = await readPackageVersion(pkgRoot); const globalManager = await detectGlobalInstallManagerForRoot(runCommand, pkgRoot, timeoutMs); if (globalManager) { - const spec = `clawdbot@${normalizeTag(opts.tag)}`; + const packageName = (await readPackageName(pkgRoot)) ?? DEFAULT_PACKAGE_NAME; + const spec = `${packageName}@${normalizeTag(opts.tag)}`; const updateStep = await runStep({ runCommand, name: "global update", diff --git a/src/pairing/pairing-messages.test.ts b/src/pairing/pairing-messages.test.ts index 416a6ab19..1997a0e30 100644 --- a/src/pairing/pairing-messages.test.ts +++ b/src/pairing/pairing-messages.test.ts @@ -52,9 +52,10 @@ describe("buildPairingReply", () => { expect(text).toContain(testCase.idLine); expect(text).toContain(`Pairing code: ${testCase.code}`); // CLI commands should respect CLAWDBOT_PROFILE when set (most tests run with isolated profile) - expect(text).toContain( - `clawdbot --profile isolated pairing approve ${testCase.channel} `, + const commandRe = new RegExp( + `(?:clawdbot|moltbot) --profile isolated pairing approve ${testCase.channel} `, ); + expect(text).toMatch(commandRe); }); } }); diff --git a/src/plugins/loader.ts b/src/plugins/loader.ts index 931c15d59..178e2d3c2 100644 --- a/src/plugins/loader.ts +++ b/src/plugins/loader.ts @@ -206,7 +206,14 @@ export function loadClawdbotPlugins(options: PluginLoadOptions = {}): PluginRegi const jiti = createJiti(import.meta.url, { interopDefault: true, extensions: [".ts", ".tsx", ".mts", ".cts", ".mtsx", ".ctsx", ".js", ".mjs", ".cjs", ".json"], - ...(pluginSdkAlias ? { alias: { "clawdbot/plugin-sdk": pluginSdkAlias } } : {}), + ...(pluginSdkAlias + ? { + alias: { + "clawdbot/plugin-sdk": pluginSdkAlias, + "moltbot/plugin-sdk": pluginSdkAlias, + }, + } + : {}), }); const manifestByRoot = new Map( diff --git a/src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts b/src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts index 165488426..58ecc8d7a 100644 --- a/src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts +++ b/src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts @@ -105,7 +105,8 @@ vi.mock("../auto-reply/reply.js", () => { }); describe("telegram inbound media", () => { - const INBOUND_MEDIA_TEST_TIMEOUT_MS = process.platform === "win32" ? 30_000 : 20_000; + // Parallel vitest shards can make this suite slower than the standalone run. + const INBOUND_MEDIA_TEST_TIMEOUT_MS = process.platform === "win32" ? 60_000 : 45_000; it( "downloads media via file_path (no file.download)", diff --git a/src/terminal/links.ts b/src/terminal/links.ts index b26ff37bb..0d965633a 100644 --- a/src/terminal/links.ts +++ b/src/terminal/links.ts @@ -1,6 +1,6 @@ import { formatTerminalLink } from "../utils.js"; -export const DOCS_ROOT = "https://docs.clawd.bot"; +export const DOCS_ROOT = "https://docs.molt.bot"; export function formatDocsLink( path: string, diff --git a/src/wizard/onboarding.finalize.ts b/src/wizard/onboarding.finalize.ts index 32ab53dcf..670b4eaf6 100644 --- a/src/wizard/onboarding.finalize.ts +++ b/src/wizard/onboarding.finalize.ts @@ -214,8 +214,8 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption await prompter.note( [ "Docs:", - "https://docs.clawd.bot/gateway/health", - "https://docs.clawd.bot/gateway/troubleshooting", + "https://docs.molt.bot/gateway/health", + "https://docs.molt.bot/gateway/troubleshooting", ].join("\n"), "Health check help", ); @@ -277,7 +277,7 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption tokenParam ? `Web UI (with token): ${authedUrl}` : undefined, `Gateway WS: ${links.wsUrl}`, gatewayStatusLine, - "Docs: https://docs.clawd.bot/web/control-ui", + "Docs: https://docs.molt.bot/web/control-ui", ] .filter(Boolean) .join("\n"), @@ -383,14 +383,14 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption } await prompter.note( - ["Back up your agent workspace.", "Docs: https://docs.clawd.bot/concepts/agent-workspace"].join( + ["Back up your agent workspace.", "Docs: https://docs.molt.bot/concepts/agent-workspace"].join( "\n", ), "Workspace backup", ); await prompter.note( - "Running agents on your computer is risky — harden your setup: https://docs.clawd.bot/security", + "Running agents on your computer is risky — harden your setup: https://docs.molt.bot/security", "Security", ); @@ -443,7 +443,7 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption webSearchKey ? "API key: stored in config (tools.web.search.apiKey)." : "API key: provided via BRAVE_API_KEY env var (Gateway environment).", - "Docs: https://docs.clawd.bot/tools/web", + "Docs: https://docs.molt.bot/tools/web", ].join("\n") : [ "If you want your agent to be able to search the web, you’ll need an API key.", @@ -455,13 +455,13 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption "- Enable web_search and paste your Brave Search API key", "", "Alternative: set BRAVE_API_KEY in the Gateway environment (no config changes).", - "Docs: https://docs.clawd.bot/tools/web", + "Docs: https://docs.molt.bot/tools/web", ].join("\n"), "Web search (optional)", ); await prompter.note( - 'What now: https://clawd.bot/showcase ("What People Are Building").', + 'What now: https://molt.bot/showcase ("What People Are Building").', "What now", ); diff --git a/src/wizard/onboarding.gateway-config.ts b/src/wizard/onboarding.gateway-config.ts index c68836b32..f8d56af62 100644 --- a/src/wizard/onboarding.gateway-config.ts +++ b/src/wizard/onboarding.gateway-config.ts @@ -145,9 +145,7 @@ export async function configureGatewayForOnboarding( let tailscaleResetOnExit = flow === "quickstart" ? quickstartGateway.tailscaleResetOnExit : false; if (tailscaleMode !== "off" && flow !== "quickstart") { await prompter.note( - ["Docs:", "https://docs.clawd.bot/gateway/tailscale", "https://docs.clawd.bot/web"].join( - "\n", - ), + ["Docs:", "https://docs.molt.bot/gateway/tailscale", "https://docs.molt.bot/web"].join("\n"), "Tailscale", ); tailscaleResetOnExit = Boolean( diff --git a/src/wizard/onboarding.ts b/src/wizard/onboarding.ts index 39d17befa..52f9285aa 100644 --- a/src/wizard/onboarding.ts +++ b/src/wizard/onboarding.ts @@ -70,7 +70,7 @@ async function requireRiskAcknowledgement(params: { "clawdbot security audit --deep", "clawdbot security audit --fix", "", - "Must read: https://docs.clawd.bot/gateway/security", + "Must read: https://docs.molt.bot/gateway/security", ].join("\n"), "Security", ); @@ -103,7 +103,7 @@ export async function runOnboardingWizard( [ ...snapshot.issues.map((iss) => `- ${iss.path}: ${iss.message}`), "", - "Docs: https://docs.clawd.bot/gateway/configuration", + "Docs: https://docs.molt.bot/gateway/configuration", ].join("\n"), "Config issues", ); diff --git a/ui/src/ui/app-render.ts b/ui/src/ui/app-render.ts index fe67c86f1..49f72de8c 100644 --- a/ui/src/ui/app-render.ts +++ b/ui/src/ui/app-render.ts @@ -180,7 +180,7 @@ export function renderApp(state: AppViewState) {