@elizaos/app-core 2.0.0-beta.2 → 2.0.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-bridge.d.ts +27 -0
- package/agent-bridge.d.ts.map +1 -0
- package/agent-bridge.js +26 -0
- package/api/__tests__/sandbox-test-helpers.js +1 -1
- package/api/auth/audit.js +1 -1
- package/api/auth/auth-context.js +1 -1
- package/api/auth/bootstrap-token.js +2 -2
- package/api/auth/index.d.ts +9 -10
- package/api/auth/index.d.ts.map +1 -1
- package/api/auth/index.js +9 -10
- package/api/auth/passwords.js +2 -2
- package/api/auth/sensitive-rate-limit.d.ts +1 -4
- package/api/auth/sensitive-rate-limit.d.ts.map +1 -1
- package/api/auth/sensitive-rate-limit.js +6 -6
- package/api/auth/sessions.js +2 -2
- package/api/auth-bootstrap-routes.d.ts +6 -13
- package/api/auth-bootstrap-routes.d.ts.map +1 -1
- package/api/auth-bootstrap-routes.js +14 -27
- package/api/auth-pairing-routes.d.ts +17 -0
- package/api/auth-pairing-routes.d.ts.map +1 -0
- package/api/auth-pairing-routes.js +300 -0
- package/api/auth-session-routes.d.ts.map +1 -1
- package/api/auth-session-routes.js +36 -15
- package/api/auth.d.ts +12 -19
- package/api/auth.d.ts.map +1 -1
- package/api/auth.js +32 -27
- package/api/automations-compat-routes.d.ts.map +1 -1
- package/api/automations-compat-routes.js +5 -5
- package/api/background-tasks-routes.d.ts +4 -0
- package/api/background-tasks-routes.d.ts.map +1 -0
- package/api/background-tasks-routes.js +63 -0
- package/api/catalog-routes.js +3 -3
- package/api/cloud-pair-route.d.ts +26 -0
- package/api/cloud-pair-route.d.ts.map +1 -0
- package/api/cloud-pair-route.js +222 -0
- package/api/cloud-voice-routes.d.ts +52 -0
- package/api/cloud-voice-routes.d.ts.map +1 -0
- package/api/cloud-voice-routes.js +50 -0
- package/api/compat-route-shared.d.ts +2 -2
- package/api/compat-route-shared.d.ts.map +1 -1
- package/api/compat-route-shared.js +11 -7
- package/api/credential-resolver.d.ts +2 -2
- package/api/credential-resolver.d.ts.map +1 -1
- package/api/credential-resolver.js +8 -2
- package/api/database-rows-compat-routes.d.ts.map +1 -1
- package/api/database-rows-compat-routes.js +69 -31
- package/api/dev-boot-history.d.ts +26 -0
- package/api/dev-boot-history.d.ts.map +1 -0
- package/api/dev-boot-history.js +69 -0
- package/api/dev-compat-routes.d.ts +5 -0
- package/api/dev-compat-routes.d.ts.map +1 -1
- package/api/dev-compat-routes.js +127 -4
- package/api/dev-console-log.d.ts +2 -2
- package/api/dev-console-log.d.ts.map +1 -1
- package/api/dev-console-log.js +8 -5
- package/api/dev-route-catalog.d.ts +58 -0
- package/api/dev-route-catalog.d.ts.map +1 -0
- package/api/dev-route-catalog.js +457 -0
- package/api/dev-stack.d.ts.map +1 -1
- package/api/dev-stack.js +6 -9
- package/api/first-run-routes.d.ts +4 -0
- package/api/first-run-routes.d.ts.map +1 -0
- package/api/first-run-routes.js +208 -0
- package/api/first-run-tts-route.d.ts +19 -0
- package/api/first-run-tts-route.d.ts.map +1 -0
- package/api/first-run-tts-route.js +59 -0
- package/api/internal-routes.d.ts +23 -0
- package/api/internal-routes.d.ts.map +1 -0
- package/api/internal-routes.js +203 -0
- package/api/ios-local-agent-transport.d.ts +36 -0
- package/api/ios-local-agent-transport.d.ts.map +1 -0
- package/api/ios-local-agent-transport.js +566 -0
- package/api/onboarding-voice-lines.d.ts +23 -0
- package/api/onboarding-voice-lines.d.ts.map +1 -0
- package/api/onboarding-voice-lines.js +8 -0
- package/api/perf-instrument.d.ts +43 -0
- package/api/perf-instrument.d.ts.map +1 -0
- package/api/perf-instrument.js +113 -0
- package/api/response.d.ts.map +1 -1
- package/api/response.js +14 -14
- package/api/runtime-mode-routes.d.ts.map +1 -1
- package/api/runtime-mode-routes.js +2 -2
- package/api/secrets-inventory-routes.js +2 -2
- package/api/secrets-manager-routes.d.ts +1 -1
- package/api/secrets-manager-routes.d.ts.map +1 -1
- package/api/secrets-manager-routes.js +9 -10
- package/api/sensitive-request-routes.d.ts.map +1 -1
- package/api/sensitive-request-routes.js +5 -5
- package/api/sensitive-request-store.d.ts +12 -3
- package/api/sensitive-request-store.d.ts.map +1 -1
- package/api/server-cors.d.ts.map +1 -1
- package/api/server-cors.js +13 -2
- package/api/server-first-run-helpers.d.ts +26 -0
- package/api/server-first-run-helpers.d.ts.map +1 -0
- package/api/server-first-run-helpers.js +271 -0
- package/api/server-security.js +1 -1
- package/api/server-startup.d.ts.map +1 -1
- package/api/server-startup.js +3 -4
- package/api/server-wallet-trade.js +1 -1
- package/api/server.d.ts +4 -4
- package/api/server.d.ts.map +1 -1
- package/api/server.js +222 -88
- package/api/setup-contract.d.ts +63 -0
- package/api/setup-contract.d.ts.map +1 -0
- package/api/setup-contract.js +39 -0
- package/api/training-benchmarks.d.ts +97 -0
- package/api/training-benchmarks.d.ts.map +1 -0
- package/api/training-benchmarks.js +307 -0
- package/api/workbench-compat-routes.js +2 -2
- package/benchmark/cerebras-autowire.d.ts +28 -0
- package/benchmark/cerebras-autowire.d.ts.map +1 -0
- package/benchmark/cerebras-autowire.js +62 -0
- package/benchmark/lifeops-bench-handler.d.ts +36 -0
- package/benchmark/lifeops-bench-handler.d.ts.map +1 -1
- package/benchmark/lifeops-bench-handler.js +63 -1
- package/benchmark/lifeops-fake-backend.d.ts +39 -0
- package/benchmark/lifeops-fake-backend.d.ts.map +1 -1
- package/benchmark/lifeops-fake-backend.js +993 -21
- package/benchmark/mock-plugin.d.ts.map +1 -1
- package/benchmark/mock-plugin.js +0 -24
- package/benchmark/plugin.d.ts +2 -1
- package/benchmark/plugin.d.ts.map +1 -1
- package/benchmark/plugin.js +989 -68
- package/benchmark/replay-capture.d.ts +2 -2
- package/benchmark/replay-capture.d.ts.map +1 -1
- package/benchmark/replay-capture.js +3 -3
- package/benchmark/server-utils.d.ts +162 -9
- package/benchmark/server-utils.d.ts.map +1 -1
- package/benchmark/server-utils.js +625 -62
- package/benchmark/server.d.ts.map +1 -1
- package/benchmark/server.js +1962 -118
- package/boot-profile.d.ts +3 -0
- package/boot-profile.d.ts.map +1 -0
- package/boot-profile.js +30 -0
- package/browser.d.ts +23 -1
- package/browser.d.ts.map +1 -1
- package/browser.js +20 -1
- package/cli/argv.js +1 -1
- package/cli/banner.js +1 -1
- package/cli/command-format.js +2 -2
- package/cli/doctor/checks.d.ts.map +1 -1
- package/cli/doctor/checks.js +6 -6
- package/cli/plugins-cli.d.ts.map +1 -1
- package/cli/plugins-cli.js +77 -32
- package/cli/profile.d.ts.map +1 -1
- package/cli/profile.js +5 -4
- package/cli/program/build-program.js +4 -4
- package/cli/program/command-registry.d.ts.map +1 -1
- package/cli/program/command-registry.js +13 -11
- package/cli/program/help.js +5 -5
- package/cli/program/preaction.js +5 -5
- package/cli/program/register.auth.d.ts.map +1 -1
- package/cli/program/register.auth.js +6 -12
- package/cli/program/register.capability-router.d.ts +29 -0
- package/cli/program/register.capability-router.d.ts.map +1 -0
- package/cli/program/register.capability-router.js +568 -0
- package/cli/program/register.config.js +1 -1
- package/cli/program/register.configure.d.ts.map +1 -1
- package/cli/program/register.configure.js +1 -1
- package/cli/program/register.dashboard.d.ts.map +1 -1
- package/cli/program/register.dashboard.js +6 -7
- package/cli/program/register.db.d.ts.map +1 -1
- package/cli/program/register.db.js +3 -4
- package/cli/program/register.doctor.js +7 -7
- package/cli/program/register.setup.d.ts.map +1 -1
- package/cli/program/register.setup.js +14 -10
- package/cli/program/register.start.d.ts.map +1 -1
- package/cli/program/register.start.js +5 -3
- package/cli/program/register.subclis.js +3 -3
- package/cli/program/register.update.d.ts +6 -0
- package/cli/program/register.update.d.ts.map +1 -1
- package/cli/program/register.update.js +58 -6
- package/cli/program.js +1 -1
- package/cli/run-main.js +4 -4
- package/config/app-config.d.ts +2 -0
- package/config/app-config.d.ts.map +1 -0
- package/config/app-config.js +1 -0
- package/connectors/capacitor-jsc.d.ts.map +1 -1
- package/connectors/capacitor-jsc.js +16 -10
- package/connectors/capacitor-quickjs.d.ts.map +1 -1
- package/connectors/capacitor-quickjs.js +18 -13
- package/connectors/capacitor-sqlite.d.ts.map +1 -1
- package/connectors/capacitor-sqlite.js +27 -12
- package/dispatch/approval-queue.d.ts +37 -0
- package/dispatch/approval-queue.d.ts.map +1 -0
- package/dispatch/approval-queue.js +25 -0
- package/dispatch/channel-registry.d.ts +30 -0
- package/dispatch/channel-registry.d.ts.map +1 -0
- package/dispatch/channel-registry.js +22 -0
- package/dispatch/connector-registry.d.ts +39 -0
- package/dispatch/connector-registry.d.ts.map +1 -0
- package/dispatch/connector-registry.js +24 -0
- package/dispatch/index.d.ts +14 -0
- package/dispatch/index.d.ts.map +1 -0
- package/dispatch/index.js +13 -0
- package/dispatch/send-policy.d.ts +36 -0
- package/dispatch/send-policy.d.ts.map +1 -0
- package/dispatch/send-policy.js +16 -0
- package/entry.js +28 -11
- package/first-run/first-run-config.d.ts +55 -0
- package/first-run/first-run-config.d.ts.map +1 -0
- package/first-run/first-run-config.js +178 -0
- package/first-run/runtime-target.d.ts +4 -0
- package/first-run/runtime-target.d.ts.map +1 -0
- package/first-run/runtime-target.js +13 -0
- package/index.d.ts +16 -3
- package/index.d.ts.map +1 -1
- package/index.js +57 -33
- package/package.json +159 -50
- package/packaging/debian/apt-repo-config/README.md +18 -0
- package/packaging/debian/apt-repo-config/conf/distributions +11 -0
- package/packaging/flatpak/README.md +26 -16
- package/packaging/flatpak/ai.elizaos.App.metainfo.xml +17 -12
- package/packaging/flatpak/ai.elizaos.App.store.yml +5 -5
- package/packaging/flatpak/ai.elizaos.App.yml +10 -24
- package/packaging/flatpak/elizaos-app-wrapper.store.sh +2 -2
- package/packaging/flatpak/generate-sources.sh +74 -0
- package/packaging/flatpak/node-sources.json +7930 -0
- package/packaging/inno/build-inno.ps1 +34 -9
- package/packaging/msix/AppxManifest.store.xml +1 -1
- package/packaging/msix/README.md +39 -19
- package/packaging/msix/build-msix.ps1 +44 -14
- package/packaging/snap/snapcraft.yaml +22 -21
- package/packaging/test-packaging.sh +2 -2
- package/permissions/types.d.ts +1 -1
- package/permissions/types.js +1 -1
- package/platform/elizaos-agent-browser-stub.d.ts +144 -0
- package/platform/elizaos-agent-browser-stub.d.ts.map +1 -0
- package/platform/elizaos-agent-browser-stub.js +158 -0
- package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts +34 -0
- package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts.map +1 -0
- package/platform/elizaos-plugin-elizacloud-browser-stub.js +51 -0
- package/platform/empty-node-module.d.ts +148 -0
- package/platform/empty-node-module.d.ts.map +1 -1
- package/platform/empty-node-module.js +140 -3
- package/platform/ios-runtime-backends.d.ts +83 -0
- package/platform/ios-runtime-backends.d.ts.map +1 -0
- package/platform/ios-runtime-backends.js +133 -0
- package/platform/ios-runtime-bridge.d.ts +15 -0
- package/platform/ios-runtime-bridge.d.ts.map +1 -0
- package/platform/ios-runtime-bridge.js +527 -0
- package/platform/native-library-policy.d.ts +23 -0
- package/platform/native-library-policy.d.ts.map +1 -0
- package/platform/native-library-policy.js +112 -0
- package/platform/native-plugin-entrypoints.d.ts +19 -0
- package/platform/native-plugin-entrypoints.d.ts.map +1 -0
- package/platform/native-plugin-entrypoints.js +29 -0
- package/platforms/android/README.md +68 -10
- package/platforms/android/app/build.gradle +268 -3
- package/platforms/android/app/capacitor.build.gradle +18 -1
- package/platforms/android/app/proguard-rules.pro +17 -2
- package/platforms/android/app/src/androidTest/java/ai/elizaos/app/ElizaOsInstrumentedTest.java +1 -1
- package/platforms/android/app/src/main/AndroidManifest.xml +335 -18
- package/platforms/android/app/src/main/assets/runners/eliza-tasks.js +177 -0
- package/platforms/android/app/src/main/elizavoice-jni/CMakeLists.txt +100 -0
- package/platforms/android/app/src/main/elizavoice-jni/elizavoice-jni.cpp +1485 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/AgentPlugin.java +111 -171
- package/platforms/android/app/src/main/java/ai/elizaos/app/AndroidVirtualizationBridge.java +284 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/BatteryOptimizationPlugin.java +95 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAccessibilityService.java +55 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAgentService.java +1255 -141
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAndroidSystemBridge.java +83 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAssistActivity.java +50 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBionicInferenceServer.java +400 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBootReceiver.java +90 -8
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBrowserActivity.java +2 -2
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCalendarActivity.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCameraActivity.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaClockActivity.java +2 -2
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaContactsActivity.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaDialActivity.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaInCallService.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaMmsReceiver.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNativeBridge.java +22 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNotificationListenerService.java +45 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaQuickActionsWidgetProvider.java +68 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaShareActivity.java +132 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsComposeActivity.java +1 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsGatewayService.java +268 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsReceiver.java +12 -1
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaTasksWorker.java +194 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceCaptureService.java +198 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceNative.java +220 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoicePlugin.java +498 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceTileService.java +39 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaWorkScheduler.java +60 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/GatewayConnectionService.java +53 -19
- package/platforms/android/app/src/main/java/ai/elizaos/app/MainActivity.java +160 -33
- package/platforms/android/app/src/main/java/ai/elizaos/app/ResourceProbePlugin.java +169 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/VoiceCapturePlugin.java +119 -0
- package/platforms/android/app/src/main/res/drawable/eliza_widget_background.xml +10 -0
- package/platforms/android/app/src/main/res/drawable/eliza_widget_button_background.xml +13 -0
- package/platforms/android/app/src/main/res/drawable/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/layout/eliza_quick_actions_widget.xml +86 -0
- package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +2 -1
- package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +2 -1
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/values/android_app_actions.xml +48 -0
- package/platforms/android/app/src/main/res/values/colors.xml +8 -0
- package/platforms/android/app/src/main/res/values/ic_launcher_background.xml +2 -2
- package/platforms/android/app/src/main/res/values/strings.xml +2 -2
- package/platforms/android/app/src/main/res/values/styles.xml +25 -1
- package/platforms/android/app/src/main/res/xml/eliza_accessibility_service.xml +9 -0
- package/platforms/android/app/src/main/res/xml/eliza_quick_actions_widget.xml +13 -0
- package/platforms/android/app/src/main/res/xml/shortcuts.xml +121 -0
- package/platforms/android/build.gradle +2 -2
- package/platforms/android/capacitor-cordova-android-plugins/build.gradle +9 -3
- package/platforms/android/capacitor-cordova-android-plugins/cordova.variables.gradle +6 -2
- package/platforms/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml +7 -2
- package/platforms/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep +0 -1
- package/platforms/android/capacitor.settings.gradle +66 -16
- package/platforms/android/gradle.properties +1 -0
- package/platforms/android/update-manifest/generate-manifest.mjs +97 -0
- package/platforms/android/update-manifest/schema.json +26 -0
- package/platforms/apple-store-entitlements.reviewed.json +155 -0
- package/platforms/electrobun/.generated/brand-config.json +3 -2
- package/platforms/electrobun/LICENSE +21 -0
- package/platforms/electrobun/README.md +15 -1
- package/platforms/electrobun/assets/appIcon.icns +0 -0
- package/platforms/electrobun/assets/appIcon.ico +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_128x128.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_128x128@2x.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_16x16.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_16x16@2x.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_256x256.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_256x256@2x.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_32x32.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_32x32@2x.png +0 -0
- package/platforms/electrobun/assets/appIcon.iconset/icon_512x512.png +0 -0
- package/platforms/electrobun/assets/brand-config.json +6 -6
- package/platforms/electrobun/biome.json +9 -9
- package/platforms/electrobun/docs/capability-collapse-matrix.json +318 -0
- package/platforms/electrobun/docs/capability-collapse-matrix.md +129 -0
- package/platforms/electrobun/docs/capability-routing.md +86 -0
- package/platforms/electrobun/docs/convergence-audit.json +3505 -0
- package/platforms/electrobun/docs/convergence-audit.md +694 -0
- package/platforms/electrobun/docs/database-boot-policy.md +90 -0
- package/platforms/electrobun/docs/riscv64-port.md +175 -0
- package/platforms/electrobun/docs/startup-first-run-cleanup.md +18 -0
- package/platforms/electrobun/docs/trace-first-annotations.md +52 -0
- package/platforms/electrobun/docs/ui-boundary-audit.json +580 -0
- package/platforms/electrobun/docs/ui-boundary-audit.md +257 -0
- package/platforms/electrobun/electrobun.config.ts +592 -364
- package/platforms/electrobun/entitlements/JUSTIFICATIONS.md +141 -0
- package/platforms/electrobun/entitlements/README.md +34 -6
- package/platforms/electrobun/entitlements/mas-bun.entitlements +15 -0
- package/platforms/electrobun/entitlements/mas.entitlements +6 -4
- package/platforms/electrobun/native/macos/window-effects.mm +1522 -0
- package/platforms/electrobun/package.json +18 -12
- package/platforms/electrobun/remotes/fs/README.md +70 -0
- package/platforms/electrobun/remotes/fs/electrobun.config.ts +38 -0
- package/platforms/electrobun/remotes/fs/package.json +12 -0
- package/platforms/electrobun/remotes/fs/plugin.json +25 -0
- package/platforms/electrobun/remotes/fs/src/bun/errors.ts +57 -0
- package/platforms/electrobun/remotes/fs/src/bun/file-limits.ts +50 -0
- package/platforms/electrobun/remotes/fs/src/bun/fs-service.ts +389 -0
- package/platforms/electrobun/remotes/fs/src/bun/path-guard.ts +270 -0
- package/platforms/electrobun/remotes/fs/src/bun/protocol.ts +149 -0
- package/platforms/electrobun/remotes/fs/src/bun/worker.ts +174 -0
- package/platforms/electrobun/remotes/fs/src/dev/phase5-smoke.ts +171 -0
- package/platforms/electrobun/remotes/fs/src/web/index.html +8 -0
- package/platforms/electrobun/remotes/git/README.md +75 -0
- package/platforms/electrobun/remotes/git/electrobun.config.ts +44 -0
- package/platforms/electrobun/remotes/git/package.json +12 -0
- package/platforms/electrobun/remotes/git/plugin.json +31 -0
- package/platforms/electrobun/remotes/git/src/bun/errors.ts +69 -0
- package/platforms/electrobun/remotes/git/src/bun/git-command.ts +156 -0
- package/platforms/electrobun/remotes/git/src/bun/git-service.ts +446 -0
- package/platforms/electrobun/remotes/git/src/bun/operation-history.ts +124 -0
- package/platforms/electrobun/remotes/git/src/bun/protocol.ts +252 -0
- package/platforms/electrobun/remotes/git/src/bun/worker.ts +316 -0
- package/platforms/electrobun/remotes/git/src/dev/phase7-smoke.ts +141 -0
- package/platforms/electrobun/remotes/git/src/web/index.html +8 -0
- package/platforms/electrobun/remotes/local-model/README.md +138 -0
- package/platforms/electrobun/remotes/local-model/electrobun.config.ts +46 -0
- package/platforms/electrobun/remotes/local-model/package.json +12 -0
- package/platforms/electrobun/remotes/local-model/plugin.json +33 -0
- package/platforms/electrobun/remotes/local-model/src/bun/download-state.ts +115 -0
- package/platforms/electrobun/remotes/local-model/src/bun/eliza1-catalog.ts +405 -0
- package/platforms/electrobun/remotes/local-model/src/bun/errors.ts +74 -0
- package/platforms/electrobun/remotes/local-model/src/bun/hf-eliza1-client.ts +169 -0
- package/platforms/electrobun/remotes/local-model/src/bun/local-inference-api-client.ts +245 -0
- package/platforms/electrobun/remotes/local-model/src/bun/model-service.ts +490 -0
- package/platforms/electrobun/remotes/local-model/src/bun/protocol.ts +301 -0
- package/platforms/electrobun/remotes/local-model/src/bun/worker.ts +248 -0
- package/platforms/electrobun/remotes/local-model/src/dev/phase8-smoke.ts +116 -0
- package/platforms/electrobun/remotes/local-model/src/web/index.html +13 -0
- package/platforms/electrobun/remotes/pty/README.md +65 -0
- package/platforms/electrobun/remotes/pty/electrobun.config.ts +47 -0
- package/platforms/electrobun/remotes/pty/package.json +12 -0
- package/platforms/electrobun/remotes/pty/plugin.json +34 -0
- package/platforms/electrobun/remotes/pty/src/bun/errors.ts +57 -0
- package/platforms/electrobun/remotes/pty/src/bun/output-buffer.ts +127 -0
- package/platforms/electrobun/remotes/pty/src/bun/protocol.ts +192 -0
- package/platforms/electrobun/remotes/pty/src/bun/pty-service.ts +562 -0
- package/platforms/electrobun/remotes/pty/src/bun/worker.ts +218 -0
- package/platforms/electrobun/remotes/pty/src/dev/phase6-smoke.ts +127 -0
- package/platforms/electrobun/remotes/pty/src/web/index.html +8 -0
- package/platforms/electrobun/remotes/runtime/README.md +370 -0
- package/platforms/electrobun/remotes/runtime/electrobun.config.ts +48 -0
- package/platforms/electrobun/remotes/runtime/package.json +14 -0
- package/platforms/electrobun/remotes/runtime/plugin.json +30 -0
- package/platforms/electrobun/remotes/runtime/src/bun/api-client.ts +620 -0
- package/platforms/electrobun/remotes/runtime/src/bun/errors.ts +45 -0
- package/platforms/electrobun/remotes/runtime/src/bun/log-buffer.ts +33 -0
- package/platforms/electrobun/remotes/runtime/src/bun/protocol.ts +366 -0
- package/platforms/electrobun/remotes/runtime/src/bun/route-discovery.ts +419 -0
- package/platforms/electrobun/remotes/runtime/src/bun/runtime-manager.ts +423 -0
- package/platforms/electrobun/remotes/runtime/src/bun/sse-parser.ts +99 -0
- package/platforms/electrobun/remotes/runtime/src/bun/stream-manager.ts +887 -0
- package/platforms/electrobun/remotes/runtime/src/bun/worker.ts +1231 -0
- package/platforms/electrobun/remotes/runtime/src/dev/phase1-smoke.ts +34 -0
- package/platforms/electrobun/remotes/runtime/src/dev/phase2-smoke.ts +86 -0
- package/platforms/electrobun/remotes/runtime/src/dev/phase3-smoke.ts +141 -0
- package/platforms/electrobun/remotes/runtime/src/web/index.css +187 -0
- package/platforms/electrobun/remotes/runtime/src/web/index.html +76 -0
- package/platforms/electrobun/remotes/runtime/src/web/index.ts +192 -0
- package/platforms/electrobun/remotes/surface/README.md +201 -0
- package/platforms/electrobun/remotes/surface/electrobun.config.ts +38 -0
- package/platforms/electrobun/remotes/surface/package.json +12 -0
- package/platforms/electrobun/remotes/surface/plugin.json +28 -0
- package/platforms/electrobun/remotes/surface/src/bun/worker.ts +132 -0
- package/platforms/electrobun/remotes/surface/src/dev/phase4-smoke.ts +566 -0
- package/platforms/electrobun/remotes/surface/src/protocol/event-types.ts +84 -0
- package/platforms/electrobun/remotes/surface/src/protocol/runtime-client.ts +673 -0
- package/platforms/electrobun/remotes/surface/src/web/app.ts +595 -0
- package/platforms/electrobun/remotes/surface/src/web/index.css +460 -0
- package/platforms/electrobun/remotes/surface/src/web/index.html +466 -0
- package/platforms/electrobun/remotes/surface/src/web/index.ts +5 -0
- package/platforms/electrobun/remotes/surface/src/web/render.ts +455 -0
- package/platforms/electrobun/remotes/surface/src/web/state.ts +427 -0
- package/platforms/electrobun/scripts/build-macos-effects.sh +4 -0
- package/platforms/electrobun/scripts/ensure-build-folder.ts +28 -0
- package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +55 -0
- package/platforms/electrobun/scripts/ensure-whisper-model.sh +22 -80
- package/platforms/electrobun/scripts/generate-convergence-audit.ts +1203 -0
- package/platforms/electrobun/scripts/local-adhoc-sign-macos.ts +159 -159
- package/platforms/electrobun/scripts/postwrap-diagnostics.ts +424 -339
- package/platforms/electrobun/scripts/postwrap-sign-runtime-macos.ts +302 -271
- package/platforms/electrobun/scripts/smoke-test-windows.ps1 +17 -16
- package/platforms/electrobun/scripts/smoke-test.sh +5 -7
- package/platforms/electrobun/scripts/sync-web-assets.mjs +13 -13
- package/platforms/electrobun/scripts/verify-rpc-handlers.ts +109 -110
- package/platforms/electrobun/scripts/verify-windows-installer-proof.ps1 +3 -8
- package/platforms/electrobun/src/__stubs__/bun-ffi.ts +31 -31
- package/platforms/electrobun/src/__stubs__/electrobun-bun.ts +1 -1
- package/platforms/electrobun/src/agent-ready-state.ts +8 -8
- package/platforms/electrobun/src/agent-reset-from-main.test.ts +162 -0
- package/platforms/electrobun/src/agent-reset-from-main.ts +62 -62
- package/platforms/electrobun/src/agent-status-rpc.test.ts +95 -0
- package/platforms/electrobun/src/agent-status-rpc.ts +156 -0
- package/platforms/electrobun/src/api-base.test.ts +247 -0
- package/platforms/electrobun/src/api-base.ts +202 -93
- package/platforms/electrobun/src/application-menu-action-registry.ts +9 -9
- package/platforms/electrobun/src/application-menu.ts +348 -348
- package/platforms/electrobun/src/background-notice.ts +36 -36
- package/platforms/electrobun/src/boot-progress.test.ts +188 -0
- package/platforms/electrobun/src/boot-progress.ts +111 -0
- package/platforms/electrobun/src/brand-config.test.ts +39 -0
- package/platforms/electrobun/src/brand-config.ts +141 -129
- package/platforms/electrobun/src/bridge/browser-tabs-renderer-registry.ts +28 -28
- package/platforms/electrobun/src/bridge/electrobun-boot-config.ts +42 -0
- package/platforms/electrobun/src/bridge/electrobun-crypto-ready.ts +120 -0
- package/platforms/electrobun/src/bridge/electrobun-direct-rpc.ts +342 -357
- package/platforms/electrobun/src/bridge/electrobun-stub.ts +13 -13
- package/platforms/electrobun/src/browser-workspace-bridge-server.ts +285 -243
- package/platforms/electrobun/src/cloud-auth-window.ts +136 -136
- package/platforms/electrobun/src/cloud-disconnect-from-main.ts +90 -90
- package/platforms/electrobun/src/config-and-auth-rpc.test.ts +256 -0
- package/platforms/electrobun/src/config-and-auth-rpc.ts +302 -0
- package/platforms/electrobun/src/conversations-and-character-rpc.test.ts +185 -0
- package/platforms/electrobun/src/conversations-and-character-rpc.ts +131 -0
- package/platforms/electrobun/src/dashboard-rpc.test.ts +200 -0
- package/platforms/electrobun/src/dashboard-rpc.ts +344 -0
- package/platforms/electrobun/src/database/database-lock.ts +141 -0
- package/platforms/electrobun/src/database/database-mode.ts +149 -0
- package/platforms/electrobun/src/database/database-recovery.ts +72 -0
- package/platforms/electrobun/src/database/database-snapshot.ts +190 -0
- package/platforms/electrobun/src/database/database.test.ts +196 -0
- package/platforms/electrobun/src/database/index.ts +5 -0
- package/platforms/electrobun/src/database/pglite-paths.ts +100 -0
- package/platforms/electrobun/src/desktop-deep-link-events.test.ts +30 -0
- package/platforms/electrobun/src/desktop-deep-link-events.ts +17 -0
- package/platforms/electrobun/src/desktop-http-request.test.ts +73 -73
- package/platforms/electrobun/src/desktop-http-request.ts +85 -85
- package/platforms/electrobun/src/desktop-pill-config.test.ts +27 -0
- package/platforms/electrobun/src/desktop-pill-config.ts +40 -0
- package/platforms/electrobun/src/desktop-test-bridge-server.ts +204 -204
- package/platforms/electrobun/src/desktop-tray-config.test.ts +87 -0
- package/platforms/electrobun/src/desktop-tray-config.ts +84 -0
- package/platforms/electrobun/src/devtools-layout.ts +41 -41
- package/platforms/electrobun/src/diagnostic-format.test.ts +71 -0
- package/platforms/electrobun/src/diagnostic-format.ts +75 -36
- package/platforms/electrobun/src/dynamic-view-rpc-schema.test.ts +37 -0
- package/platforms/electrobun/src/dynamic-views/README.md +44 -0
- package/platforms/electrobun/src/dynamic-views/demo/agent-run-trace.html +135 -0
- package/platforms/electrobun/src/dynamic-views/errors.ts +29 -0
- package/platforms/electrobun/src/dynamic-views/host.test.ts +353 -0
- package/platforms/electrobun/src/dynamic-views/host.ts +332 -0
- package/platforms/electrobun/src/dynamic-views/index.ts +57 -0
- package/platforms/electrobun/src/dynamic-views/kiosk-canvas.ts +89 -0
- package/platforms/electrobun/src/dynamic-views/registry.test.ts +139 -0
- package/platforms/electrobun/src/dynamic-views/registry.ts +196 -0
- package/platforms/electrobun/src/dynamic-views/session-manager.test.ts +355 -0
- package/platforms/electrobun/src/dynamic-views/session-manager.ts +348 -0
- package/platforms/electrobun/src/dynamic-views/types.ts +105 -0
- package/platforms/electrobun/src/electrobun-boot-config.test.ts +50 -0
- package/platforms/electrobun/src/electrobun-config.test.ts +62 -0
- package/platforms/electrobun/src/electrobun-crypto-ready.test.ts +65 -0
- package/platforms/electrobun/src/electrobun-window-options.ts +25 -0
- package/platforms/electrobun/src/extension-rpc.test.ts +88 -0
- package/platforms/electrobun/src/extension-rpc.ts +102 -0
- package/platforms/electrobun/src/fatal-shutdown.test.ts +10 -10
- package/platforms/electrobun/src/fatal-shutdown.ts +1 -1
- package/platforms/electrobun/src/first-party-remotes.test.ts +169 -0
- package/platforms/electrobun/src/first-party-remotes.ts +297 -0
- package/platforms/electrobun/src/first-run-rpc.test.ts +192 -0
- package/platforms/electrobun/src/first-run-rpc.ts +146 -0
- package/platforms/electrobun/src/floating-chat-window.ts +181 -181
- package/platforms/electrobun/src/inbox-rpc.test.ts +123 -0
- package/platforms/electrobun/src/inbox-rpc.ts +158 -0
- package/platforms/electrobun/src/index.ts +2555 -2096
- package/platforms/electrobun/src/kiosk-mode.ts +50 -0
- package/platforms/electrobun/src/launch/index.ts +4 -0
- package/platforms/electrobun/src/launch/launch-dynamic-view.ts +37 -0
- package/platforms/electrobun/src/launch/launch-orchestrator.test.ts +224 -0
- package/platforms/electrobun/src/launch/launch-orchestrator.ts +456 -0
- package/platforms/electrobun/src/launch/launch-store.test.ts +97 -0
- package/platforms/electrobun/src/launch/launch-store.ts +134 -0
- package/platforms/electrobun/src/launch/types.ts +103 -0
- package/platforms/electrobun/src/launch/views/launch-diagnostics.html +205 -0
- package/platforms/electrobun/src/lifecycle/agent-ready-publish.test.ts +50 -0
- package/platforms/electrobun/src/lifecycle/agent-ready-publish.ts +27 -0
- package/platforms/electrobun/src/lifecycle/api-base-owner.ts +42 -31
- package/platforms/electrobun/src/lifecycle/desktop-session-prime.ts +44 -44
- package/platforms/electrobun/src/logger.ts +14 -14
- package/platforms/electrobun/src/main-window-runtime.ts +83 -83
- package/platforms/electrobun/src/main-window-session.test.ts +109 -0
- package/platforms/electrobun/src/main-window-session.ts +87 -51
- package/platforms/electrobun/src/menu-reset-from-main.ts +158 -158
- package/platforms/electrobun/src/native/agent-env.test.ts +52 -0
- package/platforms/electrobun/src/native/agent-runtime-layout.test.ts +42 -0
- package/platforms/electrobun/src/native/agent-state-dir.test.ts +91 -0
- package/platforms/electrobun/src/native/agent.ts +2122 -1682
- package/platforms/electrobun/src/native/auth-bridge.test.ts +67 -0
- package/platforms/electrobun/src/native/auth-bridge.ts +464 -360
- package/platforms/electrobun/src/native/browser-workspace.ts +723 -471
- package/platforms/electrobun/src/native/camera.ts +50 -50
- package/platforms/electrobun/src/native/canvas.ts +444 -445
- package/platforms/electrobun/src/native/credentials.ts +673 -616
- package/platforms/electrobun/src/native/desktop-window.test.ts +300 -0
- package/platforms/electrobun/src/native/desktop.ts +2196 -2156
- package/platforms/electrobun/src/native/editor-bridge.ts +201 -201
- package/platforms/electrobun/src/native/file-watcher.ts +154 -154
- package/platforms/electrobun/src/native/gateway.ts +179 -180
- package/platforms/electrobun/src/native/gpu-window.ts +256 -256
- package/platforms/electrobun/src/native/index.ts +76 -74
- package/platforms/electrobun/src/native/location.test.ts +44 -0
- package/platforms/electrobun/src/native/location.ts +90 -80
- package/platforms/electrobun/src/native/loopback-port.ts +60 -60
- package/platforms/electrobun/src/native/mac-window-effects.ts +166 -104
- package/platforms/electrobun/src/native/music-player.ts +38 -38
- package/platforms/electrobun/src/native/permissions-shared.ts +249 -150
- package/platforms/electrobun/src/native/permissions.ts +301 -208
- package/platforms/electrobun/src/native/power-state.ts +129 -129
- package/platforms/electrobun/src/native/remote-plugin-host.test.ts +1394 -0
- package/platforms/electrobun/src/native/remote-plugin-host.ts +1531 -0
- package/platforms/electrobun/src/native/screencapture.ts +667 -573
- package/platforms/electrobun/src/native/steward.ts +207 -204
- package/platforms/electrobun/src/native/swabble.ts +68 -324
- package/platforms/electrobun/src/native/talkmode.ts +253 -422
- package/platforms/electrobun/src/native/webgpu-browser-support.test.ts +18 -0
- package/platforms/electrobun/src/native/webgpu-browser-support.ts +165 -147
- package/platforms/electrobun/src/native/whisper-env.test.ts +71 -0
- package/platforms/electrobun/src/native/whisper-env.ts +68 -0
- package/platforms/electrobun/src/native-onboarding.ts +270 -0
- package/platforms/electrobun/src/onboarding-overlay-window.ts +141 -0
- package/platforms/electrobun/src/persisted-deployment.ts +91 -0
- package/platforms/electrobun/src/pill-window.test.ts +91 -0
- package/platforms/electrobun/src/pill-window.ts +99 -0
- package/platforms/electrobun/src/preload-validation.ts +44 -44
- package/platforms/electrobun/src/preload.js +1 -1
- package/platforms/electrobun/src/print-electrobun-dev-settings-banner.ts +120 -120
- package/platforms/electrobun/src/renderer-api-proxy.test.ts +73 -0
- package/platforms/electrobun/src/renderer-api-proxy.ts +86 -0
- package/platforms/electrobun/src/renderer-static.test.ts +53 -0
- package/platforms/electrobun/src/renderer-static.ts +144 -57
- package/platforms/electrobun/src/rpc-handler-slices.ts +121 -0
- package/platforms/electrobun/src/rpc-handlers.test.ts +267 -0
- package/platforms/electrobun/src/rpc-handlers.ts +1306 -913
- package/platforms/electrobun/src/rpc-parse-utils.ts +57 -0
- package/platforms/electrobun/src/rpc-port-resolver.test.ts +45 -0
- package/platforms/electrobun/src/rpc-port-resolver.ts +31 -0
- package/platforms/electrobun/src/rpc-schema.ts +2556 -1619
- package/platforms/electrobun/src/runtime-layout.ts +105 -105
- package/platforms/electrobun/src/runtime-permissions.ts +95 -95
- package/platforms/electrobun/src/runtime-rpc.test.ts +126 -0
- package/platforms/electrobun/src/runtime-rpc.ts +237 -0
- package/platforms/electrobun/src/screenshot-dev-server.ts +87 -87
- package/platforms/electrobun/src/settings-mutations-rpc.test.ts +193 -0
- package/platforms/electrobun/src/settings-mutations-rpc.ts +220 -0
- package/platforms/electrobun/src/startup-trace.ts +274 -270
- package/platforms/electrobun/src/subscription-rpc.test.ts +89 -0
- package/platforms/electrobun/src/subscription-rpc.ts +192 -0
- package/platforms/electrobun/src/surface-windows.test.ts +355 -0
- package/platforms/electrobun/src/surface-windows.ts +410 -410
- package/platforms/electrobun/src/trace/README.md +73 -0
- package/platforms/electrobun/src/trace/errors.ts +21 -0
- package/platforms/electrobun/src/trace/index.ts +40 -0
- package/platforms/electrobun/src/trace/trace-dynamic-view.ts +40 -0
- package/platforms/electrobun/src/trace/trace-host-requests.ts +473 -0
- package/platforms/electrobun/src/trace/trace-service.test.ts +186 -0
- package/platforms/electrobun/src/trace/trace-service.ts +324 -0
- package/platforms/electrobun/src/trace/trace-store.test.ts +141 -0
- package/platforms/electrobun/src/trace/trace-store.ts +551 -0
- package/platforms/electrobun/src/trace/types.ts +250 -0
- package/platforms/electrobun/src/trace/views/agent-run-trace.html +311 -0
- package/platforms/electrobun/src/types/web-speech.d.ts +28 -28
- package/platforms/electrobun/src/types.ts +5 -5
- package/platforms/electrobun/src/update-availability.test.ts +72 -0
- package/platforms/electrobun/src/update-availability.ts +90 -0
- package/platforms/electrobun/src/update-rpc.test.ts +83 -0
- package/platforms/electrobun/src/update-rpc.ts +123 -0
- package/platforms/electrobun/src/voice/README.md +184 -0
- package/platforms/electrobun/src/voice/errors.ts +42 -0
- package/platforms/electrobun/src/voice/index.ts +78 -0
- package/platforms/electrobun/src/voice/types.ts +316 -0
- package/platforms/electrobun/src/voice/voice-host-requests.ts +259 -0
- package/platforms/electrobun/src/voice/voice-latency-budget.test.ts +66 -0
- package/platforms/electrobun/src/voice/voice-latency-budget.ts +243 -0
- package/platforms/electrobun/src/voice/voice-live-validation.test.ts +352 -0
- package/platforms/electrobun/src/voice/voice-live-validation.ts +838 -0
- package/platforms/electrobun/src/voice/voice-pipeline.ts +250 -0
- package/platforms/electrobun/src/voice/voice-playback-adapter.ts +31 -0
- package/platforms/electrobun/src/voice/voice-runtime-adapter.test.ts +213 -0
- package/platforms/electrobun/src/voice/voice-runtime-adapter.ts +686 -0
- package/platforms/electrobun/src/voice/voice-service.test.ts +561 -0
- package/platforms/electrobun/src/voice/voice-service.ts +1027 -0
- package/platforms/electrobun/src/voice/voice-stream-coordinator.test.ts +115 -0
- package/platforms/electrobun/src/voice/voice-stream-coordinator.ts +270 -0
- package/platforms/electrobun/src/voice/voice-trace.ts +97 -0
- package/platforms/electrobun/src/voice/voice-tts-chunker.test.ts +91 -0
- package/platforms/electrobun/src/voice/voice-tts-chunker.ts +194 -0
- package/platforms/electrobun/src/windows-cef-profile.ts +88 -88
- package/platforms/electrobun/tsconfig.json +73 -13
- package/platforms/electrobun/update-channels.json +22 -0
- package/platforms/electrobun/vitest.electrobun.config.ts +72 -42
- package/platforms/ios/App/App/App.entitlements +4 -0
- package/platforms/ios/App/App/AppDelegate.swift +80 -18
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ios-marketing-1024.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@1x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@1x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@1x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@1x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-83_5x83_5@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@3x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@3x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@3x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@2x.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@3x.png +0 -0
- package/platforms/ios/App/App/Base.lproj/LaunchScreen.storyboard +1 -4
- package/platforms/ios/App/App/ComputerUseBridge.swift +589 -0
- package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.entitlements +12 -0
- package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.swift +34 -0
- package/platforms/ios/App/App/DeviceActivityMonitorExtension/Info.plist +29 -0
- package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.entitlements +12 -0
- package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.swift +53 -0
- package/platforms/ios/App/App/DeviceActivityReportExtension/Info.plist +27 -0
- package/platforms/ios/App/App/ElizaAppIntents.swift +183 -0
- package/platforms/ios/App/App/ElizaIntentPlugin.swift +342 -5
- package/platforms/ios/App/App/Info.plist +17 -1
- package/platforms/ios/App/App/runners/eliza-tasks.js +177 -0
- package/platforms/ios/App/App.xcodeproj/project.pbxproj +262 -6
- package/platforms/ios/App/BroadcastExtension/SampleHandler.swift +100 -0
- package/platforms/ios/App/Podfile +5 -0
- package/platforms/ios/App/Podfile.lock +83 -59
- package/register-runtime-hooks.js +11 -5
- package/registry/app-registry.d.ts +14 -0
- package/registry/app-registry.d.ts.map +1 -0
- package/registry/app-registry.js +29 -0
- package/registry/entries/apps/app-polymarket.json +31 -0
- package/registry/entries/apps/clawville.json +27 -0
- package/registry/entries/apps/companion.json +28 -0
- package/registry/entries/apps/database-viewer.json +27 -0
- package/registry/entries/apps/defense-of-the-agents.json +27 -0
- package/registry/entries/apps/documents.json +30 -0
- package/registry/entries/apps/feed.json +27 -0
- package/registry/entries/apps/hyperliquid.json +31 -0
- package/registry/entries/apps/log-viewer.json +27 -0
- package/registry/entries/apps/memory-viewer.json +27 -0
- package/registry/entries/apps/model-tester.json +31 -0
- package/registry/entries/apps/plugin-viewer.json +27 -0
- package/registry/entries/apps/relationship-viewer.json +27 -0
- package/registry/entries/apps/runtime-debugger.json +27 -0
- package/registry/entries/apps/shopify.json +31 -0
- package/registry/entries/apps/skills-viewer.json +27 -0
- package/registry/entries/apps/steward.json +31 -0
- package/registry/entries/apps/training.json +54 -0
- package/registry/entries/apps/trajectory-viewer.json +27 -0
- package/registry/entries/apps/vincent.json +31 -0
- package/registry/entries/connectors/bluebubbles.json +99 -0
- package/registry/entries/connectors/bluesky.json +173 -0
- package/registry/entries/connectors/discord.json +119 -0
- package/registry/entries/connectors/farcaster.json +174 -0
- package/registry/entries/connectors/feishu.json +79 -0
- package/registry/entries/connectors/google-chat.json +120 -0
- package/registry/entries/connectors/google.json +82 -0
- package/registry/entries/connectors/imessage.json +96 -0
- package/registry/entries/connectors/instagram.json +64 -0
- package/registry/entries/connectors/line.json +86 -0
- package/registry/entries/connectors/matrix.json +94 -0
- package/registry/entries/connectors/mattermost.json +110 -0
- package/registry/entries/connectors/msteams.json +104 -0
- package/registry/entries/connectors/nextcloud-talk.json +104 -0
- package/registry/entries/connectors/nostr.json +70 -0
- package/registry/entries/connectors/signal.json +81 -0
- package/registry/entries/connectors/slack.json +102 -0
- package/registry/entries/connectors/telegram.json +71 -0
- package/registry/entries/connectors/tlon.json +94 -0
- package/registry/entries/connectors/twitch.json +110 -0
- package/registry/entries/connectors/whatsapp.json +113 -0
- package/registry/entries/connectors/x.json +231 -0
- package/registry/entries/connectors/zalo.json +112 -0
- package/registry/entries/connectors/zalouser.json +122 -0
- package/registry/entries/plugins/agent-orchestrator.json +33 -0
- package/registry/entries/plugins/agent-skills.json +72 -0
- package/registry/entries/plugins/anthropic.json +73 -0
- package/registry/entries/plugins/app-control.json +23 -0
- package/registry/entries/plugins/auto-trader.json +203 -0
- package/registry/entries/plugins/background-runner.json +26 -0
- package/registry/entries/plugins/blooio.json +102 -0
- package/registry/entries/plugins/browser.json +75 -0
- package/registry/entries/plugins/cli.json +40 -0
- package/registry/entries/plugins/clipboard.json +44 -0
- package/registry/entries/plugins/coding-tools.json +71 -0
- package/registry/entries/plugins/commands.json +63 -0
- package/registry/entries/plugins/computeruse.json +74 -0
- package/registry/entries/plugins/copilot-proxy.json +93 -0
- package/registry/entries/plugins/directives.json +63 -0
- package/registry/entries/plugins/edge-tts.json +97 -0
- package/registry/entries/plugins/elevenlabs.json +169 -0
- package/registry/entries/plugins/elizacloud.json +208 -0
- package/registry/entries/plugins/evm.json +134 -0
- package/registry/entries/plugins/experience.json +34 -0
- package/registry/entries/plugins/facewear.json +131 -0
- package/registry/entries/plugins/form.json +26 -0
- package/registry/entries/plugins/github.json +93 -0
- package/registry/entries/plugins/gmail-watch.json +25 -0
- package/registry/entries/plugins/goals.json +77 -0
- package/registry/entries/plugins/google-genai.json +106 -0
- package/registry/entries/plugins/groq.json +93 -0
- package/registry/entries/plugins/hedera.json +48 -0
- package/registry/entries/plugins/inmemorydb.json +25 -0
- package/registry/entries/plugins/linear.json +51 -0
- package/registry/entries/plugins/local-inference.json +137 -0
- package/registry/entries/plugins/local-storage.json +36 -0
- package/registry/entries/plugins/localdb.json +25 -0
- package/registry/entries/plugins/mcp.json +44 -0
- package/registry/entries/plugins/memory.json +124 -0
- package/registry/entries/plugins/minecraft.json +79 -0
- package/registry/entries/plugins/moltbook.json +83 -0
- package/registry/entries/plugins/music.json +155 -0
- package/registry/entries/plugins/mysticism.json +48 -0
- package/registry/entries/plugins/nearai.json +82 -0
- package/registry/entries/plugins/ngrok.json +69 -0
- package/registry/entries/plugins/ollama.json +96 -0
- package/registry/entries/plugins/openai.json +189 -0
- package/registry/entries/plugins/openrouter.json +188 -0
- package/registry/entries/plugins/pdf.json +26 -0
- package/registry/entries/plugins/plugin-manager.json +23 -0
- package/registry/entries/plugins/prose.json +48 -0
- package/registry/entries/plugins/rlm.json +26 -0
- package/registry/entries/plugins/roblox.json +88 -0
- package/registry/entries/plugins/rss.json +64 -0
- package/registry/entries/plugins/s3-storage.json +91 -0
- package/registry/entries/plugins/scheduling.json +35 -0
- package/registry/entries/plugins/shell.json +94 -0
- package/registry/entries/plugins/social-alpha.json +72 -0
- package/registry/entries/plugins/tailscale.json +81 -0
- package/registry/entries/plugins/tee.json +53 -0
- package/registry/entries/plugins/todos.json +26 -0
- package/registry/entries/plugins/trajectory-logger.json +33 -0
- package/registry/entries/plugins/trust.json +39 -0
- package/registry/entries/plugins/tts.json +71 -0
- package/registry/entries/plugins/tunnel.json +45 -0
- package/registry/entries/plugins/twilio.json +168 -0
- package/registry/entries/plugins/vercel-ai-gateway.json +128 -0
- package/registry/entries/plugins/video.json +23 -0
- package/registry/entries/plugins/vision.json +43 -0
- package/registry/entries/plugins/webhooks.json +23 -0
- package/registry/entries/plugins/workflow.json +25 -0
- package/registry/entries/plugins/xai.json +75 -0
- package/registry/index.d.ts +2 -1
- package/registry/index.d.ts.map +1 -1
- package/registry/index.js +46 -12
- package/registry/loader.d.ts +2 -1
- package/registry/loader.d.ts.map +1 -1
- package/registry/loader.js +49 -2
- package/registry/schema.d.ts +244 -34
- package/registry/schema.d.ts.map +1 -1
- package/registry/schema.js +36 -0
- package/runtime/android-avf-microdroid-bridge.d.ts +29 -0
- package/runtime/android-avf-microdroid-bridge.d.ts.map +1 -0
- package/runtime/android-avf-microdroid-bridge.js +149 -0
- package/runtime/api-dev-settings-banner.d.ts.map +1 -1
- package/runtime/api-dev-settings-banner.js +5 -13
- package/runtime/app-core-runtime-hooks.d.ts +21 -0
- package/runtime/app-core-runtime-hooks.d.ts.map +1 -0
- package/runtime/app-core-runtime-hooks.js +10 -0
- package/runtime/autonomy-policy.d.ts +2 -0
- package/runtime/autonomy-policy.d.ts.map +1 -0
- package/runtime/autonomy-policy.js +4 -0
- package/runtime/desktop/AppWindowRenderer.d.ts +17 -0
- package/runtime/desktop/AppWindowRenderer.d.ts.map +1 -0
- package/runtime/desktop/AppWindowRenderer.js +360 -0
- package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts +2 -0
- package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts.map +1 -0
- package/runtime/desktop/DesktopSurfaceNavigationRuntime.js +41 -0
- package/runtime/desktop/DesktopTrayRuntime.d.ts +2 -0
- package/runtime/desktop/DesktopTrayRuntime.d.ts.map +1 -0
- package/runtime/desktop/DesktopTrayRuntime.js +174 -0
- package/runtime/desktop/DetachedShellRoot.d.ts +10 -0
- package/runtime/desktop/DetachedShellRoot.d.ts.map +1 -0
- package/runtime/desktop/DetachedShellRoot.js +111 -0
- package/runtime/desktop/index.d.ts +6 -0
- package/runtime/desktop/index.d.ts.map +1 -0
- package/runtime/desktop/index.js +5 -0
- package/runtime/desktop/tray-menu.d.ts +20 -0
- package/runtime/desktop/tray-menu.d.ts.map +1 -0
- package/runtime/desktop/tray-menu.js +143 -0
- package/runtime/dev-server.d.ts +1 -1
- package/runtime/dev-server.d.ts.map +1 -1
- package/runtime/dev-server.js +93 -17
- package/runtime/eliza.d.ts +75 -1
- package/runtime/eliza.d.ts.map +1 -1
- package/runtime/eliza.js +596 -122
- package/runtime/ensure-text-to-speech-handler.d.ts.map +1 -1
- package/runtime/ensure-text-to-speech-handler.js +10 -3
- package/runtime/mobile-safe-runtime.d.ts +181 -2
- package/runtime/mobile-safe-runtime.d.ts.map +1 -1
- package/runtime/mobile-safe-runtime.js +1019 -12
- package/runtime/mode/remote-forwarder.d.ts.map +1 -1
- package/runtime/mode/remote-forwarder.js +2 -2
- package/runtime/mode/route-mode-guard.d.ts +1 -2
- package/runtime/mode/route-mode-guard.d.ts.map +1 -1
- package/runtime/mode/route-mode-guard.js +4 -5
- package/runtime/mode/route-mode-matrix.d.ts.map +1 -1
- package/runtime/mode/route-mode-matrix.js +14 -1
- package/runtime/mode/runtime-mode.d.ts +1 -1
- package/runtime/mode/runtime-mode.d.ts.map +1 -1
- package/runtime/mode/runtime-mode.js +15 -4
- package/runtime/runtime-bootstrap-policy.d.ts.map +1 -1
- package/runtime/runtime-bootstrap-policy.js +14 -2
- package/runtime/telegram-standalone-handler.d.ts.map +1 -1
- package/runtime/telegram-standalone-handler.js +10 -9
- package/runtime/tts-cache-wiring.d.ts +29 -0
- package/runtime/tts-cache-wiring.d.ts.map +1 -0
- package/runtime/tts-cache-wiring.js +114 -0
- package/runtime/voice-warmup.d.ts +81 -0
- package/runtime/voice-warmup.d.ts.map +1 -0
- package/runtime/voice-warmup.js +111 -0
- package/scripts/android-sms-gateway-template.test.mjs +1014 -0
- package/scripts/aosp/README.md +19 -15
- package/scripts/aosp/compile-libllama.mjs +1344 -248
- package/scripts/aosp/compile-shim.mjs +47 -18
- package/scripts/aosp/deploy-pixel.mjs +405 -0
- package/scripts/aosp/lib/load-variant-config.mjs +3 -3
- package/scripts/aosp/llama-cpp-patches/README.md +8 -8
- package/scripts/aosp/llama-cpp-patches/apply-patches.mjs +23 -6
- package/scripts/aosp/llama-cpp-patches/polarquant/README.md +37 -0
- package/scripts/aosp/llama-cpp-patches/qjl/README.md +37 -0
- package/scripts/aosp/seccomp-shim/sigsys-handler-arm64.c +169 -0
- package/scripts/aosp/seccomp-shim/sigsys-handler-riscv64.c +217 -0
- package/scripts/aosp/smoke-cuttlefish.mjs +34 -4
- package/scripts/aosp/stage-default-models.mjs +49 -18
- package/scripts/aosp/variant-config-schema.ts +2 -2
- package/scripts/assert-required-bundled-packages.test.ts +534 -0
- package/scripts/audit-apple-store-sandbox.mjs +146 -0
- package/scripts/audit-live-test-surface.mjs +5 -2
- package/scripts/build-capacitor-app.mjs +21 -0
- package/scripts/build-flatpak.mjs +5 -5
- package/scripts/build-helpers/arm64-simd.mjs +72 -0
- package/scripts/build-helpers/omnivoice-merged.mjs +87 -0
- package/scripts/build-helpers/verify-fused-symbols.mjs +567 -0
- package/scripts/build-image.sh +4 -2
- package/scripts/build-llama-cpp-mtp.mjs +487 -0
- package/scripts/build-native-plugins.mjs +230 -18
- package/scripts/build-patched-electrobun-cli.mjs +68 -10
- package/scripts/build-win.mjs +1 -1
- package/scripts/bun-riscv64/Dockerfile +418 -0
- package/scripts/bun-riscv64/README.md +316 -0
- package/scripts/bun-riscv64/build.sh +469 -0
- package/scripts/bun-riscv64/bun-patches/0001-config-add-riscv64-arch.patch +74 -0
- package/scripts/bun-riscv64/bun-patches/0002-flags-add-riscv64-march-mabi.patch +16 -0
- package/scripts/bun-riscv64/bun-patches/0003-zig-add-riscv64-target-triple-and-cpu.patch +26 -0
- package/scripts/bun-riscv64/bun-patches/0004-webkit-force-local-mode-on-riscv64.patch +33 -0
- package/scripts/bun-riscv64/bun-patches/0005-tinycc-disable-on-riscv64.patch +16 -0
- package/scripts/bun-riscv64/bun-patches/0006-build-add-riscv64-cli-validation.patch +15 -0
- package/scripts/bun-riscv64/bun-patches/0007-deps-per-dep-riscv64-checks.patch +24 -0
- package/scripts/bun-riscv64/bun-patches/0008-source-stabilize-riscv64-musl-build.patch +226 -0
- package/scripts/bun-riscv64/bun-patches/0009-disable-wasm-streaming-hooks-for-c-loop.patch +162 -0
- package/scripts/bun-riscv64/bun-patches/0010-disable-inspector-profiler-for-riscv64-c-loop.patch +80 -0
- package/scripts/bun-riscv64/bun-patches/0011-process-arch-add-riscv64.patch +23 -0
- package/scripts/bun-riscv64/bun-patches/0012-cpu-features-add-riscv64-fallback.patch +13 -0
- package/scripts/bun-riscv64/bun-patches/0013-disable-console-inspector-hooks-for-riscv64-c-loop.patch +43 -0
- package/scripts/bun-riscv64/bun-patches/0014-disable-custom-inspector-dispatchers-on-riscv64.patch +127 -0
- package/scripts/bun-riscv64/bun-patches/0015-disable-jsc-profiler-builtins-on-riscv64.patch +75 -0
- package/scripts/bun-riscv64/bun-patches/0016-node-vm-disable-jit-cached-data-on-riscv64-c-loop.patch +96 -0
- package/scripts/bun-riscv64/bun-patches/0017-disable-performance-domjit-signature-on-riscv64-c-loop.patch +34 -0
- package/scripts/bun-riscv64/bun-patches/0018-fix-serialized-script-identifier-big-endian-path.patch +19 -0
- package/scripts/bun-riscv64/bun-patches/0019-add-wtf-timer-fire-bridge-for-c-loop.patch +24 -0
- package/scripts/bun-riscv64/bun-patches/0020-run-riscv64-smoke-test-under-qemu.patch +13 -0
- package/scripts/bun-riscv64/bun-patches/0021-fix-riscv64-linux-open-flags.patch +25 -0
- package/scripts/bun-riscv64/bun-patches/0022-zlib-riscv64-generic-kernels.patch +25 -0
- package/scripts/bun-riscv64/bun-patches/README.md +127 -0
- package/scripts/bun-riscv64/bun-version.json +202 -0
- package/scripts/bun-riscv64/run-build.sh +162 -0
- package/scripts/bun-riscv64/rust-core/0001-riscv64-rust-core-port.patch +868 -0
- package/scripts/bun-riscv64/rust-core/0002-second-wave-riscv64-source-gaps.patch +130 -0
- package/scripts/bun-riscv64/rust-core/0003-third-wave-riscv64-crash-handler-gaps.patch +78 -0
- package/scripts/bun-riscv64/rust-core/0004-rust-target-cpu-riscv64.patch +39 -0
- package/scripts/bun-riscv64/rust-core/0005-fifth-wave-riscv64-source-gaps.patch +96 -0
- package/scripts/bun-riscv64/rust-core/0006-cpp-wasm-and-inspector-guards-riscv64.patch +91 -0
- package/scripts/bun-riscv64/rust-core/0007-bun-alloc-max-align-t-riscv64.patch +36 -0
- package/scripts/bun-riscv64/rust-core/0008-workspace-lints-warn-not-deny-riscv64.patch +75 -0
- package/scripts/bun-riscv64/rust-core/0009-zigglobalobject-wasm-streaming-guards-riscv64.patch +109 -0
- package/scripts/bun-riscv64/rust-core/0010-tcc-externs-stub-on-riscv64.patch +62 -0
- package/scripts/bun-riscv64/rust-core/0011-clippy-ptr-cast-lints-warn-riscv64.patch +61 -0
- package/scripts/bun-riscv64/rust-core/README.md +80 -0
- package/scripts/bun-riscv64/rust-core/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
- package/scripts/bun-riscv64/rust-core/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
- package/scripts/bun-riscv64/rust-core/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
- package/scripts/bun-riscv64/rust-core/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
- package/scripts/bun-riscv64/rust-core/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +31 -0
- package/scripts/bun-riscv64/validate.sh +264 -0
- package/scripts/bun-riscv64/webkit-patches/0001-cherry-pick-llint-riscv64.recipe +155 -0
- package/scripts/bun-riscv64/webkit-patches/0002-cherry-pick-baseline-jit-riscv64.recipe +40 -0
- package/scripts/bun-riscv64/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
- package/scripts/bun-riscv64/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
- package/scripts/bun-riscv64/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
- package/scripts/bun-riscv64/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
- package/scripts/bun-riscv64/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +72 -0
- package/scripts/bun-riscv64/webkit-patches/README.md +146 -0
- package/scripts/check-homepage-public-readiness.mjs +353 -0
- package/scripts/check-homepage-release-data.mjs +110 -0
- package/scripts/check-i18n.mjs +2 -1
- package/scripts/check-real-local-chat.ts +147 -0
- package/scripts/check-real-local-provisioning.ts +104 -0
- package/scripts/check-real-local-reset.ts +249 -0
- package/scripts/check-sms-gateway-completion-audit.mjs +428 -0
- package/scripts/check-sms-gateway-readiness.mjs +266 -0
- package/scripts/clean-repo.mjs +5 -5
- package/scripts/codesign-mas.mjs +222 -16
- package/scripts/collect-docker-runtime-deps.mjs +229 -0
- package/scripts/continue-sms-gateway-work.mjs +121 -0
- package/scripts/copy-runtime-node-modules.ts +903 -195
- package/scripts/deploy-cloud-api-production-gateway.mjs +52 -0
- package/scripts/desktop-build.mjs +655 -101
- package/scripts/dev-platform.mjs +346 -102
- package/scripts/dev-startup-smoke.mjs +248 -0
- package/scripts/dev-ui.mjs +418 -176
- package/scripts/disable-local-eliza-workspace.mjs +35 -0
- package/scripts/docker-ci-smoke.sh +440 -96
- package/scripts/docker-entrypoint.sh +62 -1
- package/scripts/docker-entrypoint.test.ts +283 -0
- package/scripts/ensure-avatars.mjs +2 -2
- package/scripts/ensure-electrobun-core.mjs +1 -1
- package/scripts/ensure-generated-core-proto-js.mjs +1 -1
- package/scripts/ensure-type-package-aliases.mjs +62 -5
- package/scripts/ensure-vision-deps.mjs +20 -1
- package/scripts/entry.ts +1 -1
- package/scripts/ffi-stub/Makefile +64 -0
- package/scripts/ffi-stub/README.md +391 -0
- package/scripts/ffi-stub/asr-ffi-smoke.ts +139 -0
- package/scripts/ffi-stub/ffi-stub.c +539 -0
- package/scripts/ffi-stub/ffi.h +538 -0
- package/scripts/ffi-stub/libelizainference_stub.so +0 -0
- package/scripts/ffi-stub/tts-stream-ffi-smoke.ts +349 -0
- package/scripts/generate-first-run-voicelines.mjs +194 -0
- package/scripts/generate-plugin-index.js +4 -3
- package/scripts/generate-static-asset-manifest.mjs +1 -1
- package/scripts/i18n-dynamic-keys.json +5 -5
- package/scripts/init-submodules.mjs +2 -2
- package/scripts/install-android-sms-gateway.md +177 -0
- package/scripts/install-android-sms-gateway.mjs +1088 -0
- package/scripts/ios-xcframework/README.md +74 -72
- package/scripts/ios-xcframework/build-xcframework.mjs +204 -43
- package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1943 -0
- package/scripts/ios-xcframework/runtime-symbol-shim.c +450 -0
- package/scripts/kernel-patches/cpu-polar-kernels.mjs +441 -0
- package/scripts/kernel-patches/cpu-simd-kernels.mjs +253 -0
- package/scripts/kernel-patches/cpu-thread-parallelism.mjs +368 -0
- package/scripts/kernel-patches/cuda-kernels.mjs +117 -0
- package/scripts/kernel-patches/metal-kernels.mjs +1698 -109
- package/scripts/kernel-patches/server-omnivoice-route.mjs +718 -0
- package/scripts/kernel-patches/server-structured-output.mjs +279 -0
- package/scripts/kernel-patches/vulkan-dispatch-log.mjs +166 -0
- package/scripts/kernel-patches/vulkan-dispatch-log.test.mjs +50 -0
- package/scripts/kernel-patches/vulkan-dispatch-patches/01-vulkan-shaders-gen.patch +30 -16
- package/scripts/kernel-patches/vulkan-dispatch-patches/02-ggml-vulkan-pipelines.patch +75 -30
- package/scripts/kernel-patches/vulkan-kernels.mjs +800 -49
- package/scripts/lib/agent-source-watcher.mjs +174 -0
- package/scripts/lib/agent-source-watcher.test.mjs +184 -0
- package/scripts/lib/api-supervisor.mjs +78 -9
- package/scripts/lib/api-supervisor.test.mjs +121 -0
- package/scripts/lib/app-dir.mjs +2 -16
- package/scripts/lib/apple-entitlement-audit.mjs +655 -0
- package/scripts/lib/apple-entitlement-audit.test.mjs +144 -0
- package/scripts/lib/bun-version-guard.mjs +13 -13
- package/scripts/lib/capacitor-plugin-build-needed.mjs +4 -3
- package/scripts/lib/capacitor-plugin-names.mjs +30 -14
- package/scripts/lib/desktop-preflight.mjs +9 -5
- package/scripts/lib/desktop-startup-embedding-warmup-policy.mjs +51 -0
- package/scripts/lib/desktop-startup-embedding-warmup-policy.test.mjs +55 -0
- package/scripts/lib/duet-bridge.d.mts +63 -0
- package/scripts/lib/duet-bridge.mjs +193 -0
- package/scripts/lib/node-path-env.mjs +4 -2
- package/scripts/lib/orchestrator-desktop-dev-banner.mjs +12 -3
- package/scripts/lib/patch-bun-exports.mjs +90 -27
- package/scripts/lib/patch-bun-exports.test.mjs +79 -0
- package/scripts/lib/renderer-build-action.mjs +35 -0
- package/scripts/lib/renderer-build-action.test.mjs +70 -0
- package/scripts/lib/stage-android-agent.mjs +748 -99
- package/scripts/lib/sync-eliza-env-aliases.mjs +3 -25
- package/scripts/lib/ui-smoke-stub-decision.mjs +33 -0
- package/scripts/lib/ui-smoke-stub-decision.test.mjs +46 -0
- package/scripts/lib/vite-renderer-dist-stale.mjs +5 -0
- package/scripts/lib/voice-latency-report.mjs +154 -0
- package/scripts/lifeops-prompt-benchmark.ts +21 -12
- package/scripts/link-docker-local-app-packages.mjs +103 -36
- package/scripts/local-stt-bench.ts +192 -0
- package/scripts/maintain-cloud-api-production-gateway.mjs +54 -0
- package/scripts/mas-smoke.mjs +459 -0
- package/scripts/mas-smoke.test.mjs +220 -0
- package/scripts/mobile-auth-simulator-smoke.mjs +0 -1
- package/scripts/normalize-eliza-capture.ts +97 -0
- package/scripts/omnivoice-fuse/prepare.mjs +2543 -23
- package/scripts/pack-upstreams.mjs +65 -5
- package/scripts/package-electrobun-linux.mjs +303 -0
- package/scripts/patch-deps.mjs +5 -3
- package/scripts/patches/llama-asr-word-timestamps.patch +218 -0
- package/scripts/patches/llama-mobile-kokoro-tts.patch +480 -0
- package/scripts/playwright-ui-live-stack.ts +194 -49
- package/scripts/playwright-ui-smoke-api-stub.mjs +3501 -109
- package/scripts/pre-review-local.mjs +2 -2
- package/scripts/prepare-ios-cocoapods.sh +41 -3
- package/scripts/release-check.ts +180 -84
- package/scripts/release-workflow-drift.test.ts +57 -0
- package/scripts/relink-workspace-packages-to-dist.mjs +21 -4
- package/scripts/rt.mjs +16 -1
- package/scripts/run-biome-check.mjs +1 -1
- package/scripts/run-coding-agent-e2e.mjs +3 -3
- package/scripts/run-eliza-app-core-script.mjs +34 -0
- package/scripts/run-local-plugin-live-smoke.mjs +71 -2
- package/scripts/run-mobile-build-android-app-actions.test.mjs +426 -0
- package/scripts/run-mobile-build.mjs +4757 -607
- package/scripts/run-node-runtime.mjs +184 -7
- package/scripts/run-node-runtime.test.mjs +167 -0
- package/scripts/run-node-tsx.mjs +80 -33
- package/scripts/run-node.mjs +41 -1
- package/scripts/run-production-build.mjs +34 -27
- package/scripts/run-release-check.mjs +19 -0
- package/scripts/run-release-contract-suite.mjs +107 -14
- package/scripts/run-ui-smoke-playwright-suite.mjs +0 -2
- package/scripts/runtime-package-manifest.ts +21 -3
- package/scripts/setup-upstreams.mjs +42 -1
- package/scripts/sms-gateway-status.mjs +194 -0
- package/scripts/stage-android-agent.test.mjs +97 -0
- package/scripts/stage-desktop-fused-lib.mjs +424 -0
- package/scripts/stage-elizavoice-lib.mjs +363 -0
- package/scripts/startup-integration-script-drift.test.ts +82 -4
- package/scripts/streaming-pipeline-bench.ts +543 -0
- package/scripts/sync-homepage-porkbun-dns.mjs +262 -0
- package/scripts/test-sms-gateway-software.mjs +100 -0
- package/scripts/type-audit.mjs +1 -1
- package/scripts/validate-bluebubbles-outbound.mjs +293 -0
- package/scripts/validate-cdn-assets.mjs +15 -7
- package/scripts/validate-regression-matrix.mjs +109 -8
- package/scripts/verify-android-sms-gateway-e2e.mjs +362 -0
- package/scripts/verify-bluebubbles-gateway-e2e.mjs +191 -0
- package/scripts/verify-bluebubbles-inbound-readiness.mjs +88 -0
- package/scripts/verify-cloud-api-production-deploy.mjs +87 -0
- package/scripts/verify-cloud-sms-onboarding-flow.mjs +336 -0
- package/scripts/voice/freeze-voice.mjs +521 -0
- package/scripts/voice-attribution-smoke.ts +538 -0
- package/scripts/voice-create-profile.mjs +379 -0
- package/scripts/voice-duet.mjs +1355 -0
- package/scripts/voice-e2e-hardware.ts +871 -0
- package/scripts/voice-interactive.mjs +1750 -0
- package/scripts/voice-latency-report.mjs +96 -0
- package/scripts/voice-latency-report.test.ts +176 -0
- package/scripts/voice-preset/build-default-voice-preset.mjs +249 -0
- package/scripts/voice-preset/build-onboarding-voice.mjs +281 -0
- package/scripts/watch-sms-gateway-readiness.mjs +303 -0
- package/scripts/write-homepage-release-data.mjs +458 -26
- package/security/agent-vault-id.d.ts +1 -1
- package/security/agent-vault-id.js +1 -1
- package/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -1
- package/security/hydrate-wallet-keys-from-platform-store.js +23 -14
- package/security/platform-secure-store-node.d.ts +2 -2
- package/security/platform-secure-store-node.js +3 -3
- package/security/wallet-os-store-actions.d.ts +0 -9
- package/security/wallet-os-store-actions.d.ts.map +1 -1
- package/security/wallet-os-store-actions.js +3 -10
- package/services/account-pool.d.ts +23 -14
- package/services/account-pool.d.ts.map +1 -1
- package/services/account-pool.js +86 -24
- package/services/account-usage.d.ts.map +1 -1
- package/services/account-usage.js +2 -5
- package/services/ambient-audio/consent.d.ts +9 -0
- package/services/ambient-audio/consent.d.ts.map +1 -0
- package/services/ambient-audio/consent.js +28 -0
- package/services/ambient-audio/index.d.ts +7 -0
- package/services/ambient-audio/index.d.ts.map +1 -0
- package/services/ambient-audio/index.js +4 -0
- package/services/ambient-audio/replay-buffer.d.ts +14 -0
- package/services/ambient-audio/replay-buffer.d.ts.map +1 -0
- package/services/ambient-audio/replay-buffer.js +66 -0
- package/services/ambient-audio/response-gate.d.ts +3 -0
- package/services/ambient-audio/response-gate.d.ts.map +1 -0
- package/services/ambient-audio/response-gate.js +33 -0
- package/services/ambient-audio/service.d.ts +22 -0
- package/services/ambient-audio/service.d.ts.map +1 -0
- package/services/ambient-audio/service.js +47 -0
- package/services/ambient-audio/types.d.ts +42 -0
- package/services/ambient-audio/types.d.ts.map +1 -0
- package/services/app-updates/update-policy.d.ts +64 -0
- package/services/app-updates/update-policy.d.ts.map +1 -0
- package/services/app-updates/update-policy.js +228 -0
- package/services/auth-store.d.ts +37 -1
- package/services/auth-store.d.ts.map +1 -1
- package/services/auth-store.js +59 -26
- package/services/cloud-jwks-store.d.ts +3 -3
- package/services/cloud-jwks-store.d.ts.map +1 -1
- package/services/cloud-jwks-store.js +5 -8
- package/services/coding-account-bridge.d.ts +71 -0
- package/services/coding-account-bridge.d.ts.map +1 -0
- package/services/coding-account-bridge.js +267 -0
- package/services/connector-target-catalog.d.ts +10 -3
- package/services/connector-target-catalog.d.ts.map +1 -1
- package/services/connector-target-catalog.js +7 -4
- package/services/credential-tunnel-service.d.ts +66 -0
- package/services/credential-tunnel-service.d.ts.map +1 -0
- package/services/credential-tunnel-service.js +227 -0
- package/services/github-credentials.d.ts +1 -1
- package/services/github-credentials.js +1 -1
- package/services/inference-abort.d.ts +47 -0
- package/services/inference-abort.d.ts.map +1 -0
- package/services/inference-abort.js +76 -0
- package/services/persistence.d.ts +2 -3
- package/services/persistence.d.ts.map +1 -1
- package/services/persistence.js +2 -3
- package/services/phrase-chunked-tts.d.ts +136 -0
- package/services/phrase-chunked-tts.d.ts.map +1 -0
- package/services/phrase-chunked-tts.js +208 -0
- package/services/sandbox-registry.d.ts +78 -0
- package/services/sandbox-registry.d.ts.map +1 -0
- package/services/sandbox-registry.js +323 -0
- package/services/secrets-manager-installer.d.ts +8 -1
- package/services/secrets-manager-installer.d.ts.map +1 -1
- package/services/secrets-manager-installer.js +27 -2
- package/services/sensitive-requests/cloud-link-adapter.d.ts +15 -0
- package/services/sensitive-requests/cloud-link-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/cloud-link-adapter.js +73 -0
- package/services/sensitive-requests/index.d.ts +27 -0
- package/services/sensitive-requests/index.d.ts.map +1 -0
- package/services/sensitive-requests/index.js +51 -0
- package/services/sensitive-requests/instruct-dm-only-adapter.d.ts +14 -0
- package/services/sensitive-requests/instruct-dm-only-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/instruct-dm-only-adapter.js +22 -0
- package/services/sensitive-requests/owner-app-inline-adapter.d.ts +3 -0
- package/services/sensitive-requests/owner-app-inline-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/owner-app-inline-adapter.js +146 -0
- package/services/sensitive-requests/owner-app-oauth-adapter.d.ts +3 -0
- package/services/sensitive-requests/owner-app-oauth-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/owner-app-oauth-adapter.js +156 -0
- package/services/sensitive-requests/public-link-adapter.d.ts +14 -0
- package/services/sensitive-requests/public-link-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/public-link-adapter.js +86 -0
- package/services/sensitive-requests/tunnel-link-adapter.d.ts +17 -0
- package/services/sensitive-requests/tunnel-link-adapter.d.ts.map +1 -0
- package/services/sensitive-requests/tunnel-link-adapter.js +38 -0
- package/services/steward-credentials.d.ts +1 -1
- package/services/steward-credentials.d.ts.map +1 -1
- package/services/steward-credentials.js +10 -6
- package/services/steward-sidecar/health-check.d.ts.map +1 -1
- package/services/steward-sidecar/health-check.js +4 -3
- package/services/steward-sidecar/process-management.d.ts +1 -1
- package/services/steward-sidecar/process-management.d.ts.map +1 -1
- package/services/steward-sidecar/process-management.js +9 -3
- package/services/steward-sidecar/types.d.ts +1 -1
- package/services/steward-sidecar/types.d.ts.map +1 -1
- package/services/steward-sidecar/wallet-setup.d.ts.map +1 -1
- package/services/steward-sidecar/wallet-setup.js +8 -7
- package/services/steward-sidecar.d.ts +2 -2
- package/services/steward-sidecar.d.ts.map +1 -1
- package/services/steward-sidecar.js +27 -19
- package/services/task-host-capabilities.d.ts +60 -0
- package/services/task-host-capabilities.d.ts.map +1 -0
- package/services/task-host-capabilities.js +122 -0
- package/services/tool-call-cache/index.d.ts +2 -2
- package/services/tool-call-cache/index.d.ts.map +1 -1
- package/services/tool-call-cache/index.js +1 -1
- package/services/trigger-event-bridge.js +1 -1
- package/services/tunnel-to-mobile/index.d.ts +2 -0
- package/services/tunnel-to-mobile/index.d.ts.map +1 -0
- package/services/tunnel-to-mobile/index.js +1 -0
- package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts +105 -0
- package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts.map +1 -0
- package/services/tunnel-to-mobile/tunnel-to-mobile-client.js +190 -0
- package/services/vault-bootstrap.d.ts.map +1 -1
- package/services/vault-bootstrap.js +48 -21
- package/services/vault-mirror.d.ts +1 -1
- package/services/vault-mirror.d.ts.map +1 -1
- package/services/vault-mirror.js +29 -6
- package/services/voice-profiles/diarization-pipeline.d.ts +6 -0
- package/services/voice-profiles/diarization-pipeline.d.ts.map +1 -0
- package/services/voice-profiles/diarization-pipeline.js +20 -0
- package/services/voice-profiles/index.d.ts +12 -0
- package/services/voice-profiles/index.d.ts.map +1 -0
- package/services/voice-profiles/index.js +5 -0
- package/services/voice-profiles/nickname-evaluator.d.ts +14 -0
- package/services/voice-profiles/nickname-evaluator.d.ts.map +1 -0
- package/services/voice-profiles/nickname-evaluator.js +46 -0
- package/services/voice-profiles/owner-confidence.d.ts +10 -0
- package/services/voice-profiles/owner-confidence.d.ts.map +1 -0
- package/services/voice-profiles/owner-confidence.js +38 -0
- package/services/voice-profiles/private-challenge.d.ts +20 -0
- package/services/voice-profiles/private-challenge.d.ts.map +1 -0
- package/services/voice-profiles/private-challenge.js +44 -0
- package/services/voice-profiles/store.d.ts +21 -0
- package/services/voice-profiles/store.d.ts.map +1 -0
- package/services/voice-profiles/store.js +50 -0
- package/services/voice-profiles/types.d.ts +38 -0
- package/services/voice-profiles/types.d.ts.map +1 -0
- package/services/voice-profiles/types.js +1 -0
- package/styles/electrobun-mac-window-drag.css +4 -4
- package/test/helpers/__tests__/live-agent-test.smoke.test.ts +43 -70
- package/test/helpers/browser-mocks.ts +2 -2
- package/test/helpers/conditional-tests.ts +2 -2
- package/test/helpers/i18n.ts +1 -1
- package/test/helpers/live-agent-test.ts +537 -551
- package/test/helpers/live-provider.test.ts +4 -4
- package/test/helpers/live-provider.ts +41 -7
- package/test/helpers/live-runtime-server.ts +4 -4
- package/test/helpers/pglite-runtime.ts +1 -1
- package/test/helpers/real-runtime.ts +72 -20
- package/test/helpers/trajectory-harness.ts +11 -7
- package/test/scripts/start-eliza-live.ts +9 -0
- package/test/scripts/test-parallel.mjs +1 -1
- package/test/scripts/test-root-unit.mjs +6 -7
- package/ui-compat.d.ts +13 -2
- package/ui-compat.d.ts.map +1 -1
- package/ui-compat.js +19 -3
- package/api/auth-pairing-compat-routes.d.ts +0 -17
- package/api/auth-pairing-compat-routes.d.ts.map +0 -1
- package/api/auth-pairing-compat-routes.js +0 -301
- package/api/local-inference-compat-routes.d.ts +0 -16
- package/api/local-inference-compat-routes.d.ts.map +0 -1
- package/api/local-inference-compat-routes.js +0 -617
- package/api/onboarding-compat-routes.d.ts +0 -4
- package/api/onboarding-compat-routes.d.ts.map +0 -1
- package/api/onboarding-compat-routes.js +0 -207
- package/api/plugins-compat-routes.d.ts +0 -103
- package/api/plugins-compat-routes.d.ts.map +0 -1
- package/api/plugins-compat-routes.js +0 -1181
- package/api/server-onboarding-compat.d.ts +0 -31
- package/api/server-onboarding-compat.d.ts.map +0 -1
- package/api/server-onboarding-compat.js +0 -283
- package/benchmark/cua-routes.d.ts +0 -10
- package/benchmark/cua-routes.d.ts.map +0 -1
- package/benchmark/cua-routes.js +0 -179
- package/benchmark/mock-plugin-base.d.ts +0 -9
- package/benchmark/mock-plugin-base.d.ts.map +0 -1
- package/benchmark/mock-plugin-base.js +0 -325
- package/cli/parse-duration.d.ts +0 -5
- package/cli/parse-duration.d.ts.map +0 -1
- package/cli/parse-duration.js +0 -27
- package/patches/llama-cpp-capacitor@0.1.5.patch +0 -2387
- package/platform/agent-browser-stub.d.ts +0 -27
- package/platform/agent-browser-stub.d.ts.map +0 -1
- package/platform/agent-browser-stub.js +0 -16
- package/platforms/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +0 -26
- package/platforms/android/app/src/main/res/drawable/ic_launcher_background.xml +0 -170
- package/platforms/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -34
- package/platforms/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +0 -18
- package/platforms/electrobun/assets/appIcon.iconset/icon_512x512@2x.png +0 -0
- package/platforms/electrobun/assets/appIcon.png +0 -0
- package/platforms/electrobun/scripts/build-whisper-universal.sh +0 -137
- package/platforms/electrobun/scripts/build-whisper.sh +0 -95
- package/platforms/electrobun/src/libMacWindowEffects.dylib +0 -0
- package/platforms/electrobun/src/native/whisper.ts +0 -280
- package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
- package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
- package/registry/generate-apps.d.ts +0 -2
- package/registry/generate-apps.d.ts.map +0 -1
- package/registry/generate-apps.js +0 -338
- package/registry/generate.d.ts +0 -2
- package/registry/generate.d.ts.map +0 -1
- package/registry/generate.js +0 -506
- package/runtime/embedding-manager-support.d.ts +0 -77
- package/runtime/embedding-manager-support.d.ts.map +0 -1
- package/runtime/embedding-manager-support.js +0 -309
- package/runtime/embedding-presets.d.ts +0 -5
- package/runtime/embedding-presets.d.ts.map +0 -1
- package/runtime/embedding-presets.js +0 -47
- package/runtime/embedding-warmup-policy.d.ts +0 -13
- package/runtime/embedding-warmup-policy.d.ts.map +0 -1
- package/runtime/embedding-warmup-policy.js +0 -33
- package/runtime/ensure-local-inference-handler.d.ts +0 -25
- package/runtime/ensure-local-inference-handler.d.ts.map +0 -1
- package/runtime/ensure-local-inference-handler.js +0 -389
- package/runtime/mobile-local-inference-gate.d.ts +0 -21
- package/runtime/mobile-local-inference-gate.d.ts.map +0 -1
- package/runtime/mobile-local-inference-gate.js +0 -24
- package/scripts/aosp/avd-test.mjs +0 -403
- package/scripts/aosp/boot-validate.mjs +0 -536
- package/scripts/aosp/build-aosp.mjs +0 -448
- package/scripts/aosp/build-bootanimation.mjs +0 -178
- package/scripts/aosp/capture-screens.mjs +0 -325
- package/scripts/aosp/e2e-validate.mjs +0 -225
- package/scripts/aosp/lint-init-rc.mjs +0 -258
- package/scripts/aosp/llama-shim/eliza_llama_shim.c +0 -276
- package/scripts/aosp/sim.mjs +0 -277
- package/scripts/aosp/sync-to-aosp.mjs +0 -134
- package/scripts/aosp/validate.mjs +0 -1273
- package/scripts/build-llama-cpp-dflash.mjs +0 -1866
- package/scripts/generate-onboarding-voicelines.mjs +0 -194
- package/scripts/generated/static-asset-manifest.json +0 -4
- package/scripts/normalize-parallax-capture.ts +0 -97
- package/scripts/omnivoice-fuse/Makefile +0 -44
- package/scripts/omnivoice-fuse/README.md +0 -266
- package/scripts/omnivoice-fuse/cmake-graft.mjs +0 -180
- package/scripts/omnivoice-fuse/ffi-stub.c +0 -222
- package/scripts/omnivoice-fuse/ffi.h +0 -158
- package/scripts/omnivoice-fuse/libelizainference_stub.dylib +0 -0
- package/scripts/omnivoice-fuse/verify-symbols.mjs +0 -138
- package/security/cloud-secret-store.d.ts +0 -34
- package/security/cloud-secret-store.d.ts.map +0 -1
- package/security/cloud-secret-store.js +0 -65
- package/security/export-guard.d.ts +0 -34
- package/security/export-guard.d.ts.map +0 -1
- package/security/export-guard.js +0 -127
- package/services/local-inference/__stress__/cache-stress-helpers.d.ts +0 -76
- package/services/local-inference/__stress__/cache-stress-helpers.d.ts.map +0 -1
- package/services/local-inference/__stress__/cache-stress-helpers.js +0 -238
- package/services/local-inference/active-model.d.ts +0 -180
- package/services/local-inference/active-model.d.ts.map +0 -1
- package/services/local-inference/active-model.js +0 -362
- package/services/local-inference/assignments.d.ts +0 -58
- package/services/local-inference/assignments.d.ts.map +0 -1
- package/services/local-inference/assignments.js +0 -179
- package/services/local-inference/backend.d.ts +0 -200
- package/services/local-inference/backend.d.ts.map +0 -1
- package/services/local-inference/backend.js +0 -242
- package/services/local-inference/bundled-models.d.ts +0 -34
- package/services/local-inference/bundled-models.d.ts.map +0 -1
- package/services/local-inference/bundled-models.js +0 -104
- package/services/local-inference/cache-bridge.d.ts +0 -184
- package/services/local-inference/cache-bridge.d.ts.map +0 -1
- package/services/local-inference/cache-bridge.js +0 -333
- package/services/local-inference/catalog.d.ts +0 -57
- package/services/local-inference/catalog.d.ts.map +0 -1
- package/services/local-inference/catalog.js +0 -262
- package/services/local-inference/conversation-registry.d.ts +0 -122
- package/services/local-inference/conversation-registry.d.ts.map +0 -1
- package/services/local-inference/conversation-registry.js +0 -182
- package/services/local-inference/device-bridge.d.ts +0 -139
- package/services/local-inference/device-bridge.d.ts.map +0 -1
- package/services/local-inference/device-bridge.js +0 -774
- package/services/local-inference/dflash-doctor.d.ts +0 -27
- package/services/local-inference/dflash-doctor.d.ts.map +0 -1
- package/services/local-inference/dflash-doctor.js +0 -149
- package/services/local-inference/dflash-server.d.ts +0 -248
- package/services/local-inference/dflash-server.d.ts.map +0 -1
- package/services/local-inference/dflash-server.js +0 -1076
- package/services/local-inference/downloader.d.ts +0 -48
- package/services/local-inference/downloader.d.ts.map +0 -1
- package/services/local-inference/downloader.js +0 -688
- package/services/local-inference/engine.d.ts +0 -282
- package/services/local-inference/engine.d.ts.map +0 -1
- package/services/local-inference/engine.js +0 -743
- package/services/local-inference/external-scanner.d.ts +0 -17
- package/services/local-inference/external-scanner.d.ts.map +0 -1
- package/services/local-inference/external-scanner.js +0 -261
- package/services/local-inference/handler-registry.d.ts +0 -72
- package/services/local-inference/handler-registry.d.ts.map +0 -1
- package/services/local-inference/handler-registry.js +0 -159
- package/services/local-inference/hardware.d.ts +0 -26
- package/services/local-inference/hardware.d.ts.map +0 -1
- package/services/local-inference/hardware.js +0 -139
- package/services/local-inference/hf-search.d.ts +0 -19
- package/services/local-inference/hf-search.d.ts.map +0 -1
- package/services/local-inference/hf-search.js +0 -169
- package/services/local-inference/index.d.ts +0 -10
- package/services/local-inference/index.d.ts.map +0 -1
- package/services/local-inference/index.js +0 -7
- package/services/local-inference/llama-server-metrics.d.ts +0 -108
- package/services/local-inference/llama-server-metrics.d.ts.map +0 -1
- package/services/local-inference/llama-server-metrics.js +0 -175
- package/services/local-inference/manifest/index.d.ts +0 -4
- package/services/local-inference/manifest/index.d.ts.map +0 -1
- package/services/local-inference/manifest/index.js +0 -5
- package/services/local-inference/manifest/schema.d.ts +0 -419
- package/services/local-inference/manifest/schema.d.ts.map +0 -1
- package/services/local-inference/manifest/schema.js +0 -227
- package/services/local-inference/manifest/types.d.ts +0 -23
- package/services/local-inference/manifest/types.d.ts.map +0 -1
- package/services/local-inference/manifest/types.js +0 -5
- package/services/local-inference/manifest/validator.d.ts +0 -43
- package/services/local-inference/manifest/validator.d.ts.map +0 -1
- package/services/local-inference/manifest/validator.js +0 -180
- package/services/local-inference/paths.d.ts +0 -8
- package/services/local-inference/paths.d.ts.map +0 -1
- package/services/local-inference/paths.js +0 -7
- package/services/local-inference/providers.d.ts +0 -61
- package/services/local-inference/providers.d.ts.map +0 -1
- package/services/local-inference/providers.js +0 -334
- package/services/local-inference/ram-budget.d.ts +0 -57
- package/services/local-inference/ram-budget.d.ts.map +0 -1
- package/services/local-inference/ram-budget.js +0 -107
- package/services/local-inference/readiness.d.ts +0 -9
- package/services/local-inference/readiness.d.ts.map +0 -1
- package/services/local-inference/readiness.js +0 -153
- package/services/local-inference/recommendation.d.ts +0 -62
- package/services/local-inference/recommendation.d.ts.map +0 -1
- package/services/local-inference/recommendation.js +0 -309
- package/services/local-inference/registry.d.ts +0 -35
- package/services/local-inference/registry.d.ts.map +0 -1
- package/services/local-inference/registry.js +0 -117
- package/services/local-inference/router-handler.d.ts +0 -51
- package/services/local-inference/router-handler.d.ts.map +0 -1
- package/services/local-inference/router-handler.js +0 -165
- package/services/local-inference/routing-policy.d.ts +0 -55
- package/services/local-inference/routing-policy.d.ts.map +0 -1
- package/services/local-inference/routing-policy.js +0 -195
- package/services/local-inference/routing-preferences.d.ts +0 -8
- package/services/local-inference/routing-preferences.d.ts.map +0 -1
- package/services/local-inference/routing-preferences.js +0 -7
- package/services/local-inference/service.d.ts +0 -88
- package/services/local-inference/service.d.ts.map +0 -1
- package/services/local-inference/service.js +0 -210
- package/services/local-inference/session-pool.d.ts +0 -72
- package/services/local-inference/session-pool.d.ts.map +0 -1
- package/services/local-inference/session-pool.js +0 -125
- package/services/local-inference/types.d.ts +0 -309
- package/services/local-inference/types.d.ts.map +0 -1
- package/services/local-inference/types.js +0 -23
- package/services/local-inference/verify.d.ts +0 -8
- package/services/local-inference/verify.d.ts.map +0 -1
- package/services/local-inference/verify.js +0 -7
- package/services/local-inference/voice/barge-in.d.ts +0 -15
- package/services/local-inference/voice/barge-in.d.ts.map +0 -1
- package/services/local-inference/voice/barge-in.js +0 -20
- package/services/local-inference/voice/engine-bridge.d.ts +0 -256
- package/services/local-inference/voice/engine-bridge.d.ts.map +0 -1
- package/services/local-inference/voice/engine-bridge.js +0 -398
- package/services/local-inference/voice/ffi-bindings.d.ts +0 -114
- package/services/local-inference/voice/ffi-bindings.d.ts.map +0 -1
- package/services/local-inference/voice/ffi-bindings.js +0 -281
- package/services/local-inference/voice/index.d.ts +0 -51
- package/services/local-inference/voice/index.d.ts.map +0 -1
- package/services/local-inference/voice/index.js +0 -50
- package/services/local-inference/voice/lifecycle.d.ts +0 -135
- package/services/local-inference/voice/lifecycle.d.ts.map +0 -1
- package/services/local-inference/voice/lifecycle.js +0 -189
- package/services/local-inference/voice/phoneme-tokenizer.d.ts +0 -58
- package/services/local-inference/voice/phoneme-tokenizer.d.ts.map +0 -1
- package/services/local-inference/voice/phoneme-tokenizer.js +0 -53
- package/services/local-inference/voice/phrase-cache.d.ts +0 -24
- package/services/local-inference/voice/phrase-cache.d.ts.map +0 -1
- package/services/local-inference/voice/phrase-cache.js +0 -32
- package/services/local-inference/voice/phrase-chunker.d.ts +0 -20
- package/services/local-inference/voice/phrase-chunker.d.ts.map +0 -1
- package/services/local-inference/voice/phrase-chunker.js +0 -85
- package/services/local-inference/voice/ring-buffer.d.ts +0 -40
- package/services/local-inference/voice/ring-buffer.d.ts.map +0 -1
- package/services/local-inference/voice/ring-buffer.js +0 -85
- package/services/local-inference/voice/rollback-queue.d.ts +0 -24
- package/services/local-inference/voice/rollback-queue.d.ts.map +0 -1
- package/services/local-inference/voice/rollback-queue.js +0 -49
- package/services/local-inference/voice/scheduler.d.ts +0 -47
- package/services/local-inference/voice/scheduler.d.ts.map +0 -1
- package/services/local-inference/voice/scheduler.js +0 -123
- package/services/local-inference/voice/shared-resources.d.ts +0 -119
- package/services/local-inference/voice/shared-resources.d.ts.map +0 -1
- package/services/local-inference/voice/shared-resources.js +0 -83
- package/services/local-inference/voice/speaker-preset-cache.d.ts +0 -28
- package/services/local-inference/voice/speaker-preset-cache.d.ts.map +0 -1
- package/services/local-inference/voice/speaker-preset-cache.js +0 -44
- package/services/local-inference/voice/types.d.ts +0 -80
- package/services/local-inference/voice/types.d.ts.map +0 -1
- package/services/local-inference/voice/voice-preset-format.d.ts +0 -56
- package/services/local-inference/voice/voice-preset-format.d.ts.map +0 -1
- package/services/local-inference/voice/voice-preset-format.js +0 -184
- package/services/plugin-installer.d.ts +0 -22
- package/services/plugin-installer.d.ts.map +0 -1
- package/services/plugin-installer.js +0 -41
- package/test/scripts/task-agent-live-smoke.ts +0 -1335
- /package/services/{local-inference/voice → ambient-audio}/types.js +0 -0
|
@@ -0,0 +1,1485 @@
|
|
|
1
|
+
// elizavoice-jni.cpp
|
|
2
|
+
//
|
|
3
|
+
// JNI bridge for the fused, NDK/bionic-built `libelizainference.so` (the
|
|
4
|
+
// omnivoice `elizainference` target — all four voice runtimes fused at ABI
|
|
5
|
+
// v7) running INSIDE the normal Android APK process (ai.elizaos.app,
|
|
6
|
+
// Capacitor/bionic), NOT the separate musl bun agent.
|
|
7
|
+
//
|
|
8
|
+
// Phase 3a proved the load + a single VAD op. Phase 3b wires the WHOLE
|
|
9
|
+
// mic→attributed-turn pipeline through this host:
|
|
10
|
+
//
|
|
11
|
+
// - Context lifecycle: contextCreate / contextDestroy.
|
|
12
|
+
// - The four fused classifier ops, each wrapping the matching
|
|
13
|
+
// `eliza_inference_*` symbols:
|
|
14
|
+
// VAD open / processBatch / reset / close
|
|
15
|
+
// wakeword open / scoreBatch / reset / close
|
|
16
|
+
// speaker open / embed / close
|
|
17
|
+
// diariz open / segment / close
|
|
18
|
+
// - A native streaming PIPELINE (pipelineOpen / pipelineProcess /
|
|
19
|
+
// pipelineFlush / pipelineReset / pipelineClose) that runs the VAD
|
|
20
|
+
// hot-loop + turn segmentation NATIVELY (no per-512-window JS↔native
|
|
21
|
+
// bridge call): JS hands it an audio-frame batch, it streams the PCM
|
|
22
|
+
// through VAD, applies the onset/offset/pause/end-hangover state machine
|
|
23
|
+
// (ported from VadDetector in vad.ts), buffers the turn PCM, and on
|
|
24
|
+
// speech-end runs speaker-embed + diariz natively and returns a
|
|
25
|
+
// TURN-LEVEL JSON result (speaker 256-float embedding + diariz int8
|
|
26
|
+
// labels) to JS. JS then applies the ambient gate + builds the
|
|
27
|
+
// voiceTurnSignal.
|
|
28
|
+
//
|
|
29
|
+
// PCM marshalling: Java `float[]` (16 kHz mono fp32 in [-1, 1]) in via
|
|
30
|
+
// GetFloatArrayElements (JNI_ABORT release — read-only, no copy-back).
|
|
31
|
+
// Outputs: the 256-float speaker embedding and the per-frame diariz int8
|
|
32
|
+
// labels are returned as Java arrays; turn metadata is returned as a JSON
|
|
33
|
+
// string the JS side parses.
|
|
34
|
+
//
|
|
35
|
+
// All sessions are reference-counted by an opaque jlong handle (the native
|
|
36
|
+
// pointer). Idempotent close. Errors surface as a thrown RuntimeException
|
|
37
|
+
// (so the Capacitor plugin rejects the call) — no swallow, no defaulted
|
|
38
|
+
// result (AGENTS.md §3, §9).
|
|
39
|
+
|
|
40
|
+
#include <jni.h>
|
|
41
|
+
#include <android/log.h>
|
|
42
|
+
#include <algorithm>
|
|
43
|
+
#include <cmath>
|
|
44
|
+
#include <cstdint>
|
|
45
|
+
#include <cstdlib>
|
|
46
|
+
#include <cstring>
|
|
47
|
+
#include <memory>
|
|
48
|
+
#include <string>
|
|
49
|
+
#include <vector>
|
|
50
|
+
|
|
51
|
+
#include "eliza-inference-ffi.h"
|
|
52
|
+
|
|
53
|
+
#define LOG_TAG "ElizaVoiceJni"
|
|
54
|
+
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
|
|
55
|
+
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
|
56
|
+
|
|
57
|
+
namespace {
|
|
58
|
+
|
|
59
|
+
// Sample-rate / window constants (must mirror the JS contract).
|
|
60
|
+
constexpr int kSampleRate = 16000;
|
|
61
|
+
constexpr size_t kVadWindow = 512; // Silero v5 window @ 16 kHz
|
|
62
|
+
constexpr size_t kWakeFrame = 1280; // openWakeWord 80 ms frame @ 16 kHz
|
|
63
|
+
constexpr size_t kSpeakerEmbeddingDim = 256;
|
|
64
|
+
constexpr size_t kDiarizWindow = 80000; // pyannote 5 s window @ 16 kHz
|
|
65
|
+
constexpr size_t kDiarizLabelCap = 2048;
|
|
66
|
+
|
|
67
|
+
jstring to_jstring(JNIEnv* env, const std::string& s) {
|
|
68
|
+
return env->NewStringUTF(s.c_str());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
std::string from_jstring(JNIEnv* env, jstring js) {
|
|
72
|
+
if (js == nullptr) return std::string();
|
|
73
|
+
const char* chars = env->GetStringUTFChars(js, nullptr);
|
|
74
|
+
std::string out(chars ? chars : "");
|
|
75
|
+
if (chars) env->ReleaseStringUTFChars(js, chars);
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Throw a java.lang.RuntimeException; the Capacitor plugin maps that to a
|
|
80
|
+
// rejected call. Frees the heap-allocated C diagnostic when present.
|
|
81
|
+
void throw_runtime(JNIEnv* env, const std::string& stage, char* outError) {
|
|
82
|
+
std::string msg = "[elizavoice-jni] " + stage;
|
|
83
|
+
if (outError) {
|
|
84
|
+
msg += ": ";
|
|
85
|
+
msg += outError;
|
|
86
|
+
std::free(outError);
|
|
87
|
+
}
|
|
88
|
+
LOGE("%s", msg.c_str());
|
|
89
|
+
jclass cls = env->FindClass("java/lang/RuntimeException");
|
|
90
|
+
if (cls) env->ThrowNew(cls, msg.c_str());
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Copy a Java float[] into a std::vector<float> (read-only view, no copy-back).
|
|
94
|
+
std::vector<float> read_float_array(JNIEnv* env, jfloatArray arr) {
|
|
95
|
+
if (arr == nullptr) return {};
|
|
96
|
+
const jsize n = env->GetArrayLength(arr);
|
|
97
|
+
std::vector<float> out(static_cast<size_t>(n));
|
|
98
|
+
if (n > 0) {
|
|
99
|
+
env->GetFloatArrayRegion(arr, 0, n, out.data());
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
float rms_of(const float* pcm, size_t n) {
|
|
105
|
+
if (n == 0) return 0.0f;
|
|
106
|
+
double acc = 0.0;
|
|
107
|
+
for (size_t i = 0; i < n; ++i) acc += static_cast<double>(pcm[i]) * pcm[i];
|
|
108
|
+
return static_cast<float>(std::sqrt(acc / static_cast<double>(n)));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// --- Native turn-segmentation state machine (ports VadDetector core) ------
|
|
112
|
+
//
|
|
113
|
+
// Phases mirror vad.ts: idle → speaking → paused → (end) → idle. Thresholds
|
|
114
|
+
// are the LiveDiarizationSession defaults (onset 0.5, pause hangover 120 ms,
|
|
115
|
+
// end hangover 500 ms, min speech 250 ms). The adaptive-hangover (V4) and
|
|
116
|
+
// fast-endpoint (V1) refinements are intentionally NOT ported — this native
|
|
117
|
+
// loop only needs robust turn boundaries; the JS layer no longer runs the
|
|
118
|
+
// per-window detector when the native pipeline owns segmentation.
|
|
119
|
+
struct VadSegmenter {
|
|
120
|
+
float onsetThreshold = 0.5f;
|
|
121
|
+
float offsetThreshold = 0.35f; // onset - 0.15
|
|
122
|
+
double pauseHangoverMs = 120.0;
|
|
123
|
+
double endHangoverMs = 500.0;
|
|
124
|
+
double minSpeechMs = 250.0;
|
|
125
|
+
double windowDurationMs = 1000.0 * kVadWindow / kSampleRate; // 32 ms
|
|
126
|
+
|
|
127
|
+
enum Phase { Idle, Speaking, Paused } phase = Idle;
|
|
128
|
+
double clockMs = 0.0;
|
|
129
|
+
double speechStartMs = 0.0;
|
|
130
|
+
double lastSpeechMs = 0.0;
|
|
131
|
+
double pauseStartedMs = 0.0;
|
|
132
|
+
|
|
133
|
+
// Result flags set by step(): the caller acts on speechStarted /
|
|
134
|
+
// speechEnded between feeding windows.
|
|
135
|
+
bool speechStarted = false;
|
|
136
|
+
bool speechEnded = false;
|
|
137
|
+
double endedSpeechDurationMs = 0.0;
|
|
138
|
+
|
|
139
|
+
void reset() {
|
|
140
|
+
phase = Idle;
|
|
141
|
+
clockMs = 0.0;
|
|
142
|
+
speechStartMs = lastSpeechMs = pauseStartedMs = 0.0;
|
|
143
|
+
speechStarted = speechEnded = false;
|
|
144
|
+
endedSpeechDurationMs = 0.0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Advance one window's worth of clock with the VAD probability. Returns via
|
|
148
|
+
// speechStarted / speechEnded the boundary events for this window.
|
|
149
|
+
void step(float prob) {
|
|
150
|
+
speechStarted = false;
|
|
151
|
+
speechEnded = false;
|
|
152
|
+
clockMs += windowDurationMs;
|
|
153
|
+
const double now = clockMs;
|
|
154
|
+
const bool isSpeechFrame = prob >= onsetThreshold;
|
|
155
|
+
const bool aboveOffset = prob >= offsetThreshold;
|
|
156
|
+
|
|
157
|
+
switch (phase) {
|
|
158
|
+
case Idle:
|
|
159
|
+
if (isSpeechFrame) {
|
|
160
|
+
phase = Speaking;
|
|
161
|
+
speechStartMs = now - windowDurationMs;
|
|
162
|
+
lastSpeechMs = now;
|
|
163
|
+
speechStarted = true;
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case Speaking:
|
|
167
|
+
if (aboveOffset) lastSpeechMs = now;
|
|
168
|
+
if (now - lastSpeechMs >= pauseHangoverMs) {
|
|
169
|
+
phase = Paused;
|
|
170
|
+
pauseStartedMs = lastSpeechMs;
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
case Paused:
|
|
174
|
+
if (isSpeechFrame) {
|
|
175
|
+
phase = Speaking;
|
|
176
|
+
lastSpeechMs = now;
|
|
177
|
+
} else if (now - pauseStartedMs >= endHangoverMs) {
|
|
178
|
+
endedSpeechDurationMs = lastSpeechMs - speechStartMs;
|
|
179
|
+
phase = Idle;
|
|
180
|
+
speechEnded = true;
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Force-close an open turn (on flush). Returns true when a turn was open.
|
|
187
|
+
bool forceEnd() {
|
|
188
|
+
speechStarted = false;
|
|
189
|
+
speechEnded = false;
|
|
190
|
+
if (phase == Idle) return false;
|
|
191
|
+
endedSpeechDurationMs = lastSpeechMs - speechStartMs;
|
|
192
|
+
phase = Idle;
|
|
193
|
+
speechEnded = true;
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// --- Pipeline session -----------------------------------------------------
|
|
199
|
+
//
|
|
200
|
+
// Owns one fused VAD + speaker + diariz session set anchored to a context,
|
|
201
|
+
// plus the native turn-segmentation state machine and the in-flight turn PCM
|
|
202
|
+
// buffer. Runs entirely in the bionic app process.
|
|
203
|
+
struct PipelineSession {
|
|
204
|
+
EliInferenceContext* ctx = nullptr; // borrowed (owned by the context handle)
|
|
205
|
+
EliVad* vad = nullptr;
|
|
206
|
+
EliSpeaker* speaker = nullptr;
|
|
207
|
+
EliDiariz* diariz = nullptr;
|
|
208
|
+
|
|
209
|
+
VadSegmenter seg;
|
|
210
|
+
|
|
211
|
+
// Carry-over PCM not yet aligned to a 512-window boundary.
|
|
212
|
+
std::vector<float> pending;
|
|
213
|
+
// The in-flight turn's PCM (between speech-start and speech-end), with a
|
|
214
|
+
// small pre-roll so the leading word is not clipped.
|
|
215
|
+
std::vector<float> turnPcm;
|
|
216
|
+
std::vector<float> preRoll; // ring of pre-speech-start PCM
|
|
217
|
+
size_t preRollSamples = static_cast<size_t>(0.3 * kSampleRate);
|
|
218
|
+
size_t maxTurnSamples = static_cast<size_t>(30 * kSampleRate);
|
|
219
|
+
bool capturing = false;
|
|
220
|
+
int turnSeq = 0;
|
|
221
|
+
|
|
222
|
+
// Completed turns produced by the last process()/flush() call, encoded as
|
|
223
|
+
// JSON the JS side parses. Drained by the caller.
|
|
224
|
+
std::vector<std::string> turns;
|
|
225
|
+
// Parallel arrays for the heavy payloads (embedding + labels) so JS can
|
|
226
|
+
// read them without re-parsing big JSON.
|
|
227
|
+
std::vector<std::vector<float>> turnEmbeddings;
|
|
228
|
+
std::vector<std::vector<int8_t>> turnLabels;
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// Append `n` samples to a bounded pre-roll ring, dropping oldest beyond cap.
|
|
232
|
+
void push_preroll(PipelineSession* s, const float* pcm, size_t n) {
|
|
233
|
+
if (s->preRollSamples == 0) return;
|
|
234
|
+
s->preRoll.insert(s->preRoll.end(), pcm, pcm + n);
|
|
235
|
+
if (s->preRoll.size() > s->preRollSamples) {
|
|
236
|
+
const size_t drop = s->preRoll.size() - s->preRollSamples;
|
|
237
|
+
s->preRoll.erase(s->preRoll.begin(),
|
|
238
|
+
s->preRoll.begin() + static_cast<long>(drop));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Run speaker-embed + diariz on a finalized turn and stage the JSON + payloads.
|
|
243
|
+
// Returns false (with *outError set) on a native op failure.
|
|
244
|
+
bool finalize_turn(PipelineSession* s, char** outError) {
|
|
245
|
+
if (s->turnPcm.empty()) return true;
|
|
246
|
+
const size_t samples = s->turnPcm.size();
|
|
247
|
+
const int turnId = s->turnSeq++;
|
|
248
|
+
|
|
249
|
+
// Speaker embedding over the whole turn (WeSpeaker min ~ 0.5 s; the JS
|
|
250
|
+
// attribution pipeline re-checks WESPEAKER_MIN_SAMPLES, but the native op
|
|
251
|
+
// needs enough audio — run it and let the value flow; too-short turns just
|
|
252
|
+
// yield a weak embedding the matcher discounts).
|
|
253
|
+
std::vector<float> embedding(kSpeakerEmbeddingDim, 0.0f);
|
|
254
|
+
bool haveEmbedding = false;
|
|
255
|
+
if (s->speaker && samples >= kSampleRate / 2) {
|
|
256
|
+
const int rc = eliza_inference_speaker_embed(
|
|
257
|
+
s->speaker, s->turnPcm.data(), samples, embedding.data(), outError);
|
|
258
|
+
if (rc != ELIZA_OK) return false;
|
|
259
|
+
haveEmbedding = true;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Diarizer over a single 5 s window: pyannote takes exactly 80000 samples.
|
|
263
|
+
// Center-crop or zero-pad the turn to the fixed window (the JS reducer maps
|
|
264
|
+
// frame labels back to ms via the fixed stride, so the window is canonical).
|
|
265
|
+
std::vector<int8_t> labels;
|
|
266
|
+
bool haveLabels = false;
|
|
267
|
+
if (s->diariz) {
|
|
268
|
+
std::vector<float> window(kDiarizWindow, 0.0f);
|
|
269
|
+
const size_t copy = samples < kDiarizWindow ? samples : kDiarizWindow;
|
|
270
|
+
std::memcpy(window.data(), s->turnPcm.data(), copy * sizeof(float));
|
|
271
|
+
std::vector<int8_t> out(kDiarizLabelCap, 0);
|
|
272
|
+
size_t nLabels = out.size();
|
|
273
|
+
const int rc = eliza_inference_diariz_segment(
|
|
274
|
+
s->diariz, window.data(), window.size(), out.data(), &nLabels,
|
|
275
|
+
outError);
|
|
276
|
+
if (rc != ELIZA_OK) return false;
|
|
277
|
+
labels.assign(out.begin(), out.begin() + static_cast<long>(nLabels));
|
|
278
|
+
haveLabels = true;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const double durationMs = 1000.0 * static_cast<double>(samples) / kSampleRate;
|
|
282
|
+
|
|
283
|
+
// Log per-op turn evidence to logcat (the in-process verification channel:
|
|
284
|
+
// these lines are emitted by the ai.elizaos.app pid, proving all four ops —
|
|
285
|
+
// VAD segmentation + speaker embed + diariz — ran in the bionic app
|
|
286
|
+
// process, independent of the JS↔Capacitor result delivery).
|
|
287
|
+
double embNorm = 0.0, embAbsMax = 0.0;
|
|
288
|
+
for (size_t i = 0; i < embedding.size(); ++i) {
|
|
289
|
+
embNorm += static_cast<double>(embedding[i]) * embedding[i];
|
|
290
|
+
const double a = std::fabs(static_cast<double>(embedding[i]));
|
|
291
|
+
if (a > embAbsMax) embAbsMax = a;
|
|
292
|
+
}
|
|
293
|
+
embNorm = std::sqrt(embNorm);
|
|
294
|
+
// Diariz label histogram (how many distinct powerset classes fired).
|
|
295
|
+
int distinctLabels = 0;
|
|
296
|
+
bool seen[8] = {false, false, false, false, false, false, false, false};
|
|
297
|
+
for (int8_t l : labels) {
|
|
298
|
+
if (l >= 0 && l < 8 && !seen[l]) { seen[l] = true; distinctLabels++; }
|
|
299
|
+
}
|
|
300
|
+
LOGI("TURN jni_%d: samples=%zu (%.2fs) | speaker: embDim=%zu norm=%.4f "
|
|
301
|
+
"absMax=%.4f emb[0..3]=[%.4f,%.4f,%.4f,%.4f] | diariz: frames=%zu "
|
|
302
|
+
"distinctClasses=%d",
|
|
303
|
+
turnId, samples, durationMs / 1000.0,
|
|
304
|
+
haveEmbedding ? embedding.size() : 0, embNorm, embAbsMax,
|
|
305
|
+
embedding.size() > 0 ? embedding[0] : 0.0f,
|
|
306
|
+
embedding.size() > 1 ? embedding[1] : 0.0f,
|
|
307
|
+
embedding.size() > 2 ? embedding[2] : 0.0f,
|
|
308
|
+
embedding.size() > 3 ? embedding[3] : 0.0f,
|
|
309
|
+
labels.size(), distinctLabels);
|
|
310
|
+
|
|
311
|
+
std::string json = "{\"turnId\":\"jni_" + std::to_string(turnId) +
|
|
312
|
+
"\",\"samples\":" + std::to_string(samples) +
|
|
313
|
+
",\"durationMs\":" + std::to_string(durationMs) +
|
|
314
|
+
",\"hasEmbedding\":" + (haveEmbedding ? "true" : "false") +
|
|
315
|
+
",\"embNorm\":" + std::to_string(embNorm) +
|
|
316
|
+
",\"diarizFrames\":" + std::to_string(labels.size()) +
|
|
317
|
+
",\"diarizDistinctClasses\":" +
|
|
318
|
+
std::to_string(distinctLabels) + "}";
|
|
319
|
+
s->turns.push_back(std::move(json));
|
|
320
|
+
s->turnEmbeddings.push_back(haveEmbedding ? std::move(embedding)
|
|
321
|
+
: std::vector<float>{});
|
|
322
|
+
s->turnLabels.push_back(haveLabels ? std::move(labels)
|
|
323
|
+
: std::vector<int8_t>{});
|
|
324
|
+
s->turnPcm.clear();
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Drain the pending buffer in 512-window steps, driving the VAD + segmenter.
|
|
329
|
+
bool drain_windows(PipelineSession* s, char** outError) {
|
|
330
|
+
while (s->pending.size() >= kVadWindow) {
|
|
331
|
+
float prob = -1.0f;
|
|
332
|
+
const int rc = eliza_inference_vad_process(
|
|
333
|
+
s->vad, s->pending.data(), kVadWindow, &prob, outError);
|
|
334
|
+
if (rc != ELIZA_OK) return false;
|
|
335
|
+
|
|
336
|
+
// Buffer this window into turn or pre-roll BEFORE the state transition
|
|
337
|
+
// so a speech-start seeds the turn with the pre-roll + this window.
|
|
338
|
+
const float* win = s->pending.data();
|
|
339
|
+
if (s->capturing) {
|
|
340
|
+
s->turnPcm.insert(s->turnPcm.end(), win, win + kVadWindow);
|
|
341
|
+
} else {
|
|
342
|
+
push_preroll(s, win, kVadWindow);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
s->seg.step(prob);
|
|
346
|
+
if (s->seg.speechStarted) {
|
|
347
|
+
s->capturing = true;
|
|
348
|
+
// Seed the turn with the pre-roll (leading word) + this window.
|
|
349
|
+
s->turnPcm = s->preRoll;
|
|
350
|
+
s->turnPcm.insert(s->turnPcm.end(), win, win + kVadWindow);
|
|
351
|
+
s->preRoll.clear();
|
|
352
|
+
}
|
|
353
|
+
if (s->seg.speechEnded) {
|
|
354
|
+
s->capturing = false;
|
|
355
|
+
eliza_inference_vad_reset(s->vad, outError); // best-effort
|
|
356
|
+
if (!finalize_turn(s, outError)) return false;
|
|
357
|
+
}
|
|
358
|
+
// Hard cap on a runaway turn.
|
|
359
|
+
if (s->capturing && s->turnPcm.size() >= s->maxTurnSamples) {
|
|
360
|
+
s->capturing = false;
|
|
361
|
+
s->seg.forceEnd();
|
|
362
|
+
eliza_inference_vad_reset(s->vad, outError);
|
|
363
|
+
if (!finalize_turn(s, outError)) return false;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Advance the pending window.
|
|
367
|
+
s->pending.erase(s->pending.begin(),
|
|
368
|
+
s->pending.begin() + static_cast<long>(kVadWindow));
|
|
369
|
+
}
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Build the JSON returned to JS for a process()/flush() call: the turns
|
|
374
|
+
// completed in this call. Embeddings + labels are exposed via the parallel
|
|
375
|
+
// getters so JS reads them per-index.
|
|
376
|
+
std::string drain_turns_json(PipelineSession* s) {
|
|
377
|
+
std::string out = "[";
|
|
378
|
+
for (size_t i = 0; i < s->turns.size(); ++i) {
|
|
379
|
+
if (i > 0) out += ",";
|
|
380
|
+
out += s->turns[i];
|
|
381
|
+
}
|
|
382
|
+
out += "]";
|
|
383
|
+
return out;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Close a self-test session's classifier handles + its owning context.
|
|
387
|
+
void cleanup_session_for_selftest(PipelineSession* s, EliInferenceContext* ctx) {
|
|
388
|
+
if (s->diariz) eliza_inference_diariz_close(s->diariz);
|
|
389
|
+
if (s->speaker) eliza_inference_speaker_close(s->speaker);
|
|
390
|
+
if (s->vad) eliza_inference_vad_close(s->vad);
|
|
391
|
+
delete s;
|
|
392
|
+
if (ctx) eliza_inference_destroy(ctx);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// True unless the env var is explicitly "0"/"false"/"no"/"off" (case-insensitive).
|
|
396
|
+
// Absent / unrecognized → the `fallback`.
|
|
397
|
+
bool bionic_bool_env_or_default(const char* name, bool fallback) {
|
|
398
|
+
const char* v = std::getenv(name);
|
|
399
|
+
if (!v || v[0] == '\0') return fallback;
|
|
400
|
+
std::string s(v);
|
|
401
|
+
std::transform(s.begin(), s.end(), s.begin(),
|
|
402
|
+
[](unsigned char c) { return std::tolower(c); });
|
|
403
|
+
if (s == "0" || s == "false" || s == "no" || s == "off") return false;
|
|
404
|
+
if (s == "1" || s == "true" || s == "yes" || s == "on") return true;
|
|
405
|
+
return fallback;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Arm the eliza-1 text-model bionic config: the fused QJL K-cache /
|
|
409
|
+
// TBQ3 V-cache KV-quant (so the device actually uses the fused QJL attention
|
|
410
|
+
// route verified on lavapipe) and the same-file MTP draft window.
|
|
411
|
+
//
|
|
412
|
+
// KV-quant: ON by default (ELIZA_BIONIC_KV_QUANT != 0). Sets
|
|
413
|
+
// cache_type_k = "qjl1_256" (256-dim JL sketch matching quants-qjl.c's
|
|
414
|
+
// process-global default Π, seed=42, head_dim=128)
|
|
415
|
+
// cache_type_v = "tbq3_0" (TurboQuant-3 V-cache)
|
|
416
|
+
// matching CatalogModel.runtime.kvCache (catalog.ts). When set to 0 the fields
|
|
417
|
+
// stay NULL → the FFI leaves the llama.cpp f16 default (safe fallback).
|
|
418
|
+
//
|
|
419
|
+
// MTP: OFF by default (no NextN draft on the keystone path). When
|
|
420
|
+
// ELIZA_BIONIC_MTP=1 the same-file MTP draft window is armed
|
|
421
|
+
// (draft_min/draft_max from ELIZA_BIONIC_MTP_DRAFT_MIN/MAX, default 1/2 =
|
|
422
|
+
// the single-NextN-head throughput peak). The 0.8b tier has no NextN head,
|
|
423
|
+
// so the FFI's same-file MTP path falls back to the plain decode loop there —
|
|
424
|
+
// tier gating is the bootstrap's job (ELIZA_1_LOAD_METADATA); this is the
|
|
425
|
+
// native override seam.
|
|
426
|
+
//
|
|
427
|
+
// The two static names below outlive the cfg they're attached to (cfg is a
|
|
428
|
+
// stack struct consumed synchronously by eliza_inference_llm_stream_open).
|
|
429
|
+
void arm_bionic_text_cfg(eliza_llm_stream_config_t& cfg) {
|
|
430
|
+
static const char* kKvTypeK = "qjl1_256";
|
|
431
|
+
static const char* kKvTypeV = "tbq3_0";
|
|
432
|
+
if (bionic_bool_env_or_default("ELIZA_BIONIC_KV_QUANT", true)) {
|
|
433
|
+
cfg.cache_type_k = kKvTypeK;
|
|
434
|
+
cfg.cache_type_v = kKvTypeV;
|
|
435
|
+
LOGI("bionic text cfg: KV-quant ON (k=%s v=%s)", kKvTypeK, kKvTypeV);
|
|
436
|
+
} else {
|
|
437
|
+
LOGI("bionic text cfg: KV-quant OFF (f16 fallback)");
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (bionic_bool_env_or_default("ELIZA_BIONIC_MTP", false)) {
|
|
441
|
+
const char* dmin = std::getenv("ELIZA_BIONIC_MTP_DRAFT_MIN");
|
|
442
|
+
const char* dmax = std::getenv("ELIZA_BIONIC_MTP_DRAFT_MAX");
|
|
443
|
+
int draft_min = dmin && dmin[0] ? std::atoi(dmin) : 1;
|
|
444
|
+
int draft_max = dmax && dmax[0] ? std::atoi(dmax) : 2;
|
|
445
|
+
if (draft_min < 1) draft_min = 1;
|
|
446
|
+
if (draft_max < draft_min) draft_max = draft_min;
|
|
447
|
+
cfg.draft_min = draft_min;
|
|
448
|
+
cfg.draft_max = draft_max;
|
|
449
|
+
LOGI("bionic text cfg: MTP ON (draft_min=%d draft_max=%d, same-file)",
|
|
450
|
+
draft_min, draft_max);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
} // namespace
|
|
455
|
+
|
|
456
|
+
extern "C" {
|
|
457
|
+
|
|
458
|
+
// ── ABI / capability probes (Phase 3a, retained) ─────────────────────────
|
|
459
|
+
|
|
460
|
+
JNIEXPORT jstring JNICALL
|
|
461
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVoiceAbiVersion(JNIEnv* env, jclass) {
|
|
462
|
+
const char* abi = eliza_inference_abi_version();
|
|
463
|
+
LOGI("eliza_inference_abi_version() = %s", abi ? abi : "(null)");
|
|
464
|
+
return to_jstring(env, abi ? std::string(abi) : std::string());
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
JNIEXPORT jint JNICALL
|
|
468
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadSupported(JNIEnv*, jclass) {
|
|
469
|
+
return static_cast<jint>(eliza_inference_vad_supported());
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
JNIEXPORT jint JNICALL
|
|
473
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordSupported(JNIEnv*, jclass) {
|
|
474
|
+
return static_cast<jint>(eliza_inference_wakeword_supported());
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
JNIEXPORT jint JNICALL
|
|
478
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerSupported(JNIEnv*, jclass) {
|
|
479
|
+
return static_cast<jint>(eliza_inference_speaker_supported());
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
JNIEXPORT jint JNICALL
|
|
483
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizSupported(JNIEnv*, jclass) {
|
|
484
|
+
return static_cast<jint>(eliza_inference_diariz_supported());
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// ── Context lifecycle ────────────────────────────────────────────────────
|
|
488
|
+
|
|
489
|
+
JNIEXPORT jlong JNICALL
|
|
490
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeContextCreate(JNIEnv* env, jclass,
|
|
491
|
+
jstring jBundleDir) {
|
|
492
|
+
const std::string bundleDir = from_jstring(env, jBundleDir);
|
|
493
|
+
if (bundleDir.empty()) {
|
|
494
|
+
throw_runtime(env, "contextCreate: empty bundle dir", nullptr);
|
|
495
|
+
return 0;
|
|
496
|
+
}
|
|
497
|
+
char* outError = nullptr;
|
|
498
|
+
EliInferenceContext* ctx =
|
|
499
|
+
eliza_inference_create(bundleDir.c_str(), &outError);
|
|
500
|
+
if (ctx == nullptr) {
|
|
501
|
+
throw_runtime(env, "eliza_inference_create returned null", outError);
|
|
502
|
+
return 0;
|
|
503
|
+
}
|
|
504
|
+
LOGI("contextCreate(%s) -> %p", bundleDir.c_str(), (void*)ctx);
|
|
505
|
+
return reinterpret_cast<jlong>(ctx);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
JNIEXPORT void JNICALL
|
|
509
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeContextDestroy(JNIEnv*, jclass,
|
|
510
|
+
jlong handle) {
|
|
511
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(handle);
|
|
512
|
+
if (ctx) eliza_inference_destroy(ctx);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// ── VAD direct ops (evidence / self-test) ────────────────────────────────
|
|
516
|
+
|
|
517
|
+
JNIEXPORT jlong JNICALL
|
|
518
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadOpen(JNIEnv* env, jclass,
|
|
519
|
+
jlong ctxHandle) {
|
|
520
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
521
|
+
char* outError = nullptr;
|
|
522
|
+
EliVad* vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
|
|
523
|
+
if (!vad) {
|
|
524
|
+
throw_runtime(env, "vad_open returned null", outError);
|
|
525
|
+
return 0;
|
|
526
|
+
}
|
|
527
|
+
return reinterpret_cast<jlong>(vad);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Process N 512-sample windows in one call; returns the per-window
|
|
531
|
+
// probabilities as a Java float[] (length floor(samples/512)). Zero per-window
|
|
532
|
+
// bridge calls — the whole batch runs natively.
|
|
533
|
+
JNIEXPORT jfloatArray JNICALL
|
|
534
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadProcessBatch(JNIEnv* env, jclass,
|
|
535
|
+
jlong vadHandle,
|
|
536
|
+
jfloatArray jPcm) {
|
|
537
|
+
auto* vad = reinterpret_cast<EliVad*>(vadHandle);
|
|
538
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
539
|
+
const size_t windows = pcm.size() / kVadWindow;
|
|
540
|
+
std::vector<float> probs(windows, 0.0f);
|
|
541
|
+
char* outError = nullptr;
|
|
542
|
+
for (size_t w = 0; w < windows; ++w) {
|
|
543
|
+
float p = -1.0f;
|
|
544
|
+
const int rc = eliza_inference_vad_process(
|
|
545
|
+
vad, pcm.data() + w * kVadWindow, kVadWindow, &p, &outError);
|
|
546
|
+
if (rc != ELIZA_OK) {
|
|
547
|
+
throw_runtime(env, "vad_process(batch)", outError);
|
|
548
|
+
return nullptr;
|
|
549
|
+
}
|
|
550
|
+
probs[w] = p;
|
|
551
|
+
}
|
|
552
|
+
jfloatArray out = env->NewFloatArray(static_cast<jsize>(windows));
|
|
553
|
+
if (out && windows > 0) {
|
|
554
|
+
env->SetFloatArrayRegion(out, 0, static_cast<jsize>(windows),
|
|
555
|
+
probs.data());
|
|
556
|
+
}
|
|
557
|
+
return out;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
JNIEXPORT void JNICALL
|
|
561
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadReset(JNIEnv*, jclass,
|
|
562
|
+
jlong vadHandle) {
|
|
563
|
+
auto* vad = reinterpret_cast<EliVad*>(vadHandle);
|
|
564
|
+
char* outError = nullptr;
|
|
565
|
+
eliza_inference_vad_reset(vad, &outError);
|
|
566
|
+
if (outError) std::free(outError);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
JNIEXPORT void JNICALL
|
|
570
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadClose(JNIEnv*, jclass,
|
|
571
|
+
jlong vadHandle) {
|
|
572
|
+
eliza_inference_vad_close(reinterpret_cast<EliVad*>(vadHandle));
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// ── Wake-word ops ────────────────────────────────────────────────────────
|
|
576
|
+
|
|
577
|
+
JNIEXPORT jlong JNICALL
|
|
578
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordOpen(JNIEnv* env, jclass,
|
|
579
|
+
jlong ctxHandle,
|
|
580
|
+
jstring jHead) {
|
|
581
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
582
|
+
const std::string head = from_jstring(env, jHead);
|
|
583
|
+
char* outError = nullptr;
|
|
584
|
+
EliWakeWord* wake = eliza_inference_wakeword_open(
|
|
585
|
+
ctx, kSampleRate, head.empty() ? "hey-eliza" : head.c_str(), &outError);
|
|
586
|
+
if (!wake) {
|
|
587
|
+
throw_runtime(env, "wakeword_open returned null", outError);
|
|
588
|
+
return 0;
|
|
589
|
+
}
|
|
590
|
+
return reinterpret_cast<jlong>(wake);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Score N 1280-sample frames in one call; returns the per-frame P(wake) as a
|
|
594
|
+
// Java float[] (length floor(samples/1280)).
|
|
595
|
+
JNIEXPORT jfloatArray JNICALL
|
|
596
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordScoreBatch(JNIEnv* env,
|
|
597
|
+
jclass,
|
|
598
|
+
jlong wakeHandle,
|
|
599
|
+
jfloatArray jPcm) {
|
|
600
|
+
auto* wake = reinterpret_cast<EliWakeWord*>(wakeHandle);
|
|
601
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
602
|
+
const size_t frames = pcm.size() / kWakeFrame;
|
|
603
|
+
std::vector<float> scores(frames, 0.0f);
|
|
604
|
+
char* outError = nullptr;
|
|
605
|
+
for (size_t f = 0; f < frames; ++f) {
|
|
606
|
+
float p = -1.0f;
|
|
607
|
+
const int rc = eliza_inference_wakeword_score(
|
|
608
|
+
wake, pcm.data() + f * kWakeFrame, kWakeFrame, &p, &outError);
|
|
609
|
+
if (rc != ELIZA_OK) {
|
|
610
|
+
throw_runtime(env, "wakeword_score(batch)", outError);
|
|
611
|
+
return nullptr;
|
|
612
|
+
}
|
|
613
|
+
scores[f] = p;
|
|
614
|
+
}
|
|
615
|
+
float maxScore = 0.0f;
|
|
616
|
+
for (float v : scores) maxScore = std::max(maxScore, v);
|
|
617
|
+
LOGI("wakeword scoreBatch: frames=%zu maxP=%.4f", frames, maxScore);
|
|
618
|
+
jfloatArray out = env->NewFloatArray(static_cast<jsize>(frames));
|
|
619
|
+
if (out && frames > 0) {
|
|
620
|
+
env->SetFloatArrayRegion(out, 0, static_cast<jsize>(frames),
|
|
621
|
+
scores.data());
|
|
622
|
+
}
|
|
623
|
+
return out;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
JNIEXPORT void JNICALL
|
|
627
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordReset(JNIEnv*, jclass,
|
|
628
|
+
jlong wakeHandle) {
|
|
629
|
+
auto* wake = reinterpret_cast<EliWakeWord*>(wakeHandle);
|
|
630
|
+
char* outError = nullptr;
|
|
631
|
+
eliza_inference_wakeword_reset(wake, &outError);
|
|
632
|
+
if (outError) std::free(outError);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
JNIEXPORT void JNICALL
|
|
636
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordClose(JNIEnv*, jclass,
|
|
637
|
+
jlong wakeHandle) {
|
|
638
|
+
eliza_inference_wakeword_close(reinterpret_cast<EliWakeWord*>(wakeHandle));
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// ── Speaker encoder ops ──────────────────────────────────────────────────
|
|
642
|
+
|
|
643
|
+
JNIEXPORT jlong JNICALL
|
|
644
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerOpen(JNIEnv* env, jclass,
|
|
645
|
+
jlong ctxHandle,
|
|
646
|
+
jstring jGgufPath) {
|
|
647
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
648
|
+
const std::string gguf = from_jstring(env, jGgufPath);
|
|
649
|
+
char* outError = nullptr;
|
|
650
|
+
EliSpeaker* sp = eliza_inference_speaker_open(
|
|
651
|
+
ctx, gguf.empty() ? nullptr : gguf.c_str(), &outError);
|
|
652
|
+
if (!sp) {
|
|
653
|
+
throw_runtime(env, "speaker_open returned null", outError);
|
|
654
|
+
return 0;
|
|
655
|
+
}
|
|
656
|
+
return reinterpret_cast<jlong>(sp);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// Embed a turn's PCM into a 256-float L2-normalized speaker embedding.
|
|
660
|
+
JNIEXPORT jfloatArray JNICALL
|
|
661
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerEmbed(JNIEnv* env, jclass,
|
|
662
|
+
jlong spHandle,
|
|
663
|
+
jfloatArray jPcm) {
|
|
664
|
+
auto* sp = reinterpret_cast<EliSpeaker*>(spHandle);
|
|
665
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
666
|
+
std::vector<float> emb(kSpeakerEmbeddingDim, 0.0f);
|
|
667
|
+
char* outError = nullptr;
|
|
668
|
+
const int rc = eliza_inference_speaker_embed(sp, pcm.data(), pcm.size(),
|
|
669
|
+
emb.data(), &outError);
|
|
670
|
+
if (rc != ELIZA_OK) {
|
|
671
|
+
throw_runtime(env, "speaker_embed", outError);
|
|
672
|
+
return nullptr;
|
|
673
|
+
}
|
|
674
|
+
jfloatArray out = env->NewFloatArray(static_cast<jsize>(kSpeakerEmbeddingDim));
|
|
675
|
+
if (out) {
|
|
676
|
+
env->SetFloatArrayRegion(out, 0, static_cast<jsize>(kSpeakerEmbeddingDim),
|
|
677
|
+
emb.data());
|
|
678
|
+
}
|
|
679
|
+
return out;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
JNIEXPORT void JNICALL
|
|
683
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerClose(JNIEnv*, jclass,
|
|
684
|
+
jlong spHandle) {
|
|
685
|
+
eliza_inference_speaker_close(reinterpret_cast<EliSpeaker*>(spHandle));
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// ── Diarizer ops ─────────────────────────────────────────────────────────
|
|
689
|
+
|
|
690
|
+
JNIEXPORT jlong JNICALL
|
|
691
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizOpen(JNIEnv* env, jclass,
|
|
692
|
+
jlong ctxHandle,
|
|
693
|
+
jstring jGgufPath) {
|
|
694
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
695
|
+
const std::string gguf = from_jstring(env, jGgufPath);
|
|
696
|
+
char* outError = nullptr;
|
|
697
|
+
EliDiariz* di = eliza_inference_diariz_open(
|
|
698
|
+
ctx, gguf.empty() ? nullptr : gguf.c_str(), &outError);
|
|
699
|
+
if (!di) {
|
|
700
|
+
throw_runtime(env, "diariz_open returned null", outError);
|
|
701
|
+
return 0;
|
|
702
|
+
}
|
|
703
|
+
return reinterpret_cast<jlong>(di);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Segment a fixed 80000-sample (5 s) window into per-frame int8 powerset
|
|
707
|
+
// labels; returns the labels as a Java byte[].
|
|
708
|
+
JNIEXPORT jbyteArray JNICALL
|
|
709
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizSegment(JNIEnv* env, jclass,
|
|
710
|
+
jlong diHandle,
|
|
711
|
+
jfloatArray jPcm) {
|
|
712
|
+
auto* di = reinterpret_cast<EliDiariz*>(diHandle);
|
|
713
|
+
std::vector<float> pcm = read_float_array(env, jPcm);
|
|
714
|
+
// pyannote takes exactly 80000 samples — pad or crop.
|
|
715
|
+
std::vector<float> window(kDiarizWindow, 0.0f);
|
|
716
|
+
const size_t copy = pcm.size() < kDiarizWindow ? pcm.size() : kDiarizWindow;
|
|
717
|
+
std::memcpy(window.data(), pcm.data(), copy * sizeof(float));
|
|
718
|
+
std::vector<int8_t> out(kDiarizLabelCap, 0);
|
|
719
|
+
size_t nLabels = out.size();
|
|
720
|
+
char* outError = nullptr;
|
|
721
|
+
const int rc = eliza_inference_diariz_segment(
|
|
722
|
+
di, window.data(), window.size(), out.data(), &nLabels, &outError);
|
|
723
|
+
if (rc != ELIZA_OK) {
|
|
724
|
+
throw_runtime(env, "diariz_segment", outError);
|
|
725
|
+
return nullptr;
|
|
726
|
+
}
|
|
727
|
+
jbyteArray ja = env->NewByteArray(static_cast<jsize>(nLabels));
|
|
728
|
+
if (ja && nLabels > 0) {
|
|
729
|
+
env->SetByteArrayRegion(ja, 0, static_cast<jsize>(nLabels),
|
|
730
|
+
reinterpret_cast<const jbyte*>(out.data()));
|
|
731
|
+
}
|
|
732
|
+
return ja;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
JNIEXPORT void JNICALL
|
|
736
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizClose(JNIEnv*, jclass,
|
|
737
|
+
jlong diHandle) {
|
|
738
|
+
eliza_inference_diariz_close(reinterpret_cast<EliDiariz*>(diHandle));
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// ── Native streaming pipeline (the hot-loop owner) ───────────────────────
|
|
742
|
+
|
|
743
|
+
// Open a pipeline session on a context: opens VAD + speaker + diariz (each
|
|
744
|
+
// best-effort; a missing classifier is reported as null and that turn payload
|
|
745
|
+
// is empty). Returns an opaque handle.
|
|
746
|
+
JNIEXPORT jlong JNICALL
|
|
747
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineOpen(JNIEnv* env, jclass,
|
|
748
|
+
jlong ctxHandle) {
|
|
749
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
750
|
+
if (!ctx) {
|
|
751
|
+
throw_runtime(env, "pipelineOpen: null context", nullptr);
|
|
752
|
+
return 0;
|
|
753
|
+
}
|
|
754
|
+
auto* s = new PipelineSession();
|
|
755
|
+
s->ctx = ctx;
|
|
756
|
+
char* outError = nullptr;
|
|
757
|
+
|
|
758
|
+
s->vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
|
|
759
|
+
if (!s->vad) {
|
|
760
|
+
delete s;
|
|
761
|
+
throw_runtime(env, "pipelineOpen: vad_open returned null", outError);
|
|
762
|
+
return 0;
|
|
763
|
+
}
|
|
764
|
+
// Speaker + diariz are required for a real attributed turn; open both.
|
|
765
|
+
s->speaker = eliza_inference_speaker_open(ctx, nullptr, &outError);
|
|
766
|
+
if (!s->speaker) {
|
|
767
|
+
eliza_inference_vad_close(s->vad);
|
|
768
|
+
delete s;
|
|
769
|
+
throw_runtime(env, "pipelineOpen: speaker_open returned null", outError);
|
|
770
|
+
return 0;
|
|
771
|
+
}
|
|
772
|
+
s->diariz = eliza_inference_diariz_open(ctx, nullptr, &outError);
|
|
773
|
+
if (!s->diariz) {
|
|
774
|
+
eliza_inference_speaker_close(s->speaker);
|
|
775
|
+
eliza_inference_vad_close(s->vad);
|
|
776
|
+
delete s;
|
|
777
|
+
throw_runtime(env, "pipelineOpen: diariz_open returned null", outError);
|
|
778
|
+
return 0;
|
|
779
|
+
}
|
|
780
|
+
LOGI("pipelineOpen -> %p (vad+speaker+diariz)", (void*)s);
|
|
781
|
+
return reinterpret_cast<jlong>(s);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// Feed one audio-frame batch (16 kHz mono fp32) into the pipeline. Runs the VAD
|
|
785
|
+
// hot-loop + segmentation natively; on each speech-end runs speaker+diariz.
|
|
786
|
+
// Returns a JSON array of turns completed in THIS call (may be empty). The
|
|
787
|
+
// heavy embedding/labels payloads are read per-index via the getters below.
|
|
788
|
+
JNIEXPORT jstring JNICALL
|
|
789
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineProcess(JNIEnv* env, jclass,
|
|
790
|
+
jlong handle,
|
|
791
|
+
jfloatArray jPcm) {
|
|
792
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
793
|
+
if (!s) {
|
|
794
|
+
throw_runtime(env, "pipelineProcess: null session", nullptr);
|
|
795
|
+
return nullptr;
|
|
796
|
+
}
|
|
797
|
+
s->turns.clear();
|
|
798
|
+
s->turnEmbeddings.clear();
|
|
799
|
+
s->turnLabels.clear();
|
|
800
|
+
|
|
801
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
802
|
+
s->pending.insert(s->pending.end(), pcm.begin(), pcm.end());
|
|
803
|
+
char* outError = nullptr;
|
|
804
|
+
if (!drain_windows(s, &outError)) {
|
|
805
|
+
throw_runtime(env, "pipelineProcess: drain", outError);
|
|
806
|
+
return nullptr;
|
|
807
|
+
}
|
|
808
|
+
if (!s->turns.empty()) {
|
|
809
|
+
LOGI("pipelineProcess: fed %zu samples, %zu turn(s) completed, "
|
|
810
|
+
"capturing=%d", pcm.size(), s->turns.size(), s->capturing ? 1 : 0);
|
|
811
|
+
}
|
|
812
|
+
return to_jstring(env, drain_turns_json(s));
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
// Force-finalize any open turn (call at end-of-capture). Returns the JSON array
|
|
816
|
+
// of any turn completed by the flush.
|
|
817
|
+
JNIEXPORT jstring JNICALL
|
|
818
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineFlush(JNIEnv* env, jclass,
|
|
819
|
+
jlong handle) {
|
|
820
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
821
|
+
if (!s) {
|
|
822
|
+
throw_runtime(env, "pipelineFlush: null session", nullptr);
|
|
823
|
+
return nullptr;
|
|
824
|
+
}
|
|
825
|
+
s->turns.clear();
|
|
826
|
+
s->turnEmbeddings.clear();
|
|
827
|
+
s->turnLabels.clear();
|
|
828
|
+
if (s->seg.forceEnd()) {
|
|
829
|
+
s->capturing = false;
|
|
830
|
+
char* outError = nullptr;
|
|
831
|
+
eliza_inference_vad_reset(s->vad, &outError);
|
|
832
|
+
if (outError) std::free(outError);
|
|
833
|
+
outError = nullptr;
|
|
834
|
+
if (!finalize_turn(s, &outError)) {
|
|
835
|
+
throw_runtime(env, "pipelineFlush: finalize", outError);
|
|
836
|
+
return nullptr;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
return to_jstring(env, drain_turns_json(s));
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Read the speaker embedding (256 floats) for the i-th turn produced by the
|
|
843
|
+
// last process()/flush() call. Empty array when that turn had no embedding.
|
|
844
|
+
JNIEXPORT jfloatArray JNICALL
|
|
845
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineTurnEmbedding(JNIEnv* env,
|
|
846
|
+
jclass,
|
|
847
|
+
jlong handle,
|
|
848
|
+
jint index) {
|
|
849
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
850
|
+
if (!s || index < 0 ||
|
|
851
|
+
static_cast<size_t>(index) >= s->turnEmbeddings.size()) {
|
|
852
|
+
return env->NewFloatArray(0);
|
|
853
|
+
}
|
|
854
|
+
const auto& emb = s->turnEmbeddings[static_cast<size_t>(index)];
|
|
855
|
+
jfloatArray out = env->NewFloatArray(static_cast<jsize>(emb.size()));
|
|
856
|
+
if (out && !emb.empty()) {
|
|
857
|
+
env->SetFloatArrayRegion(out, 0, static_cast<jsize>(emb.size()),
|
|
858
|
+
emb.data());
|
|
859
|
+
}
|
|
860
|
+
return out;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// Read the diariz int8 frame labels for the i-th turn.
|
|
864
|
+
JNIEXPORT jbyteArray JNICALL
|
|
865
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineTurnLabels(JNIEnv* env,
|
|
866
|
+
jclass,
|
|
867
|
+
jlong handle,
|
|
868
|
+
jint index) {
|
|
869
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
870
|
+
if (!s || index < 0 ||
|
|
871
|
+
static_cast<size_t>(index) >= s->turnLabels.size()) {
|
|
872
|
+
return env->NewByteArray(0);
|
|
873
|
+
}
|
|
874
|
+
const auto& labels = s->turnLabels[static_cast<size_t>(index)];
|
|
875
|
+
jbyteArray out = env->NewByteArray(static_cast<jsize>(labels.size()));
|
|
876
|
+
if (out && !labels.empty()) {
|
|
877
|
+
env->SetByteArrayRegion(out, 0, static_cast<jsize>(labels.size()),
|
|
878
|
+
reinterpret_cast<const jbyte*>(labels.data()));
|
|
879
|
+
}
|
|
880
|
+
return out;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
JNIEXPORT void JNICALL
|
|
884
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineReset(JNIEnv*, jclass,
|
|
885
|
+
jlong handle) {
|
|
886
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
887
|
+
if (!s) return;
|
|
888
|
+
s->seg.reset();
|
|
889
|
+
s->pending.clear();
|
|
890
|
+
s->turnPcm.clear();
|
|
891
|
+
s->preRoll.clear();
|
|
892
|
+
s->capturing = false;
|
|
893
|
+
char* outError = nullptr;
|
|
894
|
+
if (s->vad) eliza_inference_vad_reset(s->vad, &outError);
|
|
895
|
+
if (outError) std::free(outError);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
JNIEXPORT void JNICALL
|
|
899
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineClose(JNIEnv*, jclass,
|
|
900
|
+
jlong handle) {
|
|
901
|
+
auto* s = reinterpret_cast<PipelineSession*>(handle);
|
|
902
|
+
if (!s) return;
|
|
903
|
+
if (s->diariz) eliza_inference_diariz_close(s->diariz);
|
|
904
|
+
if (s->speaker) eliza_inference_speaker_close(s->speaker);
|
|
905
|
+
if (s->vad) eliza_inference_vad_close(s->vad);
|
|
906
|
+
delete s;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// ── Pipeline self-test (one native call: ctx→open→feed→flush) ────────────
|
|
910
|
+
//
|
|
911
|
+
// Runs the WHOLE native pipeline on a complete PCM buffer in ONE call: creates
|
|
912
|
+
// a context, opens the VAD+speaker+diariz pipeline, streams the PCM through the
|
|
913
|
+
// native VAD hot-loop + turn segmentation, flushes, and returns the turn JSON
|
|
914
|
+
// (the per-op TURN logcat lines are the in-process evidence). Single call so it
|
|
915
|
+
// does not depend on chained Capacitor awaits. `feedSamples` chunks the feed to
|
|
916
|
+
// mimic the live audioFrame batching (0 = feed the whole buffer at once).
|
|
917
|
+
JNIEXPORT jstring JNICALL
|
|
918
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineSelfTest(JNIEnv* env, jclass,
|
|
919
|
+
jstring jBundleDir,
|
|
920
|
+
jfloatArray jPcm,
|
|
921
|
+
jint feedSamples) {
|
|
922
|
+
const std::string bundleDir = from_jstring(env, jBundleDir);
|
|
923
|
+
char* outError = nullptr;
|
|
924
|
+
EliInferenceContext* ctx =
|
|
925
|
+
eliza_inference_create(bundleDir.c_str(), &outError);
|
|
926
|
+
if (!ctx) {
|
|
927
|
+
throw_runtime(env, "pipelineSelfTest: create", outError);
|
|
928
|
+
return nullptr;
|
|
929
|
+
}
|
|
930
|
+
auto* s = new PipelineSession();
|
|
931
|
+
s->ctx = ctx;
|
|
932
|
+
s->vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
|
|
933
|
+
if (!s->vad) { delete s; eliza_inference_destroy(ctx);
|
|
934
|
+
throw_runtime(env, "pipelineSelfTest: vad_open", outError); return nullptr; }
|
|
935
|
+
s->speaker = eliza_inference_speaker_open(ctx, nullptr, &outError);
|
|
936
|
+
if (!s->speaker) { eliza_inference_vad_close(s->vad); delete s;
|
|
937
|
+
eliza_inference_destroy(ctx);
|
|
938
|
+
throw_runtime(env, "pipelineSelfTest: speaker_open", outError); return nullptr; }
|
|
939
|
+
s->diariz = eliza_inference_diariz_open(ctx, nullptr, &outError);
|
|
940
|
+
if (!s->diariz) { eliza_inference_speaker_close(s->speaker);
|
|
941
|
+
eliza_inference_vad_close(s->vad); delete s; eliza_inference_destroy(ctx);
|
|
942
|
+
throw_runtime(env, "pipelineSelfTest: diariz_open", outError); return nullptr; }
|
|
943
|
+
|
|
944
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
945
|
+
LOGI("pipelineSelfTest: feeding %zu samples (%.2fs), chunk=%d",
|
|
946
|
+
pcm.size(), pcm.size() / (double)kSampleRate, feedSamples);
|
|
947
|
+
const size_t chunk = feedSamples > 0 ? static_cast<size_t>(feedSamples)
|
|
948
|
+
: pcm.size();
|
|
949
|
+
std::vector<std::string> allTurns;
|
|
950
|
+
for (size_t off = 0; off < pcm.size(); off += chunk) {
|
|
951
|
+
const size_t end = std::min(off + chunk, pcm.size());
|
|
952
|
+
s->pending.insert(s->pending.end(), pcm.begin() + off, pcm.begin() + end);
|
|
953
|
+
s->turns.clear(); s->turnEmbeddings.clear(); s->turnLabels.clear();
|
|
954
|
+
if (!drain_windows(s, &outError)) {
|
|
955
|
+
cleanup_session_for_selftest(s, ctx);
|
|
956
|
+
throw_runtime(env, "pipelineSelfTest: drain", outError);
|
|
957
|
+
return nullptr;
|
|
958
|
+
}
|
|
959
|
+
for (auto& t : s->turns) allTurns.push_back(t);
|
|
960
|
+
}
|
|
961
|
+
// Flush any open turn (the speech-end via end-hangover may already have
|
|
962
|
+
// fired mid-stream; a force-flush catches a turn still open at EOF).
|
|
963
|
+
s->turns.clear(); s->turnEmbeddings.clear(); s->turnLabels.clear();
|
|
964
|
+
if (s->seg.forceEnd()) {
|
|
965
|
+
s->capturing = false;
|
|
966
|
+
eliza_inference_vad_reset(s->vad, &outError);
|
|
967
|
+
if (outError) { std::free(outError); outError = nullptr; }
|
|
968
|
+
if (finalize_turn(s, &outError)) {
|
|
969
|
+
for (auto& t : s->turns) allTurns.push_back(t);
|
|
970
|
+
} else if (outError) { std::free(outError); outError = nullptr; }
|
|
971
|
+
}
|
|
972
|
+
std::string json = "[";
|
|
973
|
+
for (size_t i = 0; i < allTurns.size(); ++i) {
|
|
974
|
+
if (i) json += ",";
|
|
975
|
+
json += allTurns[i];
|
|
976
|
+
}
|
|
977
|
+
json += "]";
|
|
978
|
+
LOGI("pipelineSelfTest: %zu total turn(s)", allTurns.size());
|
|
979
|
+
cleanup_session_for_selftest(s, ctx);
|
|
980
|
+
return to_jstring(env, json);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
// ── Wake-word self-test (one native call: open + score pos + score neg) ──
|
|
984
|
+
//
|
|
985
|
+
// Scores two pre-decoded float[] clips through one wake-word session
|
|
986
|
+
// (reset between them) and logs both max P(wake) to logcat. Single call so the
|
|
987
|
+
// JS side does not chain awaits across the broken-under-CDP Capacitor result
|
|
988
|
+
// delivery — the in-process evidence is the logcat line.
|
|
989
|
+
JNIEXPORT jstring JNICALL
|
|
990
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordSelfTest(JNIEnv* env, jclass,
|
|
991
|
+
jstring jBundleDir,
|
|
992
|
+
jfloatArray jPos,
|
|
993
|
+
jfloatArray jNeg) {
|
|
994
|
+
const std::string bundleDir = from_jstring(env, jBundleDir);
|
|
995
|
+
char* outError = nullptr;
|
|
996
|
+
EliInferenceContext* ctx =
|
|
997
|
+
eliza_inference_create(bundleDir.c_str(), &outError);
|
|
998
|
+
if (!ctx) {
|
|
999
|
+
throw_runtime(env, "wakewordSelfTest: create", outError);
|
|
1000
|
+
return nullptr;
|
|
1001
|
+
}
|
|
1002
|
+
EliWakeWord* wake =
|
|
1003
|
+
eliza_inference_wakeword_open(ctx, kSampleRate, "hey-eliza", &outError);
|
|
1004
|
+
if (!wake) {
|
|
1005
|
+
eliza_inference_destroy(ctx);
|
|
1006
|
+
throw_runtime(env, "wakewordSelfTest: wakeword_open", outError);
|
|
1007
|
+
return nullptr;
|
|
1008
|
+
}
|
|
1009
|
+
auto scoreMax = [&](jfloatArray jPcm) -> float {
|
|
1010
|
+
const std::vector<float> pcm = read_float_array(env, jPcm);
|
|
1011
|
+
const size_t frames = pcm.size() / kWakeFrame;
|
|
1012
|
+
float maxP = 0.0f;
|
|
1013
|
+
for (size_t f = 0; f < frames; ++f) {
|
|
1014
|
+
float p = -1.0f;
|
|
1015
|
+
char* e = nullptr;
|
|
1016
|
+
if (eliza_inference_wakeword_score(wake, pcm.data() + f * kWakeFrame,
|
|
1017
|
+
kWakeFrame, &p, &e) == ELIZA_OK) {
|
|
1018
|
+
maxP = std::max(maxP, p);
|
|
1019
|
+
}
|
|
1020
|
+
if (e) std::free(e);
|
|
1021
|
+
}
|
|
1022
|
+
return maxP;
|
|
1023
|
+
};
|
|
1024
|
+
const float posMax = scoreMax(jPos);
|
|
1025
|
+
eliza_inference_wakeword_reset(wake, &outError);
|
|
1026
|
+
if (outError) { std::free(outError); outError = nullptr; }
|
|
1027
|
+
const float negMax = scoreMax(jNeg);
|
|
1028
|
+
eliza_inference_wakeword_close(wake);
|
|
1029
|
+
eliza_inference_destroy(ctx);
|
|
1030
|
+
LOGI("WAKEWORD SELFTEST: posMax=%.4f negMax=%.4f (pos should >> neg)",
|
|
1031
|
+
posMax, negMax);
|
|
1032
|
+
std::string j = "{\"posMax\":" + std::to_string(posMax) +
|
|
1033
|
+
",\"negMax\":" + std::to_string(negMax) + "}";
|
|
1034
|
+
return to_jstring(env, j);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
// ── VAD self-test (Phase 3a, retained for the existing harness) ──────────
|
|
1038
|
+
|
|
1039
|
+
JNIEXPORT jstring JNICALL
|
|
1040
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeVadSelfTest(JNIEnv* env, jclass,
|
|
1041
|
+
jstring jBundleDir) {
|
|
1042
|
+
const char* abi = eliza_inference_abi_version();
|
|
1043
|
+
const std::string abiStr = abi ? std::string(abi) : std::string();
|
|
1044
|
+
const int supported = eliza_inference_vad_supported();
|
|
1045
|
+
const std::string bundleDir = from_jstring(env, jBundleDir);
|
|
1046
|
+
|
|
1047
|
+
auto fail = [&](const char* stage, const std::string& err) -> jstring {
|
|
1048
|
+
std::string j = std::string("{\"ok\":false,\"stage\":\"") + stage +
|
|
1049
|
+
"\",\"error\":\"" + err + "\",\"abi\":\"" + abiStr +
|
|
1050
|
+
"\",\"supported\":" + std::to_string(supported) + "}";
|
|
1051
|
+
LOGE("nativeVadSelfTest failed at %s: %s", stage, err.c_str());
|
|
1052
|
+
return to_jstring(env, j);
|
|
1053
|
+
};
|
|
1054
|
+
|
|
1055
|
+
if (bundleDir.empty()) return fail("bundle_dir", "empty bundle dir");
|
|
1056
|
+
|
|
1057
|
+
char* outError = nullptr;
|
|
1058
|
+
EliInferenceContext* ctx =
|
|
1059
|
+
eliza_inference_create(bundleDir.c_str(), &outError);
|
|
1060
|
+
if (ctx == nullptr) {
|
|
1061
|
+
std::string err =
|
|
1062
|
+
outError ? std::string(outError) : std::string("create returned null");
|
|
1063
|
+
if (outError) std::free(outError);
|
|
1064
|
+
return fail("create", err);
|
|
1065
|
+
}
|
|
1066
|
+
EliVad* vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
|
|
1067
|
+
if (vad == nullptr) {
|
|
1068
|
+
std::string err = outError ? std::string(outError)
|
|
1069
|
+
: std::string("vad_open returned null");
|
|
1070
|
+
if (outError) std::free(outError);
|
|
1071
|
+
eliza_inference_destroy(ctx);
|
|
1072
|
+
return fail("vad_open", err);
|
|
1073
|
+
}
|
|
1074
|
+
std::vector<float> pcm(kVadWindow);
|
|
1075
|
+
for (size_t i = 0; i < pcm.size(); ++i) {
|
|
1076
|
+
pcm[i] = 0.25f *
|
|
1077
|
+
std::sin(2.0 * M_PI * 200.0 * (double)i / kSampleRate);
|
|
1078
|
+
}
|
|
1079
|
+
float probability = -1.0f;
|
|
1080
|
+
int rc = eliza_inference_vad_process(vad, pcm.data(), pcm.size(),
|
|
1081
|
+
&probability, &outError);
|
|
1082
|
+
if (rc != ELIZA_OK) {
|
|
1083
|
+
std::string err =
|
|
1084
|
+
outError ? std::string(outError) : ("rc=" + std::to_string(rc));
|
|
1085
|
+
if (outError) std::free(outError);
|
|
1086
|
+
eliza_inference_vad_close(vad);
|
|
1087
|
+
eliza_inference_destroy(ctx);
|
|
1088
|
+
return fail("vad_process", err);
|
|
1089
|
+
}
|
|
1090
|
+
if (outError) std::free(outError);
|
|
1091
|
+
eliza_inference_vad_close(vad);
|
|
1092
|
+
eliza_inference_destroy(ctx);
|
|
1093
|
+
|
|
1094
|
+
const bool finite = std::isfinite(probability);
|
|
1095
|
+
std::string j = std::string("{\"ok\":") + (finite ? "true" : "false") +
|
|
1096
|
+
",\"probability\":" + std::to_string(probability) +
|
|
1097
|
+
",\"abi\":\"" + abiStr + "\",\"supported\":" +
|
|
1098
|
+
std::to_string(supported) + "}";
|
|
1099
|
+
LOGI("nativeVadSelfTest ok: probability=%f abi=%s supported=%d", probability,
|
|
1100
|
+
abiStr.c_str(), supported);
|
|
1101
|
+
return to_jstring(env, j);
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
// ── Text generation (LLM) ops — the GPU-accelerated text path ────────────
|
|
1105
|
+
//
|
|
1106
|
+
// Wrap the fused streaming-LLM ABI (eliza_inference_llm_stream_*), pooled
|
|
1107
|
+
// embeddings (eliza_inference_embed), end-of-turn scoring
|
|
1108
|
+
// (eliza_inference_llm_eot_score, ABI v11), and the tokenizer. When this JNI
|
|
1109
|
+
// host is built against the DYNAMIC-Vulkan libelizainference (libggml-vulkan.so
|
|
1110
|
+
// staged alongside it), llm_stream_open offloads the model to the GPU in the
|
|
1111
|
+
// bionic app process automatically — the path the musl bun agent cannot take.
|
|
1112
|
+
|
|
1113
|
+
JNIEXPORT jint JNICALL
|
|
1114
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamSupported(JNIEnv*, jclass) {
|
|
1115
|
+
return static_cast<jint>(eliza_inference_llm_stream_supported());
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
JNIEXPORT jint JNICALL
|
|
1119
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeEmbedSupported(JNIEnv*, jclass) {
|
|
1120
|
+
return static_cast<jint>(eliza_inference_embed_supported());
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
JNIEXPORT jint JNICALL
|
|
1124
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeEotSupported(JNIEnv*, jclass) {
|
|
1125
|
+
return static_cast<jint>(eliza_inference_llm_eot_supported());
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
// Tokenize text -> int[] token ids. addSpecial adds BOS; parseSpecial renders
|
|
1129
|
+
// special tokens (<|im_start|> etc.) from the input.
|
|
1130
|
+
JNIEXPORT jintArray JNICALL
|
|
1131
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeTokenize(JNIEnv* env, jclass,
|
|
1132
|
+
jlong ctxHandle,
|
|
1133
|
+
jstring jText,
|
|
1134
|
+
jboolean addSpecial,
|
|
1135
|
+
jboolean parseSpecial) {
|
|
1136
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1137
|
+
const std::string text = from_jstring(env, jText);
|
|
1138
|
+
int* toks = nullptr;
|
|
1139
|
+
size_t n = 0;
|
|
1140
|
+
char* outError = nullptr;
|
|
1141
|
+
const int rc = eliza_inference_tokenize(
|
|
1142
|
+
ctx, text.c_str(), text.size(), addSpecial ? 1 : 0,
|
|
1143
|
+
parseSpecial ? 1 : 0, &toks, &n, &outError);
|
|
1144
|
+
if (rc != ELIZA_OK) {
|
|
1145
|
+
throw_runtime(env, "tokenize", outError);
|
|
1146
|
+
return nullptr;
|
|
1147
|
+
}
|
|
1148
|
+
jintArray out = env->NewIntArray(static_cast<jsize>(n));
|
|
1149
|
+
if (out && n > 0) {
|
|
1150
|
+
env->SetIntArrayRegion(out, 0, static_cast<jsize>(n),
|
|
1151
|
+
reinterpret_cast<const jint*>(toks));
|
|
1152
|
+
}
|
|
1153
|
+
if (toks) eliza_inference_free_tokens(toks);
|
|
1154
|
+
return out;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
// Pooled, L2-normalized sentence embedding (pooling: 1=MEAN default) ->
|
|
1158
|
+
// float[n_embd].
|
|
1159
|
+
JNIEXPORT jfloatArray JNICALL
|
|
1160
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeEmbed(JNIEnv* env, jclass,
|
|
1161
|
+
jlong ctxHandle, jstring jText,
|
|
1162
|
+
jint pooling) {
|
|
1163
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1164
|
+
const std::string text = from_jstring(env, jText);
|
|
1165
|
+
std::vector<float> out(4096, 0.0f);
|
|
1166
|
+
int dim = 0;
|
|
1167
|
+
char* outError = nullptr;
|
|
1168
|
+
const int rc = eliza_inference_embed(ctx, text.c_str(), text.size(),
|
|
1169
|
+
pooling > 0 ? pooling : 1, out.data(),
|
|
1170
|
+
out.size(), &dim, &outError);
|
|
1171
|
+
if (rc != ELIZA_OK) {
|
|
1172
|
+
throw_runtime(env, "embed", outError);
|
|
1173
|
+
return nullptr;
|
|
1174
|
+
}
|
|
1175
|
+
jfloatArray ja = env->NewFloatArray(dim);
|
|
1176
|
+
if (ja && dim > 0) env->SetFloatArrayRegion(ja, 0, dim, out.data());
|
|
1177
|
+
return ja;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// End-of-turn score: next-token P(targetToken | tokens) -> float.
|
|
1181
|
+
JNIEXPORT jfloat JNICALL
|
|
1182
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeEotScore(JNIEnv* env, jclass,
|
|
1183
|
+
jlong ctxHandle,
|
|
1184
|
+
jintArray jTokens,
|
|
1185
|
+
jint targetToken) {
|
|
1186
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1187
|
+
const jsize n = env->GetArrayLength(jTokens);
|
|
1188
|
+
std::vector<int32_t> toks(static_cast<size_t>(n));
|
|
1189
|
+
if (n > 0) {
|
|
1190
|
+
env->GetIntArrayRegion(jTokens, 0, n,
|
|
1191
|
+
reinterpret_cast<jint*>(toks.data()));
|
|
1192
|
+
}
|
|
1193
|
+
float prob = 0.0f, topProb = 0.0f;
|
|
1194
|
+
int32_t topTok = -1;
|
|
1195
|
+
char* outError = nullptr;
|
|
1196
|
+
const int rc = eliza_inference_llm_eot_score(ctx, toks.data(), toks.size(),
|
|
1197
|
+
targetToken, &prob, &topTok,
|
|
1198
|
+
&topProb, &outError);
|
|
1199
|
+
if (rc != ELIZA_OK) {
|
|
1200
|
+
throw_runtime(env, "eot_score", outError);
|
|
1201
|
+
return 0.0f;
|
|
1202
|
+
}
|
|
1203
|
+
return prob;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
// Open a streaming-LLM session. nGpuLayers: -1 = all-GPU (default), 0 = CPU
|
|
1207
|
+
// (the lib ignores 0 when libggml-vulkan is linked; the CPU/GPU choice is the
|
|
1208
|
+
// staged LIB VARIANT, see the per-device selection). drafterPath ("" = none)
|
|
1209
|
+
// enables MTP speculative decoding.
|
|
1210
|
+
JNIEXPORT jlong JNICALL
|
|
1211
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamOpen(
|
|
1212
|
+
JNIEnv* env, jclass, jlong ctxHandle, jint maxTokens, jfloat temperature,
|
|
1213
|
+
jfloat topP, jint topK, jint nGpuLayers, jstring jDrafterPath) {
|
|
1214
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1215
|
+
const std::string drafter = from_jstring(env, jDrafterPath);
|
|
1216
|
+
eliza_llm_stream_config_t cfg;
|
|
1217
|
+
std::memset(&cfg, 0, sizeof(cfg));
|
|
1218
|
+
cfg.max_tokens = maxTokens;
|
|
1219
|
+
cfg.temperature = temperature;
|
|
1220
|
+
cfg.top_p = topP > 0 ? topP : 1.0f;
|
|
1221
|
+
cfg.top_k = topK;
|
|
1222
|
+
cfg.repeat_penalty = 1.0f;
|
|
1223
|
+
cfg.n_gpu_layers = nGpuLayers;
|
|
1224
|
+
cfg.mtp_drafter_path = drafter.empty() ? nullptr : drafter.c_str();
|
|
1225
|
+
// Arm the fused QJL/TBQ3 KV-quant + (env-gated) same-file MTP draft window.
|
|
1226
|
+
// A caller-supplied drafter path is separate-drafter MTP and needs its own
|
|
1227
|
+
// draft window — only arm the same-file MTP env override when no drafter
|
|
1228
|
+
// was passed.
|
|
1229
|
+
arm_bionic_text_cfg(cfg);
|
|
1230
|
+
if (!drafter.empty() && cfg.draft_min <= 0) {
|
|
1231
|
+
// Separate drafter supplied but env left the window 0; give it the
|
|
1232
|
+
// single-head default so the drafter actually drives speculation.
|
|
1233
|
+
cfg.draft_min = 1;
|
|
1234
|
+
cfg.draft_max = 2;
|
|
1235
|
+
}
|
|
1236
|
+
char* outError = nullptr;
|
|
1237
|
+
EliLlmStream* s = eliza_inference_llm_stream_open(ctx, &cfg, &outError);
|
|
1238
|
+
if (!s) {
|
|
1239
|
+
throw_runtime(env, "llm_stream_open returned null", outError);
|
|
1240
|
+
return 0;
|
|
1241
|
+
}
|
|
1242
|
+
return reinterpret_cast<jlong>(s);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
JNIEXPORT void JNICALL
|
|
1246
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamPrefill(JNIEnv* env, jclass,
|
|
1247
|
+
jlong streamHandle,
|
|
1248
|
+
jintArray jTokens) {
|
|
1249
|
+
auto* s = reinterpret_cast<EliLlmStream*>(streamHandle);
|
|
1250
|
+
const jsize n = env->GetArrayLength(jTokens);
|
|
1251
|
+
std::vector<int32_t> toks(static_cast<size_t>(n));
|
|
1252
|
+
if (n > 0) {
|
|
1253
|
+
env->GetIntArrayRegion(jTokens, 0, n,
|
|
1254
|
+
reinterpret_cast<jint*>(toks.data()));
|
|
1255
|
+
}
|
|
1256
|
+
char* outError = nullptr;
|
|
1257
|
+
const int rc = eliza_inference_llm_stream_prefill(s, toks.data(),
|
|
1258
|
+
toks.size(), &outError);
|
|
1259
|
+
if (rc != ELIZA_OK) throw_runtime(env, "llm_stream_prefill", outError);
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
// Pull the next decode step. Returns JSON {text, done, drafted, accepted}:
|
|
1263
|
+
// `text` is the detokenized chunk (may span multiple committed tokens via MTP),
|
|
1264
|
+
// `done` true at the final step. `text` is JSON-escaped.
|
|
1265
|
+
JNIEXPORT jstring JNICALL
|
|
1266
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamNext(JNIEnv* env, jclass,
|
|
1267
|
+
jlong streamHandle) {
|
|
1268
|
+
auto* s = reinterpret_cast<EliLlmStream*>(streamHandle);
|
|
1269
|
+
int32_t toks[256];
|
|
1270
|
+
char text[4096];
|
|
1271
|
+
size_t nout = 0;
|
|
1272
|
+
int32_t drafted = 0, accepted = 0;
|
|
1273
|
+
char* outError = nullptr;
|
|
1274
|
+
const int rc = eliza_inference_llm_stream_next(
|
|
1275
|
+
s, toks, 256, &nout, text, sizeof(text), &drafted, &accepted, &outError);
|
|
1276
|
+
if (rc < 0) {
|
|
1277
|
+
throw_runtime(env, "llm_stream_next", outError);
|
|
1278
|
+
return nullptr;
|
|
1279
|
+
}
|
|
1280
|
+
std::string esc;
|
|
1281
|
+
for (const char* p = text; *p; ++p) {
|
|
1282
|
+
switch (*p) {
|
|
1283
|
+
case '"': esc += "\\\""; break;
|
|
1284
|
+
case '\\': esc += "\\\\"; break;
|
|
1285
|
+
case '\n': esc += "\\n"; break;
|
|
1286
|
+
case '\r': esc += "\\r"; break;
|
|
1287
|
+
case '\t': esc += "\\t"; break;
|
|
1288
|
+
default:
|
|
1289
|
+
if (static_cast<unsigned char>(*p) < 0x20) {
|
|
1290
|
+
char buf[8];
|
|
1291
|
+
std::snprintf(buf, sizeof(buf), "\\u%04x",
|
|
1292
|
+
static_cast<unsigned char>(*p));
|
|
1293
|
+
esc += buf;
|
|
1294
|
+
} else {
|
|
1295
|
+
esc += *p;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
std::string json = "{\"text\":\"" + esc +
|
|
1300
|
+
"\",\"done\":" + (rc == 1 ? "true" : "false") +
|
|
1301
|
+
",\"nout\":" + std::to_string(nout) +
|
|
1302
|
+
",\"drafted\":" + std::to_string(drafted) +
|
|
1303
|
+
",\"accepted\":" + std::to_string(accepted) + "}";
|
|
1304
|
+
return to_jstring(env, json);
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
JNIEXPORT void JNICALL
|
|
1308
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamClose(JNIEnv*, jclass,
|
|
1309
|
+
jlong streamHandle) {
|
|
1310
|
+
eliza_inference_llm_stream_close(
|
|
1311
|
+
reinterpret_cast<EliLlmStream*>(streamHandle));
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
// Reset a persistent stream (clear KV + sampler + counters) for warm reuse.
|
|
1315
|
+
// Returns 1 on success, 0 if the stream can't be reset (MTP / null).
|
|
1316
|
+
JNIEXPORT jint JNICALL
|
|
1317
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamReset(JNIEnv*, jclass,
|
|
1318
|
+
jlong streamHandle) {
|
|
1319
|
+
const int rc = eliza_inference_llm_stream_reset(
|
|
1320
|
+
reinterpret_cast<EliLlmStream*>(streamHandle));
|
|
1321
|
+
return static_cast<jint>(rc == ELIZA_OK ? 1 : 0);
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
// ── LLM self-test (one native call: ctx→tokenize→stream→generate) ─────────
|
|
1325
|
+
//
|
|
1326
|
+
// THE KEYSTONE PROOF: runs a whole greedy text generation in ONE native call,
|
|
1327
|
+
// in the bionic app process, against whatever libelizainference.so is staged
|
|
1328
|
+
// into jniLibs. When that lib is the dynamic-Vulkan variant, ggml-vulkan logs
|
|
1329
|
+
// "Found 1 Vulkan devices: Mali-G715" + "offloaded N/N layers to GPU" to
|
|
1330
|
+
// logcat (the in-process GPU evidence). Returns JSON {ok,text,tokens,ms,tokS}.
|
|
1331
|
+
JNIEXPORT jstring JNICALL
|
|
1332
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmSelfTest(JNIEnv* env, jclass,
|
|
1333
|
+
jstring jBundleDir,
|
|
1334
|
+
jstring jPrompt,
|
|
1335
|
+
jint maxTokens) {
|
|
1336
|
+
const std::string bundleDir = from_jstring(env, jBundleDir);
|
|
1337
|
+
const std::string prompt = from_jstring(env, jPrompt);
|
|
1338
|
+
const int genCap = maxTokens > 0 ? maxTokens : 32;
|
|
1339
|
+
char* outError = nullptr;
|
|
1340
|
+
|
|
1341
|
+
EliInferenceContext* ctx =
|
|
1342
|
+
eliza_inference_create(bundleDir.c_str(), &outError);
|
|
1343
|
+
if (!ctx) { throw_runtime(env, "llmSelfTest: create", outError); return nullptr; }
|
|
1344
|
+
|
|
1345
|
+
int* tok = nullptr; size_t tn = 0;
|
|
1346
|
+
if (eliza_inference_tokenize(ctx, prompt.c_str(), prompt.size(), 1, 1, &tok,
|
|
1347
|
+
&tn, &outError) != ELIZA_OK) {
|
|
1348
|
+
eliza_inference_destroy(ctx);
|
|
1349
|
+
throw_runtime(env, "llmSelfTest: tokenize", outError);
|
|
1350
|
+
return nullptr;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
eliza_llm_stream_config_t cfg;
|
|
1354
|
+
std::memset(&cfg, 0, sizeof(cfg));
|
|
1355
|
+
cfg.max_tokens = genCap;
|
|
1356
|
+
cfg.temperature = 0.0f; // greedy, deterministic
|
|
1357
|
+
cfg.top_k = 1;
|
|
1358
|
+
cfg.top_p = 1.0f;
|
|
1359
|
+
cfg.repeat_penalty = 1.0f;
|
|
1360
|
+
cfg.n_gpu_layers = -1; // all-GPU when the vulkan lib is staged
|
|
1361
|
+
// Arm the fused QJL/TBQ3 KV-quant + (env-gated) same-file MTP draft window
|
|
1362
|
+
// so the keystone generation path exercises the fused QJL attention route.
|
|
1363
|
+
arm_bionic_text_cfg(cfg);
|
|
1364
|
+
EliLlmStream* s = eliza_inference_llm_stream_open(ctx, &cfg, &outError);
|
|
1365
|
+
if (!s) {
|
|
1366
|
+
if (tok) eliza_inference_free_tokens(tok);
|
|
1367
|
+
eliza_inference_destroy(ctx);
|
|
1368
|
+
throw_runtime(env, "llmSelfTest: stream_open", outError);
|
|
1369
|
+
return nullptr;
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
const double t0 = []() {
|
|
1373
|
+
timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
1374
|
+
return ts.tv_sec * 1000.0 + ts.tv_nsec / 1e6;
|
|
1375
|
+
}();
|
|
1376
|
+
if (eliza_inference_llm_stream_prefill(s, reinterpret_cast<int32_t*>(tok),
|
|
1377
|
+
tn, &outError) != ELIZA_OK) {
|
|
1378
|
+
eliza_inference_llm_stream_close(s);
|
|
1379
|
+
if (tok) eliza_inference_free_tokens(tok);
|
|
1380
|
+
eliza_inference_destroy(ctx);
|
|
1381
|
+
throw_runtime(env, "llmSelfTest: prefill", outError);
|
|
1382
|
+
return nullptr;
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
std::string text;
|
|
1386
|
+
int produced = 0;
|
|
1387
|
+
while (produced < genCap) {
|
|
1388
|
+
int32_t toks[256]; char chunk[4096]; size_t nout = 0;
|
|
1389
|
+
int32_t dd = 0, da = 0;
|
|
1390
|
+
const int rc = eliza_inference_llm_stream_next(
|
|
1391
|
+
s, toks, 256, &nout, chunk, sizeof(chunk), &dd, &da, &outError);
|
|
1392
|
+
if (rc < 0) break;
|
|
1393
|
+
text += chunk;
|
|
1394
|
+
produced += static_cast<int>(nout);
|
|
1395
|
+
if (rc == 1) break;
|
|
1396
|
+
}
|
|
1397
|
+
const double t1 = []() {
|
|
1398
|
+
timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
1399
|
+
return ts.tv_sec * 1000.0 + ts.tv_nsec / 1e6;
|
|
1400
|
+
}();
|
|
1401
|
+
eliza_inference_llm_stream_close(s);
|
|
1402
|
+
if (tok) eliza_inference_free_tokens(tok);
|
|
1403
|
+
eliza_inference_destroy(ctx);
|
|
1404
|
+
|
|
1405
|
+
const double ms = t1 - t0;
|
|
1406
|
+
const double tokS = ms > 0 ? produced * 1000.0 / ms : 0.0;
|
|
1407
|
+
LOGI("LLM SELFTEST: generated %d tokens in %.0fms (%.2f tok/s) — \"%.80s\"",
|
|
1408
|
+
produced, ms, tokS, text.c_str());
|
|
1409
|
+
|
|
1410
|
+
// JSON-escape the generated text.
|
|
1411
|
+
std::string esc;
|
|
1412
|
+
for (char c : text) {
|
|
1413
|
+
switch (c) {
|
|
1414
|
+
case '"': esc += "\\\""; break;
|
|
1415
|
+
case '\\': esc += "\\\\"; break;
|
|
1416
|
+
case '\n': esc += "\\n"; break;
|
|
1417
|
+
case '\r': esc += "\\r"; break;
|
|
1418
|
+
case '\t': esc += "\\t"; break;
|
|
1419
|
+
default:
|
|
1420
|
+
if (static_cast<unsigned char>(c) < 0x20) {
|
|
1421
|
+
char b[8]; std::snprintf(b, sizeof(b), "\\u%04x",
|
|
1422
|
+
static_cast<unsigned char>(c));
|
|
1423
|
+
esc += b;
|
|
1424
|
+
} else esc += c;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
std::string json = "{\"ok\":true,\"tokens\":" + std::to_string(produced) +
|
|
1428
|
+
",\"ms\":" + std::to_string(ms) + ",\"tokS\":" +
|
|
1429
|
+
std::to_string(tokS) + ",\"text\":\"" + esc + "\"}";
|
|
1430
|
+
return to_jstring(env, json);
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
// ── Kokoro TTS (ABI v10) ─────────────────────────────────────────────────
|
|
1434
|
+
// Synthesize speech in-process via the fused Kokoro-82M head. This is what lets
|
|
1435
|
+
// the Android app speak with the real on-device voice instead of falling back to
|
|
1436
|
+
// the platform TextToSpeech: TalkMode (this bionic process) → bionic host "tts"
|
|
1437
|
+
// op → here. Returns a float[] of 24 kHz PCM (the model's native rate).
|
|
1438
|
+
|
|
1439
|
+
JNIEXPORT jint JNICALL
|
|
1440
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeKokoroSampleRate(JNIEnv*, jclass,
|
|
1441
|
+
jlong ctxHandle) {
|
|
1442
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1443
|
+
return ctx ? eliza_inference_kokoro_sample_rate(ctx) : -1;
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
JNIEXPORT jfloatArray JNICALL
|
|
1447
|
+
Java_ai_elizaos_app_ElizaVoiceNative_nativeKokoroSynthesize(JNIEnv* env, jclass,
|
|
1448
|
+
jlong ctxHandle,
|
|
1449
|
+
jstring jGguf,
|
|
1450
|
+
jstring jVoiceBin,
|
|
1451
|
+
jstring jText,
|
|
1452
|
+
jfloat speed) {
|
|
1453
|
+
auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
|
|
1454
|
+
if (!ctx) {
|
|
1455
|
+
throw_runtime(env, "kokoroSynthesize: null context", nullptr);
|
|
1456
|
+
return nullptr;
|
|
1457
|
+
}
|
|
1458
|
+
const std::string gguf = from_jstring(env, jGguf);
|
|
1459
|
+
const std::string voiceBin = from_jstring(env, jVoiceBin);
|
|
1460
|
+
const std::string text = from_jstring(env, jText);
|
|
1461
|
+
char* err = nullptr;
|
|
1462
|
+
// style_dim 256 for Kokoro v1.0. Reloads only when the model/voice changed
|
|
1463
|
+
// (the FFI caches the resident model + voice preset).
|
|
1464
|
+
if (eliza_inference_kokoro_load(ctx, gguf.c_str(), voiceBin.c_str(), 256, &err) != 0) {
|
|
1465
|
+
throw_runtime(env, "kokoro_load failed", err);
|
|
1466
|
+
return nullptr;
|
|
1467
|
+
}
|
|
1468
|
+
// Cap at 30 s @ 24 kHz — far longer than any single reply phrase.
|
|
1469
|
+
const size_t cap = 24000u * 30u;
|
|
1470
|
+
std::vector<float> pcm(cap);
|
|
1471
|
+
err = nullptr;
|
|
1472
|
+
int n = eliza_inference_kokoro_synthesize(
|
|
1473
|
+
ctx, text.c_str(), text.size(), speed, pcm.data(), cap, &err);
|
|
1474
|
+
if (n < 0) {
|
|
1475
|
+
throw_runtime(env, "kokoro_synthesize failed", err);
|
|
1476
|
+
return nullptr;
|
|
1477
|
+
}
|
|
1478
|
+
jfloatArray out = env->NewFloatArray(n);
|
|
1479
|
+
if (!out) return nullptr;
|
|
1480
|
+
env->SetFloatArrayRegion(out, 0, n, pcm.data());
|
|
1481
|
+
LOGI("nativeKokoroSynthesize: %zu chars -> %d samples", text.size(), n);
|
|
1482
|
+
return out;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
} // extern "C"
|