Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
328a2a8
feat: stream provider calls for v0.1.1
Harzva May 16, 2026
1fb9376
ci: create android release before apk upload
Harzva May 16, 2026
6b54431
fix: restore runtime task detail analyzer compatibility
Harzva May 16, 2026
4b12d54
ci: keep android smoke curl command on one line
Harzva May 16, 2026
5051013
docs: record v0.1.1 release evidence
Harzva May 16, 2026
d4dfe3a
docs: clarify v0.1.1 build evidence commit
Harzva May 16, 2026
1e5f06e
fix: preserve chats and surface generated artifacts
Harzva May 17, 2026
84a7afa
fix: improve artifact preview and tool trace UX
Harzva May 17, 2026
1e53204
fix: keep extension management release safe
Harzva May 17, 2026
402da07
docs: record v0.1.2 release evidence
Harzva May 17, 2026
e44f226
fix: restore extension manager routes
Harzva May 17, 2026
1f266ca
feat: internalize default html design skills
Harzva May 17, 2026
51e55ed
docs: record v0.1.3 release evidence
Harzva May 17, 2026
974c402
feat: wire html skills into generation
Harzva May 17, 2026
dd7e505
fix: remove account-gated registry dependency
Harzva May 17, 2026
973da4e
feat: polish pages publish and lark connector
Harzva May 17, 2026
c4a0cd0
fix: repair github service compilation
Harzva May 17, 2026
f283720
fix: polish trace cards and release build
Harzva May 17, 2026
d3ea5fb
fix: repair trace panel analyzer
Harzva May 17, 2026
53c444f
polish: add brand themes and agent avatars
Harzva May 17, 2026
f1a6381
fix: use existing panel for theme preference
Harzva May 17, 2026
dd555e1
docs: record v0.1.6 release evidence
Harzva May 17, 2026
814e554
Polish workspace browser and browser preferences
Harzva May 18, 2026
38120ee
feat: add github first repo hub
Harzva May 18, 2026
03f04ec
docs: polish readme showcase
Harzva May 18, 2026
0623fcd
polish: improve agent runtime ux
Harzva May 18, 2026
3ba303d
polish: improve agent runtime ux
Harzva May 18, 2026
06a298d
test: harden android smoke launch check
Harzva May 18, 2026
39316ab
test: harden android smoke launch check
Harzva May 18, 2026
ee2b438
ci: keep android smoke wait in one shell
Harzva May 18, 2026
c0dc62f
ci: keep android smoke wait in one shell
Harzva May 18, 2026
c6880ae
docs: record v0.1.10 release qa evidence
Harzva May 18, 2026
90b5557
docs: record v0.1.10 release qa evidence
Harzva May 18, 2026
7bc0eb3
feat: add rr observability panels
Harzva May 18, 2026
aec34e6
feat: add configurable token pricing
Harzva May 18, 2026
7c3336f
feat: add manual pricing snapshot update
Harzva May 18, 2026
7661473
feat: add searchable pricing table
Harzva May 18, 2026
6834cf0
feat: add pricing provider filters
Harzva May 18, 2026
04a933a
feat: add pricing sort controls
Harzva May 18, 2026
303e5bc
fix: unblock flutter analyzer
Harzva May 18, 2026
d53040d
polish: finalize v0.1.23 release surfaces
Harzva May 18, 2026
2e2d620
Merge remote-tracking branch 'origin/v011-streaming-fix' into v011-st…
Harzva May 18, 2026
e4a13a9
ci: add ios archive build workflow
Harzva May 18, 2026
f478e5c
ci: run ios archive from simulator workflow
Harzva May 18, 2026
1783754
fix: release v0.1.24 repo hub public search
Harzva May 18, 2026
0f27ef3
ci: disable impeller for android smoke
Harzva May 18, 2026
8bf1913
docs: add remotion promo videos
Harzva May 18, 2026
f936f9c
ci: deploy remotion principle page
Harzva May 18, 2026
783967c
docs: hide commercial pricing page
Harzva May 18, 2026
d9dedb7
docs: add voiceover and short teaser video
Harzva May 18, 2026
3931d61
docs: slow full explainer voiceover
Harzva May 18, 2026
b6af2ae
feat: add repo intelligence review flows
Harzva May 19, 2026
3586d18
chore: prepare v0.1.26 baseline build
Harzva May 19, 2026
dfc9f89
chore: prepare v0.1.30 release build
Harzva May 19, 2026
17809ff
feat: polish editor bookmarks and runtime UX
Harzva May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions .github/workflows/android-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,24 @@ on:
release_tag:
description: GitHub Release tag to upload the APK to
required: false
default: v0.1.0
default: v0.1.30
push:
tags:
- 'v*'

