- Detect when ngrok URL changes and prompt user to update Google Chat
- Save URL to ~/.clawdbot-googlechat-url for comparison
- Add clear instructions when URL update is needed
- Skip update prompt when URL hasn't changed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add run-webhook.ts for handling Google Chat messages via HTTP webhook
- Add webhook-server.ts for full Clawdbot integration
- Add start-googlechat.sh startup script for easy launching
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add Google Chat as the 8th messaging platform, using Pub/Sub for inbound
messages and the Google Chat API for outbound. This enables messaging
with Clawbot via Google Workspace's Google Chat.
Features:
- Pub/Sub-based message monitoring (firewall-friendly)
- Direct message and space support
- Thread support
- Media via cards
- DM/space policy configuration
- Multi-account support
Requires:
- Google Workspace account (not @gmail.com)
- Google Cloud project with Chat API and Pub/Sub enabled
- Service account credentials
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace free functions with IncludeProcessor class
- Simplify IncludeResolver interface: { readFile, parseJson }
- Break down loadFile into focused private methods
- Use reduce() for array include merging
- Cleaner separation of concerns
- Move $include resolution to src/config/includes.ts
- Simplify io.ts by importing from includes module
- Cleaner API: resolveConfigIncludes(obj, configPath, resolver?)
- Re-export errors from io.ts for backwards compatibility
- Rename test file to match module name
Adds support for splitting clawdbot.json into multiple files using the
$include directive. This enables:
- Single file includes: { "$include": "./agents.json5" }
- Multiple file merging: { "$include": ["./a.json5", "./b.json5"] }
- Nested includes (up to 10 levels deep)
- Sibling key merging with includes
Features:
- Relative paths resolved from including file
- Absolute paths supported
- Circular include detection
- Clear error messages with resolved paths
Use case: Per-client agent configs for isolated sandboxed environments
(e.g., legal case management with strict data separation).
- Use resolveExtraParams() which was defined but unused
- Create streamFn wrapper that injects config-driven params
- Apply to both compaction and run sessions
Config path: agents.defaults.models["provider/model"].params.temperature
Example:
agents.defaults.models["anthropic/claude-sonnet-4"].params.temperature = 0.7
agents.defaults.models["openai/gpt-4"].params.maxTokens = 8192
Tiny readme change that makes it less confusing.
The section title being "macOS app" makes it seem like the app is mandatory, when it is optional. Updated it to just "Apps"