chore: quarantine Quest experiment

This commit is contained in:
Bailey Dixon
2026-09-01 18:17:22 -04:00
parent 0650102230
commit c3276fa7e5
52 changed files with 41 additions and 57 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ function classifyCiPaths(paths) {
const under = (prefixes) => paths.some((path) => prefixes.some((prefix) => path.startsWith(prefix)));
return {
android: forceAll || under(['app/', 'relay-core/', 'relay-ui/', 'ui-preview/', 'quest/', 'gradle/']) || exact([
android: forceAll || under(['app/', 'gradle/']) || exact([
'build.gradle.kts', 'settings.gradle.kts', 'gradle.properties', 'gradlew', 'gradlew.bat',
'scripts/check-android-locales.py', 'scripts/android-locale-harness.py',
'scripts/check-android-collection-apis.py', 'scripts/check-android-native-compat.py',
+1 -1
View File
@@ -16,7 +16,7 @@ const none = {
assert.deepEqual(classifyCiPaths(['README.md']), none);
assert.deepEqual(classifyCiPaths(['desktop/src/cli.ts']), { ...none, desktop: true });
assert.deepEqual(classifyCiPaths(['relay-core/src/main/kotlin/Wire.kt']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['experiments/quest/src/main/kotlin/Quest.kt']), none);
assert.deepEqual(classifyCiPaths(['scripts/check-android-release-notes.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/check-android-native-compat.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/android_release_artifacts.py']), { ...none, android: true });
-4
View File
@@ -20,10 +20,6 @@ on:
branches: [main, dev]
paths:
- "app/**"
- "relay-core/**"
- "relay-ui/**"
- "ui-preview/**"
- "quest/**"
- "gradle/**"
- "build.gradle.kts"
- "settings.gradle.kts"
+1 -4
View File
@@ -24,10 +24,7 @@ Thumbs.db
local.properties
/build/
/app/build/
/relay-core/build/
/relay-ui/build/
/ui-preview/build/
/quest/build/
/experiments/quest/**/build/
/app/release/
*.apk
*.aab
+6 -3
View File
@@ -1,6 +1,7 @@
# Hermes Relay Android UI Design Reference
Status: design reference for future Android, Quest, and pairing-flow work.
Status: design reference for Android and pairing-flow work. The quarantined
Quest prototype is retained under `experiments/quest/` for historical context.
Use this document when a future session asks for mobile UI polish, pairing flow changes, QR scanning, connection setup, onboarding, terminal cockpit, or "make it feel more like Orca." It is intentionally a reference, not an implementation task list.
@@ -11,7 +12,6 @@ This project should keep its native Android stack:
- Kotlin + Jetpack Compose + Material 3 for app chrome and interaction flows.
- CameraX + ML Kit for QR scanning.
- Android WebView only where it is already the correct tool, such as xterm.
- Meta Spatial SDK for Quest/XR surfaces where needed.
Do not propose a React Native or Expo migration just because Orca's mobile app uses that stack. The useful lesson from Orca is the visual discipline and pairing UX, not the framework choice.
@@ -205,7 +205,10 @@ Target layout:
### Quest / XR
Use this reference for Quest visual tone, but do not force the phone layout into XR. Quest should keep the spatial cockpit concept:
The inactive Quest prototype is quarantined under `experiments/quest/` and is
not part of the production Android build or normal CI. If development resumes,
use this reference for its visual tone, but do not force the phone layout into
XR. The spatial cockpit concept was:
- MorphingSphere and voice pipeline remain first-class.
- Terminal panels should be spatial, readable, and anchored.
@@ -1,6 +1,12 @@
# Hermes Quest
Spatial SDK Quest app for the Hermes relay terminal cockpit.
> **Status: quarantined experiment.** This project is not shipped, supported,
> or exercised by normal Hermes-Relay CI. It is preserved as a standalone
> prototype for a possible future spatial terminal and voice client.
Spatial SDK Quest prototype for the Hermes relay terminal cockpit. Its
Quest-specific transport and UI modules live beside it so the production
Android build remains independent.
## Build
@@ -8,19 +14,19 @@ From the repo root:
```powershell
$env:ANDROID_HOME='C:\Users\Bailey\AppData\Local\Android\Sdk'
.\gradlew.bat :quest:assembleDebug --console=plain
.\gradlew.bat -p experiments\quest assembleDebug --console=plain
```
APK:
```text
quest\build\outputs\apk\debug\quest-debug.apk
experiments\quest\build\outputs\apk\debug\quest-debug.apk
```
Install on a connected Quest:
```powershell
adb install -r quest\build\outputs\apk\debug\quest-debug.apk
adb install -r experiments\quest\build\outputs\apk\debug\quest-debug.apk
adb shell monkey -p com.axiomlabs.hermesquest.debug 1
```
@@ -54,7 +60,9 @@ and MorphingSphere listening/speaking hooks.
## Tooling
Use Android Studio for Kotlin, Compose, Gradle, logcat, and direct install/run. Open the repo root when working across `:app`, `:relay-core`, and `:relay-ui`; open `quest/` directly when focusing on Spatial SDK or Meta Spatial Editor tasks.
Use Android Studio for Kotlin, Compose, Gradle, logcat, and direct install/run.
Open `experiments/quest/` as its own Gradle project. The production repo root
does not include this experiment in its project graph.
Use Meta Quest Developer Hub for headset setup, ADB pairing, install/uninstall, casting, logcat, and quick device state checks.
@@ -62,8 +70,8 @@ Use Meta Spatial Editor when editing/exporting `.metaspatial`/`.glxf` scenes or
```powershell
$env:ANDROID_HOME='C:\Users\Bailey\AppData\Local\Android\Sdk'
.\gradlew.bat :quest:export -Pquest.exportScenes=true --console=plain
.\gradlew.bat :quest:hotReload -Pquest.exportScenes=true --console=plain
.\gradlew.bat -p experiments\quest export -Pquest.exportScenes=true --console=plain
.\gradlew.bat -p experiments\quest hotReload -Pquest.exportScenes=true --console=plain
```
Normal `assembleDebug` does not require Meta Spatial Editor. The app creates a programmatic spatial terminal panel when exported GLXF scene assets are absent.
@@ -7,6 +7,7 @@ pluginManagement {
plugins {
id("com.android.application") version "9.3.2"
id("com.android.library") version "9.3.2"
id("org.jetbrains.kotlin.jvm") version "2.4.10"
id("org.jetbrains.kotlin.plugin.compose") version "2.4.10"
id("org.jetbrains.kotlin.plugin.serialization") version "2.4.10"
}
@@ -20,10 +21,8 @@ dependencyResolutionManagement {
}
}
rootProject.name = "quest"
rootProject.name = "hermes-quest-experiment"
include(":relay-core")
include(":relay-ui")
project(":relay-core").projectDir = file("../relay-core")
project(":relay-ui").projectDir = file("../relay-ui")
include(":ui-preview")
@@ -2,8 +2,9 @@
A JVM-only **Compose for Desktop** module for iterating on presentational
composables **on the PC with hot reload** — edit, see it live, no
build/deploy/test loop on a device. It is **not shipped**: nothing in the app,
plugin, or CLI release builds depends on it.
build/deploy/test loop on a device. It belongs only to the quarantined Quest
experiment and is **not shipped**: nothing in the production app, plugin, or
CLI release builds depends on it.
## Why this exists
@@ -21,16 +22,15 @@ module *or* to the shared `MorphingSphereCore.kt` reload live.
**Cold run (no hot reload):**
```bash
./gradlew :ui-preview:run
./gradlew -p experiments/quest :ui-preview:run
```
> **First-sync check:** this is the only piece of the dev tooling that pins a
> Compose Multiplatform version (`org.jetbrains.compose` `1.10.3` in
> `build.gradle.kts`) against the repo's Kotlin (`2.3.21`). If a future Kotlin bump
> **First-sync check:** this experimental tooling pins a Compose Multiplatform
> version (`org.jetbrains.compose` `1.12.0` in `build.gradle.kts`) against the
> Quest build's Kotlin (`2.4.10`). If a future Kotlin bump
> breaks the pairing, realign per the
> [Compose compatibility matrix](https://kotlinlang.org/docs/multiplatform/compose-compatibility-and-versioning.html).
> The module is fully additive — removing the `include(":ui-preview")` line in
> `settings.gradle.kts` drops it with zero impact on shipped builds.
> The module is fully additive inside the quarantined build.
## What can live here
@@ -41,16 +41,15 @@ the network must be fed **fake state** from the gallery controls.
### The single-source-of-truth pattern
The sphere is the model to copy. Its **algorithm** lives once in
`MorphingSphereCore.kt` (pure `kotlin.math`), source-shared into this module from
`:relay-ui` and guarded by `MorphingSphereCoreParityTest`. Each surface supplies
only a thin renderer:
Inside this experiment, the sphere algorithm lives in
`relay-ui/.../MorphingSphereCore.kt` (pure `kotlin.math`) and is source-shared
into this module. The production Android and web sphere implementations remain
separate sources of truth outside the experiment.
| Surface | Renderer | Lives in |
|---|---|---|
| Android | `MorphingSphere.kt` (Canvas + `@Preview`) | `:relay-ui`, `:app` |
| Desktop | `DesktopSphere.kt` (Canvas, no `@Preview`) | this module |
| Web | `sphere.js` | `preview/web/` |
| Quest experiment | `MorphingSphere.kt` (Canvas + `@Preview`) | `:relay-ui` |
| Desktop experiment | `DesktopSphere.kt` (Canvas, no `@Preview`) | this module |
To add a component: hoist it to a value-only `@Composable`, add it to
`PreviewGallery` in `Main.kt`, and drive it from controls. If it needs logic that
-12
View File
@@ -32,7 +32,6 @@ media3 = "1.11.0"
androidVad = "2.0.10"
sherpaOnnx = "v1.13.4"
onnxRuntime = "1.27.0"
spatialsdk = "0.13.2"
play-app-update = "2.1.0"
[libraries]
@@ -98,17 +97,6 @@ camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "
media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" }
# Meta Spatial SDK
meta-spatial-sdk-base = { group = "com.meta.spatial", name = "meta-spatial-sdk", version.ref = "spatialsdk" }
meta-spatial-sdk-compose = { group = "com.meta.spatial", name = "meta-spatial-sdk-compose", version.ref = "spatialsdk" }
meta-spatial-sdk-ovrmetrics = { group = "com.meta.spatial", name = "meta-spatial-sdk-ovrmetrics", version.ref = "spatialsdk" }
meta-spatial-sdk-toolkit = { group = "com.meta.spatial", name = "meta-spatial-sdk-toolkit", version.ref = "spatialsdk" }
meta-spatial-sdk-vr = { group = "com.meta.spatial", name = "meta-spatial-sdk-vr", version.ref = "spatialsdk" }
meta-spatial-sdk-isdk = { group = "com.meta.spatial", name = "meta-spatial-sdk-isdk", version.ref = "spatialsdk" }
meta-spatial-sdk-castinputforward = { group = "com.meta.spatial", name = "meta-spatial-sdk-castinputforward", version.ref = "spatialsdk" }
meta-spatial-sdk-hotreload = { group = "com.meta.spatial", name = "meta-spatial-sdk-hotreload", version.ref = "spatialsdk" }
meta-spatial-sdk-datamodelinspector = { group = "com.meta.spatial", name = "meta-spatial-sdk-datamodelinspector", version.ref = "spatialsdk" }
meta-spatial-sdk-uiset = { group = "com.meta.spatial", name = "meta-spatial-sdk-uiset", version.ref = "spatialsdk" }
meta-spatial-sdk-mruk = { group = "com.meta.spatial", name = "meta-spatial-sdk-mruk", version.ref = "spatialsdk" }
# android-vad (Silero) — on-device voice activity detection for barge-in (B2)
android-vad-silero = { group = "com.github.gkonovalov.android-vad", name = "silero", version.ref = "androidVad" }
-6
View File
@@ -27,9 +27,3 @@ dependencyResolutionManagement {
rootProject.name = "hermes-relay"
include(":app")
include(":relay-core")
include(":relay-ui")
// Desktop Compose Hot Reload harness for fast UI iteration. Not shipped — no
// release artifact depends on it. See docs/ui-preview / ui-preview/README.md.
include(":ui-preview")
includeBuild("quest")