-
Notifications
You must be signed in to change notification settings - Fork 8
Maple 3.0: Native Rust/SwiftUI/Compose/iced app #462
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
31 commits
Select commit
Hold shift + click to select a range
1274670
Add Maple 3.0 native app (Rust/SwiftUI/Compose/iced)
AnthonyRonning 7cd0920
Add native 3.0 README and architecture bible
AnthonyRonning 7dedfa2
Add rmp-cli build tool
AnthonyRonning 6792c82
Add mac-native-* justfile wrappers for OrbStack
AnthonyRonning 1aa8502
Add per-build native API URL configuration
AnthonyRonning 5255fa5
Align native desktop defaults and refresh lockfile
AnthonyRonning 337154a
Add native 3.0 beta CI pipelines
AnthonyRonning a557ae7
Fix native beta CI rollout issues
AnthonyRonning f95cf40
Fix native beta iOS and Android packaging
AnthonyRonning 37ead82
Fix native beta Linux icon packaging
AnthonyRonning 8e146b8
Fix native beta iOS upload validation
AnthonyRonning 30677a2
Fix native iOS dark mode surfaces
AnthonyRonning 08d0f46
Refine native iOS dark mode polish
AnthonyRonning 6b71de4
Align native Android and desktop theme parity
AnthonyRonning f9e23d3
Retry transient native secure session failures
AnthonyRonning 2f918e9
ignore .factory
AnthonyRonning c15d8fd
Redesign native chat UI to match design proto
AnthonyRonning 14d4f93
Match native UI to Figma design specs pixel-perfect
AnthonyRonning 9205105
Restore native iOS dark chat contrast and theme parity
AnthonyRonning ac30888
Align native iOS signing with Maple 2.0 release flow
AnthonyRonning 939d396
Skip native iOS archive signing in CI
AnthonyRonning 5dede79
Match native Android light chat background to iOS
AnthonyRonning d3978e7
Stabilize native mobile chat startup and session restore
AnthonyRonning 4e34919
Polish native chat chrome and unblock desktop startup
AnthonyRonning 52e309d
Remove Android composer gradient for consistent chat chrome
AnthonyRonning e4fc83a
Match iOS chat keyboard dismissal to native behavior
AnthonyRonning 823c254
Stagger native agent messages in Rust for reliable streaming
AnthonyRonning 6aae18a
Let native mobile chat input grow before sending
AnthonyRonning cf20b15
Add a native macOS SwiftUI target
AnthonyRonning c278ae9
Match the native Linux desktop to iOS and Android with a GTK4 shell a…
AnthonyRonning ac3575c
Align native 3.0 desktop beta CI with AppMac and GTK4
AnthonyRonning File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,89 @@ | ||
| name: Native 3.0 Android Beta | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened, ready_for_review] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: native-3-android-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| build-android: | ||
| if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false | ||
| runs-on: ubuntu-latest-8-cores | ||
| env: | ||
| MAPLE_API_ENV: dev | ||
| MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci | ||
| CARGO_TERM_COLOR: always | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Setup Java | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| distribution: temurin | ||
| java-version: "21" | ||
|
|
||
| - name: Setup Android SDK | ||
| uses: android-actions/setup-android@v3 | ||
|
|
||
| - name: Install Rust | ||
| uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android | ||
|
|
||
| - name: Cache Rust artifacts | ||
| uses: Swatinem/rust-cache@v2 | ||
| with: | ||
| workspaces: | | ||
| native -> target | ||
| native/rmp-cli -> target | ||
|
|
||
| - name: Setup Android NDK | ||
| uses: nttld/setup-ndk@v1.5.0 | ||
| id: setup-ndk | ||
| with: | ||
| ndk-version: r28c | ||
| add-to-path: true | ||
| local-cache: true | ||
|
|
||
| - name: Install native Android build tools | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get install -y libssl-dev pkg-config | ||
| cargo install cargo-ndk --locked | ||
|
|
||
| - name: Configure Android signing | ||
| env: | ||
| ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | ||
| ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | ||
| ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} | ||
| run: | | ||
| echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/maple-upload.jks" | ||
| cat > native/android/keystore.properties <<EOF | ||
| keyAlias=$ANDROID_KEY_ALIAS | ||
| password=$ANDROID_KEY_PASSWORD | ||
| storeFile=$RUNNER_TEMP/maple-upload.jks | ||
| EOF | ||
|
devin-ai-integration[bot] marked this conversation as resolved.
devin-ai-integration[bot] marked this conversation as resolved.
devin-ai-integration[bot] marked this conversation as resolved.
|
||
|
|
||
| - name: Build signed native Android beta | ||
| env: | ||
| ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }} | ||
| ANDROID_SDK_ROOT: ${{ env.ANDROID_SDK_ROOT }} | ||
| ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} | ||
| NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} | ||
| run: bash native/scripts/ci/build-android-release.sh | ||
|
|
||
| - name: Upload Android artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: native-android-beta | ||
| path: | | ||
| native/target/maple-ci/android/*.apk | ||
| native/target/maple-ci/android/*.aab | ||
| retention-days: 7 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| name: Native 3.0 iOS Beta | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened, ready_for_review] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: native-3-ios-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| build-testflight: | ||
| if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false | ||
| runs-on: macos-26-xlarge | ||
| env: | ||
| MAPLE_API_ENV: dev | ||
| MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci | ||
| CARGO_TERM_COLOR: always | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Setup Xcode | ||
| uses: maxim-lobanov/setup-xcode@v1 | ||
| with: | ||
| xcode-version: "26.2" | ||
|
|
||
| - name: Install xcodegen | ||
| run: brew install xcodegen | ||
|
|
||
| - name: Install Rust | ||
| uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| targets: aarch64-apple-ios,aarch64-apple-ios-sim | ||
|
|
||
| - name: Cache Rust artifacts | ||
| uses: Swatinem/rust-cache@v2 | ||
| with: | ||
| workspaces: | | ||
| native -> target | ||
| native/rmp-cli -> target | ||
|
|
||
| - name: Set up App Store Connect API key | ||
| env: | ||
| APPLE_API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }} | ||
| APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} | ||
| run: | | ||
| mkdir -p "$RUNNER_TEMP/app-store-connect" | ||
| echo "$APPLE_API_PRIVATE_KEY" | base64 --decode > "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" | ||
| chmod 600 "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" | ||
| echo "APPLE_API_KEY_PATH=$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" >> "$GITHUB_ENV" | ||
|
|
||
| - name: Build and upload native iOS beta | ||
| env: | ||
| APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} | ||
| APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} | ||
| APPLE_API_KEY_PATH: ${{ env.APPLE_API_KEY_PATH }} | ||
| APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} | ||
| run: bash native/scripts/ci/build-ios-testflight.sh | ||
|
|
||
| - name: Upload iOS artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: native-ios-beta | ||
| path: | | ||
| native/target/maple-ci/ios/export/*.ipa | ||
| retention-days: 7 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| name: Native 3.0 Linux Beta | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened, ready_for_review] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: native-3-linux-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| build-linux: | ||
| if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false | ||
| runs-on: ubuntu-latest-8-cores | ||
| env: | ||
| MAPLE_API_ENV: dev | ||
| MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci | ||
| CARGO_TERM_COLOR: always | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Install Rust | ||
| uses: dtolnay/rust-toolchain@stable | ||
|
|
||
| - name: Cache Rust artifacts | ||
| uses: Swatinem/rust-cache@v2 | ||
| with: | ||
| workspaces: | | ||
| native -> target | ||
|
|
||
| - name: Install Nix | ||
| uses: cachix/install-nix-action@v31 | ||
|
|
||
| - name: Install Linux desktop build tools | ||
| env: | ||
| CARGO_CFG_TARGET_OS: linux | ||
| run: cargo install tauri-cli --version 2.9.2 --locked | ||
|
|
||
| - name: Build Linux beta artifacts | ||
| env: | ||
| TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | ||
| TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} | ||
| run: bash native/scripts/ci/package-linux.sh | ||
|
|
||
| - name: Upload Linux artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: native-desktop-linux-beta | ||
| path: | | ||
| native/target/maple-ci/desktop-linux/*.AppImage | ||
| native/target/maple-ci/desktop-linux/*.deb | ||
| native/target/maple-ci/desktop-linux/*.sig | ||
| retention-days: 7 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,95 @@ | ||
| name: Native 3.0 macOS Beta | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [opened, synchronize, reopened, ready_for_review] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: native-3-macos-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| build-macos: | ||
| if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false | ||
| runs-on: macos-26-xlarge | ||
| env: | ||
| MAPLE_API_ENV: dev | ||
| MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci | ||
| CARGO_TERM_COLOR: always | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Setup Xcode | ||
| uses: maxim-lobanov/setup-xcode@v1 | ||
| with: | ||
| xcode-version: "26.2" | ||
|
|
||
| - name: Install xcodegen | ||
| run: brew install xcodegen | ||
|
|
||
| - name: Install Rust | ||
| uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| targets: aarch64-apple-darwin,x86_64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-sim | ||
|
|
||
| - name: Cache Rust artifacts | ||
| uses: Swatinem/rust-cache@v2 | ||
| with: | ||
| workspaces: | | ||
| native -> target | ||
| native/rmp-cli -> target | ||
|
|
||
| - name: Install desktop packaging tools | ||
| env: | ||
| CARGO_CFG_TARGET_OS: macos | ||
| run: cargo install tauri-cli --version 2.9.2 --locked | ||
|
|
||
| - name: Import Apple Developer certificate | ||
| env: | ||
| APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} | ||
| APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} | ||
| KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} | ||
| run: | | ||
| echo "$APPLE_CERTIFICATE" | base64 --decode > "$RUNNER_TEMP/maple-desktop-cert.p12" | ||
| security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain | ||
| security default-keychain -s build.keychain | ||
| security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain | ||
| security set-keychain-settings -t 3600 -u build.keychain | ||
| security import "$RUNNER_TEMP/maple-desktop-cert.p12" -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign | ||
| security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" build.keychain | ||
| CERT_ID=$(security find-identity -v -p codesigning build.keychain | awk -F '"' '/Developer ID Application/ { print $2; exit }') | ||
| echo "APPLE_SIGNING_IDENTITY=$CERT_ID" >> "$GITHUB_ENV" | ||
|
|
||
| - name: Set up App Store Connect API key | ||
| env: | ||
| APPLE_API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }} | ||
| APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} | ||
| run: | | ||
| mkdir -p "$RUNNER_TEMP/app-store-connect" | ||
| echo "$APPLE_API_PRIVATE_KEY" | base64 --decode > "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" | ||
| chmod 600 "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" | ||
| echo "APPLE_API_KEY_PATH=$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" >> "$GITHUB_ENV" | ||
|
|
||
| - name: Build notarized macOS beta artifacts | ||
| env: | ||
| APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} | ||
| APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} | ||
| APPLE_API_KEY_PATH: ${{ env.APPLE_API_KEY_PATH }} | ||
| APPLE_SIGNING_IDENTITY: ${{ env.APPLE_SIGNING_IDENTITY }} | ||
| TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | ||
| TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} | ||
| run: bash native/scripts/ci/package-macos.sh | ||
|
|
||
| - name: Upload macOS artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: native-desktop-macos-beta | ||
| path: | | ||
| native/target/maple-ci/desktop-macos/*.dmg | ||
| native/target/maple-ci/desktop-macos/*.zip | ||
| native/target/maple-ci/desktop-macos/*.sig | ||
| retention-days: 7 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Leading whitespace in
keystore.propertiesmay cause parsing failures.The heredoc content has leading spaces before each property key. Java's
Properties.load()will include these spaces as part of the key names, causing lookups likekeystoreProperties.getProperty("keyAlias")inbuild.gradle.ktsto fail.🐛 Proposed fix
run: | echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/maple-upload.jks" cat > native/android/keystore.properties <<EOF - keyAlias=$ANDROID_KEY_ALIAS - password=$ANDROID_KEY_PASSWORD - storeFile=$RUNNER_TEMP/maple-upload.jks - EOF +keyAlias=$ANDROID_KEY_ALIAS +password=$ANDROID_KEY_PASSWORD +storeFile=$RUNNER_TEMP/maple-upload.jks +EOF🤖 Prompt for AI Agents