Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
fb305c0
feat: add mobile harness strategy modes
Harzva Jun 20, 2026
fe3048a
docs: add P6 runtime benchmark contracts
Harzva Jun 21, 2026
82c4098
Merge pull request #8 from Harzva/p5-real-callback-pilot
Harzva Jun 21, 2026
3e3720f
feat: add P6.3 android phone-use runtime lane
Harzva Jun 21, 2026
cd4507f
Merge pull request #9 from Harzva/p63-android-real-device-lane
Harzva Jun 21, 2026
6a045b5
feat: add T25 permissions and helper runtime wiring
Harzva Jun 25, 2026
326278c
ci: fix helper launcher smoke command
Harzva Jun 25, 2026
415cd59
docs: prefer local Mac build validation
Harzva Jun 25, 2026
1b6b3dc
feat: add subscription usage hub
Harzva Jun 25, 2026
ca87d7a
feat: add controlled embedded lite runtime
Harzva Jun 25, 2026
1404030
feat: validate github subscription tokens
Harzva Jun 25, 2026
1dc0183
feat: validate manual subscription credentials
Harzva Jun 25, 2026
7d45727
docs: add t25 t26 reference screenshot index
Harzva Jun 25, 2026
aca8162
docs: record real login reference screenshots
Harzva Jun 25, 2026
ebb9396
fix: type helper task payload maps
Harzva Jun 25, 2026
72ce38f
feat: link usage hub to github auth session
Harzva Jun 25, 2026
844b9c4
feat: add Harvis MobileCode status exporter
Harzva Jun 29, 2026
d7c246b
feat: add harvis mobilecode handoff runner
Harzva Jun 29, 2026
d37b57f
feat: consume harvis handoff messages
Harzva Jun 29, 2026
d74ed19
docs: add harvis mobilecode android smoke lane
Harzva Jun 29, 2026
eff8c4b
docs: record harvis mobilecode emulator smoke
Harzva Jun 29, 2026
0311266
feat: add harvis live worker and phone-use smoke
Harzva Jun 29, 2026
cc0dca2
test: cover harvis mobilecode validate handoff
Harzva Jun 29, 2026
29383fa
feat: wire phone-use emulator handoff
Harzva Jun 29, 2026
abefb2f
feat: add real-device phone-use proof lane
Harzva Jun 29, 2026
90e80bd
feat: gate real-device phone-use handoff
Harzva Jun 29, 2026
dc5bd03
feat: add resident mobilecode remote worker service
Harzva Jun 29, 2026
89d906f
test: add resident mobilecode worker smoke
Harzva Jun 29, 2026
f7ba4ce
chore: harden workspace safety and analysis policy
Harzva Jul 13, 2026
59fb4ec
refactor: harden MobileCode product surfaces
Harzva Jul 13, 2026
9969ec6
feat: complete subscription provider usage adapters
Harzva Jul 13, 2026
6e9b125
feat: add phone-native CLI sandbox and artifact runtime
Harzva Jul 13, 2026
46ba60b
ci: stabilize authenticated Android pure-flavor smoke
Harzva Jul 13, 2026
ff7ecf6
ci: bound Android emulator external calls
Harzva Jul 13, 2026
ec5cc9f
fix: bridge adb helper auth through shell-safe extra
Harzva Jul 13, 2026
ec802aa
fix: publish helper auth state across service threads
Harzva Jul 13, 2026
6779da8
chore: sync helper service projection source
Harzva Jul 13, 2026
d567337
ci: keep helper auth header in emulator shell scope
Harzva Jul 13, 2026
16cd2db
docs: publish MobileCode phone-native harness report
Harzva Jul 13, 2026
de09510
docs: normalize report metadata formatting
Harzva Jul 13, 2026
84d41ff
docs: add live demo, CLI matrix, and PPTX evidence
Harzva Jul 13, 2026
043b696
ci: wait for real Flutter UI readiness
Harzva Jul 13, 2026
9c804db
ci: reject system-dialog smoke artifacts
Harzva Jul 13, 2026
973ad5d
ci: keep smoke analysis on tracked sources
Harzva Jul 13, 2026
0dad1be
feat: integrate TuiMa local provider
Harzva Jul 13, 2026
e855a42
Merge pull request #11 from Harzva/feature/roadmp-accessibility-subsc…
Harzva Jul 13, 2026
8bceee7
ci: preauthorize Android microphone smoke test
Harzva Jul 13, 2026
96000f4
feat: add trusted one-shot Phone Use approvals
Harzva Jul 18, 2026
2aed3f2
fix: sync Android Phone Use projections
Harzva Jul 18, 2026
951ee23
feat: add controlled Phone Use evaluation gate
Harzva Aug 1, 2026
8fe9169
ci: harden Android smoke evidence gate
Harzva Aug 1, 2026
e6e29d5
ci: run Android smoke in one shell
Harzva Aug 1, 2026
030c3e9
chore: prepare v0.1.69 release
Harzva Aug 6, 2026
b1645f1
Merge Phone Use controlled evaluation and v0.1.69 release
Harzva Aug 6, 2026
9ada862
fix: preserve Android release project configuration
Harzva Aug 6, 2026
ebd12b8
Merge pull request #13 from Harzva/fix/android-release-desugaring
Harzva Aug 6, 2026
eab09d8
docs: record v0.1.69 release evidence
Harzva Aug 6, 2026
8ffdc47
Merge pull request #14 from Harzva/docs/v0.1.69-release-evidence
Harzva Aug 6, 2026
a426608
feat: integrate MobileCore local inference v2
Harzva Aug 6, 2026
61f6faa
Merge pull request #15 from Harzva/codex/mobilecore-client-v2
Harzva Aug 6, 2026
33c0f6d
feat: expose MobileCore local vision capabilities
Harzva Aug 6, 2026
4969593
Merge pull request #16 from Harzva/codex/generic-vlm-pair-client
Harzva Aug 6, 2026
f588c9a
fix: keep MobileCode release version consistent
Harzva Aug 6, 2026
b8b1e39
chore: preserve Android workflow line endings
Harzva Aug 6, 2026
81e8d7d
Merge pull request #17 from Harzva/codex/version-consistency-v0.1.72
Harzva Aug 6, 2026
2622781
docs: record v0.1.72 signed release evidence
Harzva Aug 6, 2026
0e97f10
Merge pull request #18 from Harzva/codex/v0.1.72-release-evidence
Harzva Aug 6, 2026
d8180ba
feat: harden physical MobileCore acceptance evidence
Harzva Aug 6, 2026
dc73c6a
Merge pull request #19 from Harzva/codex/physical-qa-evidence-v2
Harzva Aug 6, 2026
ec3390a
fix: harden iOS release launch verification
Harzva Aug 6, 2026
995bf3d
test: require iOS simulator process liveness
Harzva Aug 6, 2026
3a37932
Merge pull request #20 from Harzva/codex/v0.1.73-ios-permission-smoke
Harzva Aug 6, 2026
133b024
feat: harden MobileCoreClient v2 controls
Harzva Aug 6, 2026
9ad738e
Merge pull request #21 from Harzva/codex/mobilecore-client-v2-hardening
Harzva Aug 6, 2026
fc5025e
feat: enforce MobileCore task-aware routing
Harzva Aug 6, 2026
66a9001
Merge pull request #22 from Harzva/codex/mobilecore-policy-routing-v2
Harzva Aug 6, 2026
fd269d8
fix: honor pressure routing for private local tasks
Harzva Aug 6, 2026
b4fbc1b
Merge pull request #23 from Harzva/codex/mobilecore-pressure-switch-f…
Harzva Aug 6, 2026
e185064
feat: route offline tasks before cloud transport
Harzva Aug 6, 2026
7e0bed8
Merge pull request #24 from Harzva/codex/mobilecore-proactive-offline…
Harzva Aug 6, 2026
e6d6f17
release: prepare MobileCode v0.1.74
Harzva Aug 6, 2026
2efe770
Merge pull request #25 from Harzva/codex/v0.1.74-release
Harzva Aug 6, 2026
7729249
feat: require one-task approval for complex cloud inference
Harzva Aug 6, 2026
643a577
Merge remote-tracking branch 'origin/main-dev' into codex/mobilecore-…
Harzva Aug 6, 2026
e730603
docs: record v0.1.74 cloud approval QA
Harzva Aug 6, 2026
f4f3071
Merge pull request #26 from Harzva/codex/mobilecore-single-task-cloud…
Harzva Aug 6, 2026
35ee8ea
release: prepare MobileCode v0.1.75
Harzva Aug 6, 2026
3f4d967
Merge pull request #27 from Harzva/codex/v0.1.75-release
Harzva Aug 6, 2026
83ccaf6
docs: record v0.1.75 release evidence
Harzva Aug 6, 2026
4f6e800
Merge pull request #28 from Harzva/codex/v0.1.75-release-evidence
Harzva Aug 6, 2026
ef793bc
test: add cross-app multimodal acceptance gates
Harzva Aug 6, 2026
a6a3d11
Merge pull request #29 from Harzva/codex/mobilecore-cross-app-multimo…
Harzva Aug 6, 2026
34d5913
feat: require MobileCore protocol v2
Harzva Aug 6, 2026
0860190
Merge pull request #30 from Harzva/codex/mobilecore-protocol-handshake
Harzva Aug 6, 2026
4094db3
docs: record v0.1.76 release evidence
Harzva Aug 6, 2026
07178cf
Merge pull request #31 from Harzva/codex/v0.1.76-release-evidence
Harzva Aug 6, 2026
be804c3
qa: harden physical dual-app acceptance (#32)
Harzva Aug 6, 2026
9309cd1
security: harden public mobile release credentials
Harzva Aug 6, 2026
d031692
Merge pull request #33 from Harzva/codex/public-release-secret-hardening
Harzva Aug 6, 2026
fe4e86c
docs: record v0.1.77 release evidence
Harzva Aug 6, 2026
e8d97df
Merge pull request #34 from Harzva/codex/v0.1.77-release-evidence
Harzva Aug 6, 2026
627b474
feat: activate verified MobileCore Omni runtime
Harzva Aug 6, 2026
da1de20
Merge pull request #35 from Harzva/codex/verified-omni-activation
Harzva Aug 6, 2026
abf9523
feat: fail closed on MobileCore background restriction
Harzva Aug 6, 2026
7c235f7
Merge pull request #36 from Harzva/codex/mobilecore-background-restri…
Harzva Aug 6, 2026
7133a5a
release: prepare MobileCode v0.1.78
Harzva Aug 6, 2026
4870ca1
Merge pull request #37 from Harzva/codex/v0.1.78-background-link
Harzva Aug 6, 2026
264b701
ci: ignore system UI noise in Android smoke
Harzva Aug 6, 2026
ec7951a
ci: enable KVM for Android smoke
Harzva Aug 6, 2026
5105afe
feat: harden MobileCore model switching
Harzva Aug 7, 2026
4579159
Merge pull request #38 from Harzva/codex/android-smoke-system-ui-noise
Harzva Aug 7, 2026
4275c76
Merge pull request #39 from Harzva/codex/mobilecore-v2-switch-preflight
Harzva Aug 7, 2026
5311182
ci: close MobileCode release races
Harzva Aug 7, 2026
1b1adba
docs: record v0.1.78 published verification
Harzva Aug 7, 2026
c9be189
Merge pull request #41 from Harzva/codex/v0.1.78-published-evidence
Harzva Aug 7, 2026
2737432
Merge pull request #40 from Harzva/codex/v0.1.78-release-closure
Harzva Aug 7, 2026
fbfa602
docs: pin final v0.1.78 asset evidence
Harzva Aug 7, 2026
1faa88b
Merge pull request #42 from Harzva/codex/v0.1.78-final-asset-evidence
Harzva Aug 7, 2026
dd51ca6
docs: record v0.1.78 iOS build evidence
Harzva Aug 7, 2026
d55c6e6
test: make physical MobileCore QA fail closed
Harzva Aug 7, 2026
eaca6ab
Merge pull request #43 from Harzva/codex/v0.1.78-ios-evidence
Harzva Aug 7, 2026
5dad210
Merge pull request #44 from Harzva/codex/physical-qa-strict-gates
Harzva Aug 7, 2026
2ee1505
docs: record fail-closed dual-app regression
Harzva Aug 7, 2026
5ac3090
Merge pull request #45 from Harzva/codex/main-dev-dual-app-evidence
Harzva Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# This legacy source is stored with CRLF line endings. Treat CR as part of the
# line terminator so semantic changes can still pass Git's whitespace checks.
mobile_agent/lib/core/evidence/action_runner.dart whitespace=cr-at-eol
3 changes: 3 additions & 0 deletions .github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
self-hosted-runner:
labels:
- mobilecode-device-lab
57 changes: 23 additions & 34 deletions .github/workflows/android-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
release_tag:
description: GitHub Release tag to upload the APK to
required: false
default: v0.1.39
default: v0.1.78
push:
tags:
- 'v*'
Expand All @@ -22,6 +22,9 @@ jobs:
- name: Checkout
uses: actions/checkout@v6

- name: Enforce public release credential policy
run: python3 scripts/verify_public_release_workflows.py

- name: Setup Java
uses: actions/setup-java@v5
with:
Expand All @@ -34,20 +37,18 @@ jobs:
channel: stable
cache: true

- name: Recreate Android platform project
working-directory: mobile_agent
run: |
rm -rf android
flutter create --platforms=android --project-name mobile_agent --org com.mobilecode .
python3 tooling/prepare_android_project.py
- name: Prepare checked-in Android platform project
working-directory: mobile_agent
run: |
python3 tooling/prepare_android_project.py

- name: Resolve Flutter dependencies
working-directory: mobile_agent
run: flutter pub get

- name: Analyze Flutter sources
working-directory: mobile_agent
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/github_screen.dart lib/screens/github_repo_hub_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.dart lib/services/github_deep_service.dart lib/services/github_oauth_flow.dart lib/services/role_library_service.dart lib/services/token_usage_service.dart lib/services/token_pricing_service.dart lib/services/device_telemetry_service.dart lib/services/agent_loop_controller.dart --no-fatal-infos --no-fatal-warnings
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/github_screen.dart lib/screens/github_repo_hub_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.dart lib/services/github_deep_service.dart lib/services/github_oauth_flow.dart lib/services/role_library_service.dart lib/services/token_usage_service.dart lib/services/token_pricing_service.dart lib/services/device_telemetry_service.dart lib/services/agent_loop_controller.dart lib/services/model_provider_preset_service.dart lib/services/tuima_provider_service.dart --no-fatal-infos --no-fatal-warnings

- name: Configure stable Android release signing
working-directory: mobile_agent
Expand Down Expand Up @@ -75,58 +76,46 @@ jobs:
- name: Build release APK
working-directory: mobile_agent
env:
MOBILECODE_MANAGED_API_KEY: ${{ secrets.MOBILECODE_MANAGED_API_KEY }}
MOBILECODE_DEEPSEEK_API_KEY: ${{ secrets.MOBILECODE_DEEPSEEK_API_KEY || secrets.DEEPSEEK_API_KEY }}
MOBILECODE_MANAGED_RELAY_URL: ${{ vars.MOBILECODE_MANAGED_RELAY_URL }}
MOBILECODE_MANAGED_RELAY_TOKEN: ${{ secrets.MOBILECODE_MANAGED_RELAY_TOKEN }}
MOBILECODE_GITHUB_OAUTH_CLIENT_ID: ${{ secrets.MOBILECODE_GITHUB_OAUTH_CLIENT_ID }}
MOBILECODE_GITHUB_OAUTH_CLIENT_SECRET: ${{ secrets.MOBILECODE_GITHUB_OAUTH_CLIENT_SECRET }}
MOBILECODE_GITHUB_OAUTH_CLIENT_ID: ${{ vars.MOBILECODE_GITHUB_OAUTH_CLIENT_ID }}
MOBILECODE_GITHUB_OAUTH_REDIRECT_URI: ${{ vars.MOBILECODE_GITHUB_OAUTH_REDIRECT_URI }}
run: |
DART_DEFINES=()
if [ -n "$MOBILECODE_MANAGED_RELAY_URL" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_RELAY_URL="$MOBILECODE_MANAGED_RELAY_URL")
fi
if [ -n "$MOBILECODE_MANAGED_RELAY_TOKEN" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_RELAY_TOKEN="$MOBILECODE_MANAGED_RELAY_TOKEN")
fi
if [ -n "$MOBILECODE_MANAGED_API_KEY" ] || [ -n "$MOBILECODE_MANAGED_RELAY_URL" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_PROVIDER=true)
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_BASE_URL=https://token-plan-cn.xiaomimimo.com/anthropic)
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_MODEL=mimo-v2.5-pro)
fi
if [ -z "$MOBILECODE_MANAGED_RELAY_URL" ] && [ -n "$MOBILECODE_MANAGED_API_KEY" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_API_KEY="$MOBILECODE_MANAGED_API_KEY")
fi
if [ -n "$MOBILECODE_DEEPSEEK_API_KEY" ] || [ -n "$MOBILECODE_MANAGED_RELAY_URL" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_DEEPSEEK_PROVIDER=true)
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_DEEPSEEK_BASE_URL=https://api.deepseek.com)
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_DEEPSEEK_MODEL=deepseek-v4-flash)
fi
if [ -z "$MOBILECODE_MANAGED_RELAY_URL" ] && [ -n "$MOBILECODE_DEEPSEEK_API_KEY" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_MANAGED_DEEPSEEK_API_KEY="$MOBILECODE_DEEPSEEK_API_KEY")
fi
if [ -n "$MOBILECODE_GITHUB_OAUTH_CLIENT_ID" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_GITHUB_OAUTH_CLIENT_ID="$MOBILECODE_GITHUB_OAUTH_CLIENT_ID")
fi
if [ -n "$MOBILECODE_GITHUB_OAUTH_CLIENT_SECRET" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_GITHUB_OAUTH_CLIENT_SECRET="$MOBILECODE_GITHUB_OAUTH_CLIENT_SECRET")
fi
if [ -n "$MOBILECODE_GITHUB_OAUTH_REDIRECT_URI" ]; then
DART_DEFINES+=(--dart-define=MOBILECODE_GITHUB_OAUTH_REDIRECT_URI="$MOBILECODE_GITHUB_OAUTH_REDIRECT_URI")
fi
flutter build apk --release --target lib/main.dart "${DART_DEFINES[@]}"
flutter build apk --release --flavor pure --dart-define=MOBILECODE_BUILD_CHANNEL=pure --target lib/main.dart "${DART_DEFINES[@]}"

