- Fix DeepLinkSheet import: com.clawdbot → bot.molt
- Remove duplicate helper functions from NodeGatewaySync.kt
- Make shared helpers internal in NodeRuntime.kt
- Rename a2ui constants to uppercase (A2UI_READY_CHECK_JS, A2UI_RESET_JS)
- Add missing padding/size imports in SettingsSheet.kt
- Update EncryptedSharedPreferences to use MasterKey API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This placeholder config allows Android CI builds to compile without
real Firebase credentials. For production builds, replace with actual
google-services.json from Firebase Console.
FCM push notifications will not work with this placeholder config.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix formatting in session-utils.store.ts
- Regenerate Swift protocol files with TOO_MANY_REQUESTS error code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix all 7 issues identified in the ChatGPT audit of transformation work:
1. Android build break: Remove duplicate normalizeMainKey/isCanonicalMainSessionKey
from NodeGatewaySync.kt (they're already in SessionKey.kt). Align both Android
and iOS implementations to use "main" as canonical (case-insensitive match).
2. Rate limiting: Wire rateLimiter through GatewayRequestContext and enforce:
- Auth failure backoff (recordAuthFailure on auth failure, clearAuthFailure on success)
- Request rate limiting before handleGatewayRequest
- Channel message rate limiting in send handler
- Add TOO_MANY_REQUESTS error code
3. Injection defenses: Call sanitizeIncomingMessage in chat.send and chat.inject
handlers to detect prompt injection attempts.
4. RBAC enforcement: Add canAccessAgent check in chat.send handler and
canExecuteCommand check in node-host runner for exec commands.
5. WhatsApp encrypted backup restore: Update maybeRestoreCredsFromBackup to
handle encrypted backup files (.bak.enc -> .json.enc restoration).
6. Exec blocklist bypass: Add evaluateBlocklist check in argv-only code path
in runner.ts (previously only checked for rawCommand path).
7. iOS voice transcript: Fix line 329 in NodeAppModel.swift to use computed
'key' variable instead of original 'sessionKey' parameter.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When the user sends a message while reading older messages, scroll to
bottom so they can see their sent message and the response.
Fixes#2470
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixed issue where trigger words would disappear when typing or when adding new trigger words. The problem was that `swabbleTriggerWords` changes were triggering `VoiceWakeRuntime.refresh()` which sanitized the array by removing empty strings in real-time.
Solution: Introduced local `@State` buffer `triggerEntries` with stable UUID identifiers for each trigger word entry. User edits now only affect the local state buffer and are synced back to `AppState` on explicit actions (submit, remove, disappear). This prevents premature sanitization during editing.
The local state is loaded on view appear and when the view becomes active, ensuring it stays in sync with `AppState`.