The tests updated in b151b8d19 expect --profile isolated in CLI
output, but CLAWDBOT_PROFILE was not being set in the test
environment. This fix ensures the test environment sets
CLAWDBOT_PROFILE=isolated so formatCliCommand includes the
profile flag in its output.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Restructure the SMS channel extension to follow the voice-call pattern:
- Rename from "plivo" to "sms" (technology-based naming)
- Add provider abstraction (SMSProvider interface)
- Implement PlivoProvider and MockProvider
- Support for future providers (Twilio, etc.)
This makes the extension more extensible and consistent with
the voice-call extension architecture.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move clawdbot to devDependencies (avoid workspace:* in deps per repo guidelines)
- Remove unnecessary files (tsconfig.json, .gitignore, package-lock.json)
- Update pnpm-lock.yaml with plivo dependencies
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a new channel extension for Plivo SMS/MMS messaging, enabling
universal phone-based access to Clawdbot from any device.
Features:
- Two-way SMS messaging via Plivo API
- MMS media support (images, videos, documents)
- Quick command shortcuts (e.g., "cal" -> "show my calendar")
- Auto-configuration of Plivo webhooks on startup
- Multi-account support
- DM policies (pairing, allowlist, open)
Implements ideas 3.1, 3.3, 3.4, 3.7 from PLIVO_INTEGRATION_IDEAS.md:
- 3.1 SMS Channel Adapter
- 3.3 Quick Commands via SMS
- 3.4 MMS Media Sharing
- 3.7 Critical Alerts via SMS
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
These files are generated at build time and shouldn't be committed:
- dist/control-ui assets (JS/CSS bundles)
- src/canvas-host/a2ui bundle files
This removes ~100MB+ of bloat from git history by no longer tracking
repeatedly regenerated bundle files. Add to .gitignore to prevent
accidental re-addition.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(agents): skip cooldowned providers during failover
When all auth profiles for a provider are in cooldown, the failover
mechanism now skips that provider immediately rather than attempting
and waiting for the cooldown error. This prevents long delays when
multiple OAuth providers fail in sequence.
* fix(agents): correct imports and API usage for cooldown check
Wrap all bot.api.sendXxx() media calls in delivery.ts with error handler
that logs failures before re-throwing. This ensures network failures are
properly logged with context instead of causing unhandled promise rejections
that crash the gateway.
Also wrap the fetch() call in telegram onboarding with try/catch to
gracefully handle network errors during username lookup.
Fixes#2487
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(tts): generate audio when block streaming drops final reply
When block streaming succeeds, final replies are dropped but TTS was only
applied to final replies. Fix by accumulating block text during streaming
and generating TTS-only audio after streaming completes.
Also:
- Change truncate vs skip behavior when summary OFF (now truncates)
- Align TTS limits with Telegram max (4096 chars)
- Improve /tts command help messages with examples
- Add newline separator between accumulated blocks
* fix(tts): add error handling for accumulated block TTS
* feat(tts): add descriptive inline menu with action descriptions
- Add value/label support for command arg choices
- TTS menu now shows descriptive title listing each action
- Capitalize button labels (On, Off, Status, etc.)
- Update Telegram, Discord, and Slack handlers to use labels
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(gateway): gracefully handle AbortError and transient network errors
Addresses issues #1851, #1997, and #2034.
During config reload (SIGUSR1), in-flight requests are aborted, causing
AbortError exceptions. Similarly, transient network errors (fetch failed,
ECONNRESET, ETIMEDOUT, etc.) can crash the gateway unnecessarily.
This change:
- Adds isAbortError() to detect intentional cancellations
- Adds isTransientNetworkError() to detect temporary connectivity issues
- Logs these errors appropriately instead of crashing
- Handles nested cause chains and AggregateError
AbortError is logged as a warning (expected during shutdown).
Network errors are logged as non-fatal errors (will resolve on their own).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(test): update commands-registry test expectations
Update test expectations to match new ResolvedCommandArgChoice format
(choices now return {label, value} objects instead of plain strings).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: harden unhandled rejection handling and tts menus (#2451) (thanks @Glucksberg)
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Shadow <hi@shadowing.dev>
Adds process exit handlers to release all held session locks on:
- Normal process.exit() calls
- SIGTERM / SIGINT signals
This ensures locks are cleaned up even when the process terminates
unexpectedly, preventing the 'session file locked' error.
* bugfix:The Mintlify navbar (logo + search bar with ⌘K) scrolls away when scrolling down the documentation, so it disappears from view.
* fix(docs): keep navbar visible on scroll (#2445) (thanks @chenyuan99)
---------
Co-authored-by: vignesh07 <vigneshnatarajan92@gmail.com>
Fedora and some other distros install Node.js with a version suffix
(e.g., /usr/bin/node-22) and create a symlink from /usr/bin/node.
When Node resolves process.execPath, it returns the real binary path,
not the symlink, causing buildParseArgv to fail the looksLikeNode check.
This adds executable.startsWith('node-') to handle versioned binaries.
Fixes#2442