- name: Stage APK
id: stage_apk
env:
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.39' }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.78' }}
run: |
mkdir -p artifacts
APK_PATH="artifacts/mobilecode-${RELEASE_TAG}.apk"
cp mobile_agent/build/app/outputs/flutter-apk/app-release.apk "$APK_PATH"
cp mobile_agent/build/app/outputs/flutter-apk/app-pure-release.apk "$APK_PATH"
echo "apk_path=$APK_PATH" >> "$GITHUB_OUTPUT"

- name: Verify release version consistency
env:
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.78' }}
run: |
python3 scripts/verify_mobilecode_release_version.py \
--apk "${{ steps.stage_apk.outputs.apk_path }}" \
--expected-tag "$RELEASE_TAG"

- name: Upload workflow artifact
uses: actions/upload-artifact@v7
with:
Expand All @@ -136,7 +125,7 @@ jobs:
- name: Ensure GitHub Release exists
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.39' }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.78' }}
run: |
if gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
echo "Release $RELEASE_TAG already exists."
Expand All @@ -152,6 +141,6 @@ jobs:
- name: Upload APK to GitHub Release
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.39' }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.78' }}
run: |
gh release upload "$RELEASE_TAG" "${{ steps.stage_apk.outputs.apk_path }}" --clobber --repo "$GITHUB_REPOSITORY"
177 changes: 90 additions & 87 deletions .github/workflows/android-app-test.yml
Original file line number Diff line number Diff line change
@@ -1,89 +1,92 @@
name: Android App Smoke Test

