- Long-press overlay bubble to reveal red stop button that kills the agent
- Wake word detection with TensorFlow Lite for hands-free activation
- Updated README model table to reflect current provider models
- Various tool and UI improvements
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Agent loop previously exited to IDLE when the LLM returned no tool calls,
causing tasks like chess or dating apps to silently stop. This adds a
heartbeat system that periodically wakes the agent to check screen state
and act if needed.
- HeartbeatManager: Handler-based scheduler with exponential backoff
(5s → 10s → 30s → 60s), renewable wake lock (5 min), active task context
- HeartbeatDetector: Classifies agent responses (HEARTBEAT_OK, acted, error)
- HeartbeatPrompt: Builds [Heartbeat Check] prompts with task context
- heartbeat.context tool: Agent sets/clears monitoring context
- AgentLoop.submitHeartbeat(): Non-cancelling heartbeat entry point with
invisible event suppression and conversation history pruning
- CellClawService: Heartbeat lifecycle, notification shows monitoring state
- Identity: System prompt sections for screen reading strategy and heartbeat
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add OverlayVisibilityController to temporarily hide overlay during
screenshots and tap/swipe actions so it doesn't interfere
- Change bubble colors: green (idle), blue (thinking), orange (executing)
- Add double-tap bubble to open CellClaw app
- Add status label and response card for agent events
- Add fullscreen transparent backdrop to dismiss quick ask panel
by tapping outside
- Remove Explain Screen button from panel
- Add drag callback to keep status positioned near bubble
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users now choose an autonomy level during onboarding (new step 3 of 4) and can
switch profiles anytime in Settings. Individual tool toggles still work for
fine-tuning after selecting a profile.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GeminiProvider now tries fallback models when hitting 429 rate limits,
not just 404. Removed permanent model lock-in so the primary model is
always retried first. Fixed gradlew DEFAULT_JVM_OPTS quoting that
caused "Could not find or load main class" error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Send button to overlay panel Quick Ask (was IME-action-only)
- Fix accessibility service detection using AccessibilityManager API
instead of cross-process @Volatile var that never updates
- Add diagnostic logging to GeminiProvider.parseResponse and AgentLoop
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prioritize Approve/Deny buttons when approvals are pending,
otherwise show Stop/Pause/Explain Screen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New CellClawTileService with @EntryPoint for Hilt, tile state reflecting
AgentState (ACTIVE/INACTIVE labels), and onClick screenshot+explain flow
posting result to CHANNEL_ALERTS notification (ID 200)
- New ic_qs_cellclaw.xml 24dp monochrome vector for QS tile icon
- Register CellClawTileService in manifest with BIND_QUICK_SETTINGS_TILE
permission, QS_TILE intent-filter, and ACTIVE_TILE metadata
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New OverlayService with TYPE_APPLICATION_OVERLAY bubble (48dp, state-tinted)
and expandable panel with Explain Screen, Quick Ask, Approve/Deny actions
- BubbleTouchListener with drag vs tap detection (10dp threshold)
- Add overlayEnabled pref to AppConfig, state + setter to SettingsViewModel
- Add Overlay toggle section in SettingsScreen with SYSTEM_ALERT_WINDOW
permission check and launch intent
- Start OverlayService from MainActivity when enabled + permitted
- Register SYSTEM_ALERT_WINDOW permission and OverlayService in manifest
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New NotificationActionReceiver with 4 actions (reply via RemoteInput,
screenshot+explain, approve all, deny all) using @EntryPoint for Hilt
- Rewrite CellClawService notification with live state observation via
combine(agentLoop.state, approvalQueue.requests), dynamic Pause/Resume
toggle, and conditional approve/deny buttons when approvals pending
- Register NotificationActionReceiver in AndroidManifest.xml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Five new feature areas:
- Screenshot capture via a11y service + vision analysis tool with ContentBlock.Image support across all providers (Anthropic, OpenAI, Gemini)
- Notification listener service with query/filter and auto-trigger agent on app notifications
- Cron scheduler using WorkManager with periodic and one-shot scheduled tasks (Room DB v2)
- Messaging automation tools for opening, reading, and replying in WhatsApp/Telegram/Instagram
- Voice input (SpeechRecognizer STT) and output (TextToSpeech TTS) with settings toggles
Includes 8 new instrumented tests and smart_reply skill asset.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
agentSendsEmail test sets up the full CellClaw agent loop with
EmailSendTool + UiAutomation tools and lets Gemini autonomously
compose the email, read the screen, and tap Send in Gmail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Set intent package to com.google.android.gm to bypass app chooser,
update tool description to guide agent to tap Send via screen.read +
app.automate, and add 4 mock validation tests plus a real end-to-end
Gmail send test with Samsung chooser fallback handling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add AccessibilityBridge for bidirectional tool<->service communication
- Upgrade CellClawAccessibility: swipe gestures (left/right/up/down),
screen reading with element bounds, find_element, wait_and_read
- AppAutomateTool now awaits results instead of fire-and-forget
- Add ScreenReadTool (screen.read) - read-only AUTO policy for
reading foreground app UI elements and text
- Swipe gestures calibrated for card-swiping apps (60% screen width)
- All 3 E2E agent loop tests pass on Samsung Galaxy Z Flip
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Test verifies Gemini calls browser.search with correct query params
- Query correctly contains boston and date keywords
- All 4 Gemini integration tests pass on phone + emulator
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add EmailSendTool (email.send) using Android ACTION_SENDTO intent
- Add Gemini integration tests (completion, tool use, streaming)
- Move API key from hardcoded test to BuildConfig via local.properties
- Update default Gemini model from 2.0-flash to 2.5-flash
- Add email.send to AutonomyPolicy defaults (ASK)
- Register EmailSendTool in AppModule DI
- Update unit tests for new model name
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add GeminiProvider with Gemini API function calling support
- Add ProviderManager to handle provider selection and API key management
- Update AgentLoop to use ProviderManager instead of hardcoded Anthropic
- Redesign SetupScreen with provider selection cards (radio buttons)
- Update SettingsScreen with per-provider API key management
- Update DI module to provide all three providers
- Add unit tests for GeminiProvider and ProviderManager
- Tested on emulator and physical device (Samsung Galaxy Z Flip)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix SSE streaming: replace inline processSSE with readLine loop
to allow suspend emit() calls inside the flow
- Remove @Serializable from CompletionRequest (ToolApiDefinition
is not serializable)
- Fix LocationTool type inference for suspendCancellableCoroutine
- Add gradlew/gradlew.bat and gradle-wrapper.jar
Build: assembleDebug passes, APK generated (20.7MB)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>