Fix/agent crashes v0.4.1 - #3
Conversation
…ation dialogs, notification listener, onboarding, tests - Material Design theming with deep indigo/teal brand colors and card-based UI - Voice input via RecognizerIntent with ActivityResultContracts - Execution history (JSON persistence, FIFO capped at 50, tap-to-rerun) - Confirmation dialog flow for risky actions (calls, messages) - NotificationListenerService for real notification summaries - Onboarding activity with accessibility & notification permission setup - Generated AI agent app icon across all mipmap densities - 31 new unit tests (ExecutionCoordinator, IntentExecutor, BrowserExecutor, AccessibilityExecutor) - All 39 unit tests pass, build successful
- New build-and-publish.yml: builds debug APK on every push to main, creates a GitHub Release with direct download link - CI now triggers on all branches (not just main) - Changelog updated for v0.2.0 with all new features
…agement UI (v0.3.0)
- Fix Android 12+ installation by exporting system-bound services - Add package name to manifest for better tool compatibility - Add User-Agent header to GitHub API requests in UpdateManager - Extract direct APK download URL from GitHub assets - Enable build-time versionName injection via Gradle properties - Ensure CI/CD passes the build tag to embedded versionName
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c51cb8b195
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| for (i in 1..MAX_AUTONOMOUS_STEPS) { | ||
| try { | ||
| val result = executor.execute(step, currentStepObservation) | ||
| result.externalAction?.let(externalActions::add) |
There was a problem hiding this comment.
Execute autonomous step actions before recapturing state
This loop queues result.externalAction but does not execute it before taking the next observationService.capture(), so each iteration can reason over unchanged UI and enqueue duplicate intents instead of progressing step-by-step. This is especially problematic for structured model outputs (for example OPEN_APP/WEB_SEARCH) because those actions are only launched later in MainActivity after run() returns.
Useful? React with 👍 / 👎.
| externalAction = actionParser.parse( | ||
| command = step.payload.orEmpty(), | ||
| responseSummary = response.summary | ||
| ) ?: AgentAccessibilityService.dispatchAutonomousAction(response.summary) |
There was a problem hiding this comment.
Remove unsafe fallback for unparsed autonomous responses
When parsing fails, this falls back to AgentAccessibilityService.dispatchAutonomousAction(response.summary), whose default branch performs global RECENTS+BACK navigation for unknown text. In practice, many non-structured summaries will hit this path, causing unsolicited device navigation instead of a safe no-op/error and creating risky user-visible behavior.
Useful? React with 👍 / 👎.
| .build() | ||
|
|
||
| val startTime = System.currentTimeMillis() | ||
| val response = client.newCall(httpRequest).execute() |
There was a problem hiding this comment.
Close relay HTTP responses after inference
The synchronous OkHttp call result is used without closing the Response. Repeated inferences can leak sockets/file descriptors and degrade or fail subsequent requests; wrapping the response in use { ... } (for both success and error paths) avoids connection/resource leaks.
Useful? React with 👍 / 👎.
Summary
Validation
android/gradlew lintDebugandroid/gradlew testDebugUnitTestandroid/gradlew connectedDebugAndroidTestRisk Review