on:
workflow_dispatch:
push:
branches:
- main
paths:
- 'mobile_agent/**'
- '.github/workflows/android-app-test.yml'
- '.github/workflows/android-apk.yml'

permissions:
contents: read

jobs:
emulator-smoke:
runs-on: ubuntu-latest
timeout-minutes: 35

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Recreate Android platform project
working-directory: mobile_agent
run: |
rm -rf android
flutter create --platforms=android --project-name mobile_agent --org com.mobilecode .
python3 tooling/prepare_android_project.py

- name: Resolve Flutter dependencies
working-directory: mobile_agent
run: flutter pub get

name: Android App Smoke Test

on:
workflow_dispatch:
pull_request:
paths:
- 'mobile_agent/**'
- 'docs/mobilecode-accessibility-background-permissions-qa.md'
- 'roadmap/tasks/T25-accessibility-background-permissions.md'
- '.github/workflows/android-app-test.yml'
push:
branches:
- main
paths:
- 'mobile_agent/**'
- 'docs/mobilecode-accessibility-background-permissions-qa.md'
- 'roadmap/tasks/T25-accessibility-background-permissions.md'
- 'scripts/run_android_app_smoke_ci.sh'
- '.github/workflows/android-app-test.yml'
- '.github/workflows/android-apk.yml'