permissions:
contents: write

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
build-apk:
runs-on: ubuntu-latest

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

- name: Setup Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'
Expand All @@ -50,7 +47,7 @@ jobs:

- name: Analyze Flutter sources
working-directory: mobile_agent
run: flutter analyze lib/main.dart lib/screens/home_screen.dart --no-fatal-infos --no-fatal-warnings
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.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: Configure stable Android release signing
working-directory: mobile_agent
Expand Down Expand Up @@ -91,19 +88,40 @@ jobs:
fi

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

- name: Upload workflow artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: mobilecode-apk
path: artifacts/mobilecode-v0.1.0.apk
path: ${{ steps.stage_apk.outputs.apk_path }}

- name: Ensure GitHub Release exists
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.30' }}
run: |
if gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
echo "Release $RELEASE_TAG already exists."
else
gh release create "$RELEASE_TAG" \
--target "$GITHUB_SHA" \
--title "MobileCode $RELEASE_TAG" \
--notes "Automated MobileCode Android APK build." \
--prerelease \
--repo "$GITHUB_REPOSITORY"
fi

- name: Upload APK to GitHub Release
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name }}
RELEASE_TAG: ${{ github.event.inputs.release_tag || github.ref_name || 'v0.1.30' }}
run: |
gh release upload "$RELEASE_TAG" artifacts/mobilecode-v0.1.0.apk --clobber --repo "$GITHUB_REPOSITORY"
gh release upload "$RELEASE_TAG" "${{ steps.stage_apk.outputs.apk_path }}" --clobber --repo "$GITHUB_REPOSITORY"
180 changes: 84 additions & 96 deletions .github/workflows/android-app-test.yml
Original file line number Diff line number Diff line change
@@ -1,101 +1,89 @@
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

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

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

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

- name: Setup Java
uses: actions/setup-java@v4
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:
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: Analyze Flutter entry surfaces
working-directory: mobile_agent
run: flutter analyze lib/main.dart lib/screens/home_screen.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
run: flutter analyze lib/main.dart lib/screens/home_screen.dart lib/screens/role_manager_screen.dart lib/screens/api_usage_screen.dart lib/screens/device_telemetry_screen.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 -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 shell monkey -p com.mobilecode.mobile_agent -c android.intent.category.LAUNCHER 1
for attempt in $(seq 1 18); do adb shell pidof com.mobilecode.mobile_agent; adb shell dumpsys window windows > artifacts/window-focus.txt || true; if grep -q "com.mobilecode.mobile_agent" artifacts/window-focus.txt && ! grep -q "Splash Screen com.mobilecode.mobile_agent" artifacts/window-focus.txt; then break; fi; sleep 5; done
adb shell pidof com.mobilecode.mobile_agent
grep -q "com.mobilecode.mobile_agent" artifacts/window-focus.txt
! grep -q "Splash Screen com.mobilecode.mobile_agent" artifacts/window-focus.txt
adb exec-out screencap -p > artifacts/mobilecode-android-smoke.png
adb logcat -d -t 1200 > artifacts/android-logcat.txt
grep -E "FATAL EXCEPTION|E AndroidRuntime|NoSuchMethodError|MissingPluginException|ANR in com.mobilecode.mobile_agent" artifacts/android-logcat.txt && exit 1 || true

- name: Upload Android smoke artifacts
uses: actions/upload-artifact@v4
if: always()
with:
name: mobilecode-android-smoke
path: artifacts/
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/
Loading