mirror of
https://github.com/hanzoai/bot.git
synced 2026-10-30 17:24:26 +00:00
Merged 3580 upstream commits from openclaw/main through a bridge branch that applied the openclaw→hanzo-bot rebrand before merging. Key upstream additions: - Android device diagnostics and notification actions - Device-auth v2 migration improvements - Docker CLI packaging fixes - Ollama discovery log demotion - Channel health monitoring - Slack native streaming - Linq iMessage channel - Gemini OAuth and FTS improvements - Inbound sender metadata - Daemon PATH improvements - Canvas host and onboarding enhancements - Security hardening (session files, exec allowlist)
Hanzo Bot Node (Android) (internal)
Modern Android node app: connects to the Gateway WebSocket (_bot-gw._tcp) and exposes Canvas + Chat + Camera.
Notes:
- The node keeps the connection alive via a foreground service (persistent notification with a Disconnect action).
- Chat always uses the shared session key
main(same session across iOS/macOS/WebChat/Android). - Supports modern Android only (
minSdk 31, Kotlin + Jetpack Compose).
Open in Android Studio
- Open the folder
apps/android.
Build / Run
cd apps/android
./gradlew :app:assembleDebug
./gradlew :app:installDebug
./gradlew :app:testDebugUnitTest
gradlew auto-detects the Android SDK at ~/Library/Android/sdk (macOS default) if ANDROID_SDK_ROOT / ANDROID_HOME are unset.
Connect / Pair
- Start the gateway (on your “master” machine):
pnpm hanzo-bot gateway --port 18789 --verbose
- In the Android app:
- Open Settings
- Either select a discovered gateway under Discovered Gateways, or use Advanced → Manual Gateway (host + port).
- Approve pairing (on the gateway machine):
hanzo-bot nodes pending
hanzo-bot nodes approve <requestId>
More details: docs/platforms/android.md.
Permissions
- Discovery:
- Android 13+ (
API 33+):NEARBY_WIFI_DEVICES - Android 12 and below:
ACCESS_FINE_LOCATION(required for NSD scanning)
- Android 13+ (
- Foreground service notification (Android 13+):
POST_NOTIFICATIONS - Camera:
CAMERAforcamera.snapandcamera.clipRECORD_AUDIOforcamera.clipwhenincludeAudio=true