permissions:
contents: read

jobs:
emulator-smoke:
runs-on: ubuntu-latest
timeout-minutes: 35

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'

- name: Enable KVM for Android emulator
run: |
test -e /dev/kvm
sudo chmod 0666 /dev/kvm
test -r /dev/kvm
test -w /dev/kvm

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true

- name: Verify checked-in Android project
working-directory: mobile_agent
run: |
python3 -m py_compile tooling/prepare_android_project.py
test -f android/app/src/main/kotlin/com/mobilecode/app/MobileCodeHelperService.kt
test -f android/app/src/main/kotlin/com/mobilecode/app/MobileCodeHelperLauncherActivity.kt

- name: Resolve Flutter dependencies
working-directory: mobile_agent
run: flutter pub get

- name: Analyze Flutter entry surfaces
working-directory: mobile_agent
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/github_screen.dart lib/screens/github_repo_hub_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.dart lib/services/github_deep_service.dart lib/services/github_oauth_flow.dart lib/services/role_library_service.dart lib/services/token_usage_service.dart lib/services/token_pricing_service.dart lib/services/device_telemetry_service.dart --no-fatal-infos --no-fatal-warnings

- name: Build debug APK for emulator
working-directory: mobile_agent
run: flutter build apk --debug --target lib/main.dart

- name: Run APK on Android emulator
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
arch: x86_64
profile: pixel_2
target: default
disable-animations: true
script: |
set -eux
mkdir -p artifacts
adb wait-for-device
installed=0; for attempt in 1 2 3; do if adb install -r mobile_agent/build/app/outputs/flutter-apk/app-debug.apk; then installed=1; break; fi; adb kill-server; adb start-server; adb wait-for-device; sleep 20; done; test "$installed" = 1
adb shell am start -n com.mobilecode.mobile_agent/.MobileCodeHelperLauncherActivity
adb forward tcp:18765 tcp:8765
helper_ready=0; for attempt in $(seq 1 20); do if curl -fsS http://127.0.0.1:18765/v1/health > artifacts/android-helper-health.json; then helper_ready=1; break; fi; sleep 1; done; if [ "$helper_ready" != 1 ]; then adb shell dumpsys activity services com.mobilecode.mobile_agent > artifacts/helper-services.txt || true; adb logcat -d -t 1500 > artifacts/android-logcat.txt || true; exit 1; fi
curl -fsS http://127.0.0.1:18765/v1/health | tee artifacts/android-helper-health.json
curl -fsS -H 'Content-Type: application/json' -X POST http://127.0.0.1:18765/v1/execute -d '{"command":"pwd","timeoutMs":10000}' | tee artifacts/android-helper-execute.json
curl -fsS http://127.0.0.1:18765/v1/tasks/current | tee artifacts/android-helper-task.json
grep '"name":"MobileCode Helper Service"' artifacts/android-helper-health.json
grep '"ready":true' artifacts/android-helper-health.json
grep '"backgroundService":true' artifacts/android-helper-health.json
grep '"exitCode":0' artifacts/android-helper-execute.json
grep '"failureKind":"none"' artifacts/android-helper-execute.json
adb logcat -c || true
adb shell am start -W -n com.mobilecode.mobile_agent/.MainActivity | tee artifacts/main-start.txt
app_drawn=0; for attempt in $(seq 1 24); do adb shell pidof com.mobilecode.mobile_agent; adb shell dumpsys window windows > artifacts/window-focus.txt || true; if awk '/Window #[0-9]+/ { in_app = ($0 ~ /com\.mobilecode\.mobile_agent\/com\.mobilecode\.mobile_agent\.MainActivity/) } in_app && /Surface: shown=true/ { ok=1 } END { exit ok ? 0 : 1 }' artifacts/window-focus.txt; then app_drawn=1; break; fi; sleep 5; done; echo "$app_drawn" > artifacts/app-drawn.txt; adb shell pidof com.mobilecode.mobile_agent; adb exec-out screencap -p > artifacts/mobilecode-android-smoke.png || true; adb logcat -d -t 2000 > artifacts/android-logcat.txt || true; grep -q "com.mobilecode.mobile_agent" artifacts/window-focus.txt; grep -E "FATAL EXCEPTION|E AndroidRuntime|NoSuchMethodError|MissingPluginException|ANR in com.mobilecode.mobile_agent" artifacts/android-logcat.txt && exit 1 || true; test "$app_drawn" = 1

- name: Upload Android smoke artifacts
uses: actions/upload-artifact@v7
if: always()
with:
name: mobilecode-android-smoke
path: artifacts/
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/settings_screen.dart lib/screens/github_screen.dart lib/screens/github_repo_hub_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.dart lib/services/github_deep_service.dart lib/services/github_oauth_flow.dart lib/services/role_library_service.dart lib/services/token_usage_service.dart lib/services/token_pricing_service.dart lib/services/device_telemetry_service.dart lib/services/mobile_code_helper_auth.dart lib/services/phone_use_accessibility_service.dart lib/services/model_provider_preset_service.dart lib/services/tuima_provider_service.dart test/services/model_provider_preset_service_test.dart test/services/tuima_provider_service_test.dart --no-fatal-infos --no-fatal-warnings

- name: Build debug APK for emulator
working-directory: mobile_agent
run: >-
flutter build apk --debug --flavor pure
--dart-define=MOBILECODE_BUILD_CHANNEL=pure
--target lib/main.dart

- name: Run APK on Android emulator
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
arch: x86_64
profile: pixel_2
target: default
disable-animations: true
# android-emulator-runner executes each script line in a separate shell.
# Keep stateful control flow in a checked-in POSIX shell script.
script: sh scripts/run_android_app_smoke_ci.sh

- name: Upload Android smoke artifacts
uses: actions/upload-artifact@v7
if: always()
with:
name: mobilecode-android-smoke
path: artifacts/
Loading