neoagent 2.3.1-beta.7 → 2.3.1-beta.71
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/.env.example +46 -5
- package/docs/capabilities.md +3 -3
- package/docs/configuration.md +18 -10
- package/docs/hardware.md +1 -1
- package/docs/integrations.md +2 -3
- package/flutter_app/.metadata +42 -0
- package/flutter_app/README.md +21 -0
- package/flutter_app/analysis_options.yaml +32 -0
- package/flutter_app/android/app/build.gradle.kts +111 -0
- package/flutter_app/android/app/src/debug/AndroidManifest.xml +7 -0
- package/flutter_app/android/app/src/main/AndroidManifest.xml +171 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/MainActivity.kt +804 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/auto/NeoAgentCarAppService.kt +114 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/HealthConnectGateway.kt +280 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/HealthSyncNotifications.kt +113 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/HealthSyncPayload.kt +57 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/HealthSyncScheduler.kt +78 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/HealthSyncWorker.kt +253 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/health/PermissionsRationaleActivity.kt +46 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingBootReceiver.kt +21 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingForegroundService.kt +586 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingStateStore.kt +78 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/recording/RecordingUploadClient.kt +104 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/telecom/NeoAgentConnection.kt +118 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/telecom/NeoAgentConnectionService.kt +86 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/AiHomeWidgetProvider.kt +457 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/AiWidgetStore.kt +194 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/VoiceLaunchWidgetProvider.kt +67 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/WidgetConfigActivity.kt +228 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/WidgetSyncScheduler.kt +72 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/WidgetSyncWorker.kt +186 -0
- package/flutter_app/android/app/src/main/kotlin/com/neoagent/flutter_app/widgets/WidgetTaskRunWorker.kt +210 -0
- package/flutter_app/android/app/src/main/res/drawable/launch_background.xml +12 -0
- package/flutter_app/android/app/src/main/res/drawable/neoagent_ai_widget_bg.xml +11 -0
- package/flutter_app/android/app/src/main/res/drawable/neoagent_ai_widget_task_bg.xml +8 -0
- package/flutter_app/android/app/src/main/res/drawable-v21/launch_background.xml +12 -0
- package/flutter_app/android/app/src/main/res/layout/neoagent_ai_widget.xml +138 -0
- package/flutter_app/android/app/src/main/res/layout/neoagent_ai_widget_task_row.xml +52 -0
- package/flutter_app/android/app/src/main/res/layout/neoagent_voice_widget.xml +49 -0
- package/flutter_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/flutter_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/flutter_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/flutter_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/flutter_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/flutter_app/android/app/src/main/res/values/arrays.xml +8 -0
- package/flutter_app/android/app/src/main/res/values/strings.xml +12 -0
- package/flutter_app/android/app/src/main/res/values/styles.xml +18 -0
- package/flutter_app/android/app/src/main/res/values-night/styles.xml +18 -0
- package/flutter_app/android/app/src/main/res/xml/automotive_app_desc.xml +4 -0
- package/flutter_app/android/app/src/main/res/xml/file_paths.xml +6 -0
- package/flutter_app/android/app/src/main/res/xml/neoagent_ai_widget_info.xml +12 -0
- package/flutter_app/android/app/src/main/res/xml/neoagent_voice_widget_info.xml +12 -0
- package/flutter_app/android/app/src/profile/AndroidManifest.xml +7 -0
- package/flutter_app/android/build.gradle.kts +24 -0
- package/flutter_app/android/ci-release.keystore +0 -0
- package/flutter_app/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/flutter_app/android/gradle.properties +3 -0
- package/flutter_app/android/key.properties +4 -0
- package/flutter_app/android/settings.gradle.kts +26 -0
- package/flutter_app/assets/branding/app_icon_1024.png +0 -0
- package/flutter_app/assets/branding/app_icon_128.png +0 -0
- package/flutter_app/assets/branding/app_icon_192.png +0 -0
- package/flutter_app/assets/branding/app_icon_256.png +0 -0
- package/flutter_app/assets/branding/app_icon_32.png +0 -0
- package/flutter_app/assets/branding/app_icon_512.png +0 -0
- package/flutter_app/assets/branding/app_icon_64.png +0 -0
- package/flutter_app/assets/branding/onboarding_intro.mp4 +0 -0
- package/flutter_app/assets/branding/tray_icon_template.png +0 -0
- package/flutter_app/lib/features/location/location_service.dart +119 -0
- package/flutter_app/lib/features/notifications/notification_interceptor.dart +97 -0
- package/flutter_app/lib/features/onboarding/onboarding_chrome.dart +571 -0
- package/flutter_app/lib/features/onboarding/onboarding_messaging_step.dart +275 -0
- package/flutter_app/lib/features/onboarding/onboarding_model_step.dart +366 -0
- package/flutter_app/lib/features/onboarding/onboarding_shell.dart +57 -0
- package/flutter_app/lib/features/onboarding/onboarding_video_step.dart +218 -0
- package/flutter_app/lib/features/onboarding/onboarding_welcome_step.dart +46 -0
- package/flutter_app/lib/main.dart +105 -0
- package/flutter_app/lib/main_account_settings.dart +1278 -0
- package/flutter_app/lib/main_admin.dart +900 -0
- package/flutter_app/lib/main_app_shell.dart +2135 -0
- package/flutter_app/lib/main_chat.dart +3629 -0
- package/flutter_app/lib/main_controller.dart +7034 -0
- package/flutter_app/lib/main_devices.dart +2394 -0
- package/flutter_app/lib/main_integrations.dart +917 -0
- package/flutter_app/lib/main_launcher.dart +959 -0
- package/flutter_app/lib/main_launcher_entry.dart +5 -0
- package/flutter_app/lib/main_models.dart +3738 -0
- package/flutter_app/lib/main_navigation.dart +206 -0
- package/flutter_app/lib/main_operations.dart +5001 -0
- package/flutter_app/lib/main_recordings.dart +920 -0
- package/flutter_app/lib/main_runtime.dart +860 -0
- package/flutter_app/lib/main_settings.dart +2250 -0
- package/flutter_app/lib/main_shared.dart +3310 -0
- package/flutter_app/lib/main_theme.dart +257 -0
- package/flutter_app/lib/main_unified.dart +388 -0
- package/flutter_app/lib/main_voice_assistant.dart +957 -0
- package/flutter_app/lib/src/analytics_service.dart +294 -0
- package/flutter_app/lib/src/android_apk_drop_zone.dart +32 -0
- package/flutter_app/lib/src/android_apk_drop_zone_stub.dart +16 -0
- package/flutter_app/lib/src/android_apk_drop_zone_web.dart +348 -0
- package/flutter_app/lib/src/android_app_installer.dart +22 -0
- package/flutter_app/lib/src/android_app_installer_io.dart +122 -0
- package/flutter_app/lib/src/android_app_installer_stub.dart +21 -0
- package/flutter_app/lib/src/android_auto_bridge.dart +59 -0
- package/flutter_app/lib/src/android_launcher_bridge.dart +239 -0
- package/flutter_app/lib/src/app_launch_bridge.dart +29 -0
- package/flutter_app/lib/src/app_release_updater.dart +511 -0
- package/flutter_app/lib/src/backend_client.dart +1841 -0
- package/flutter_app/lib/src/desktop_companion.dart +2 -0
- package/flutter_app/lib/src/desktop_companion_actions.dart +586 -0
- package/flutter_app/lib/src/desktop_companion_io.dart +538 -0
- package/flutter_app/lib/src/desktop_companion_stub.dart +59 -0
- package/flutter_app/lib/src/desktop_native_bridge.dart +91 -0
- package/flutter_app/lib/src/desktop_screen_capture.dart +21 -0
- package/flutter_app/lib/src/desktop_screen_capture_io.dart +142 -0
- package/flutter_app/lib/src/desktop_screen_capture_stub.dart +12 -0
- package/flutter_app/lib/src/diagnostics_logger.dart +119 -0
- package/flutter_app/lib/src/health_bridge.dart +136 -0
- package/flutter_app/lib/src/live_voice_capture.dart +85 -0
- package/flutter_app/lib/src/messaging_access_summary.dart +46 -0
- package/flutter_app/lib/src/network/app_http_client.dart +53 -0
- package/flutter_app/lib/src/network/app_http_client_factory.dart +6 -0
- package/flutter_app/lib/src/network/app_http_client_io.dart +138 -0
- package/flutter_app/lib/src/network/app_http_client_stub.dart +3 -0
- package/flutter_app/lib/src/network/app_http_client_web.dart +94 -0
- package/flutter_app/lib/src/oauth_launcher.dart +33 -0
- package/flutter_app/lib/src/oauth_launcher_io.dart +95 -0
- package/flutter_app/lib/src/oauth_launcher_stub.dart +33 -0
- package/flutter_app/lib/src/oauth_launcher_web.dart +107 -0
- package/flutter_app/lib/src/recording_bridge.dart +232 -0
- package/flutter_app/lib/src/recording_bridge_io.dart +1019 -0
- package/flutter_app/lib/src/recording_bridge_stub.dart +120 -0
- package/flutter_app/lib/src/recording_bridge_web.dart +689 -0
- package/flutter_app/lib/src/recording_payloads.dart +86 -0
- package/flutter_app/lib/src/theme/palette.dart +81 -0
- package/flutter_app/lib/src/web_app_update_monitor.dart +17 -0
- package/flutter_app/lib/src/web_app_update_monitor_stub.dart +24 -0
- package/flutter_app/lib/src/web_app_update_monitor_web.dart +123 -0
- package/flutter_app/lib/src/widget_bridge.dart +49 -0
- package/flutter_app/linux/CMakeLists.txt +128 -0
- package/flutter_app/linux/flutter/CMakeLists.txt +88 -0
- package/flutter_app/linux/flutter/generated_plugin_registrant.cc +47 -0
- package/flutter_app/linux/flutter/generated_plugin_registrant.h +15 -0
- package/flutter_app/linux/flutter/generated_plugins.cmake +32 -0
- package/flutter_app/linux/runner/CMakeLists.txt +26 -0
- package/flutter_app/linux/runner/main.cc +6 -0
- package/flutter_app/linux/runner/my_application.cc +144 -0
- package/flutter_app/linux/runner/my_application.h +18 -0
- package/flutter_app/linux/runner/resources/app_icon.png +0 -0
- package/flutter_app/macos/Flutter/Flutter-Debug.xcconfig +2 -0
- package/flutter_app/macos/Flutter/Flutter-Release.xcconfig +2 -0
- package/flutter_app/macos/Flutter/GeneratedPluginRegistrant.swift +46 -0
- package/flutter_app/macos/Podfile +42 -0
- package/flutter_app/macos/Podfile.lock +87 -0
- package/flutter_app/macos/Runner/AppDelegate.swift +576 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
- package/flutter_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
- package/flutter_app/macos/Runner/Base.lproj/MainMenu.xib +342 -0
- package/flutter_app/macos/Runner/Configs/AppInfo.xcconfig +14 -0
- package/flutter_app/macos/Runner/Configs/Debug.xcconfig +2 -0
- package/flutter_app/macos/Runner/Configs/Release.xcconfig +2 -0
- package/flutter_app/macos/Runner/Configs/Warnings.xcconfig +13 -0
- package/flutter_app/macos/Runner/DebugProfile.entitlements +16 -0
- package/flutter_app/macos/Runner/Info.plist +36 -0
- package/flutter_app/macos/Runner/MainFlutterWindow.swift +19 -0
- package/flutter_app/macos/Runner/Release.entitlements +12 -0
- package/flutter_app/macos/Runner.xcodeproj/project.pbxproj +801 -0
- package/flutter_app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/flutter_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +99 -0
- package/flutter_app/macos/Runner.xcworkspace/contents.xcworkspacedata +10 -0
- package/flutter_app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/flutter_app/macos/RunnerTests/RunnerTests.swift +12 -0
- package/flutter_app/patch_strings.py +12 -0
- package/flutter_app/pubspec.lock +1232 -0
- package/flutter_app/pubspec.yaml +58 -0
- package/flutter_app/third_party/desktop_audio_capture/LICENSE +21 -0
- package/flutter_app/third_party/desktop_audio_capture/README.md +262 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/audio_capture.dart +65 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/config/mic_audio_config.dart +153 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/config/system_adudio_config.dart +110 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/mic/mic_audio_capture.dart +461 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/model/audio_status.dart +91 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/model/decibel_data.dart +106 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/model/input_device_type.dart +219 -0
- package/flutter_app/third_party/desktop_audio_capture/lib/system/system_audio_capture.dart +336 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/CMakeLists.txt +101 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/audio_capture_plugin.cc +692 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/audio_capture_plugin.h +35 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/include/audio_capture/mic_capture_plugin.h +36 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/audio_capture_plugin.h +32 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/include/desktop_audio_capture/mic_capture_plugin.h +32 -0
- package/flutter_app/third_party/desktop_audio_capture/linux/mic_capture_plugin.cc +878 -0
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/AudioCapturePlugin.swift +27 -0
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/MicCapturePlugin.swift +1172 -0
- package/flutter_app/third_party/desktop_audio_capture/macos/Classes/SystemCapturePlugin.swift +655 -0
- package/flutter_app/third_party/desktop_audio_capture/macos/Resources/PrivacyInfo.xcprivacy +12 -0
- package/flutter_app/third_party/desktop_audio_capture/macos/desktop_audio_capture.podspec +30 -0
- package/flutter_app/third_party/desktop_audio_capture/pubspec.yaml +87 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/CMakeLists.txt +105 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.cpp +80 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin.h +31 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/audio_capture_plugin_c_api.cpp +12 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/include/audio_capture/audio_capture_plugin_c_api.h +23 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/include/desktop_audio_capture/audio_capture_plugin.h +25 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.cpp +1117 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/mic_capture_plugin.h +115 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.cpp +777 -0
- package/flutter_app/third_party/desktop_audio_capture/windows/system_audio_capture_plugin.h +87 -0
- package/flutter_app/third_party/flutter_secure_storage_linux/linux/CMakeLists.txt +30 -0
- package/flutter_app/third_party/flutter_secure_storage_linux/linux/flutter_secure_storage_linux_plugin.cc +215 -0
- package/flutter_app/third_party/flutter_secure_storage_linux/linux/include/flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h +27 -0
- package/flutter_app/third_party/flutter_secure_storage_linux/pubspec.yaml +20 -0
- package/flutter_app/tool/generate_desktop_branding.py +219 -0
- package/flutter_app/web/favicon.png +0 -0
- package/flutter_app/web/favicon.svg +12 -0
- package/flutter_app/web/icons/Icon-192.png +0 -0
- package/flutter_app/web/icons/Icon-512.png +0 -0
- package/flutter_app/web/icons/Icon-maskable-192.png +0 -0
- package/flutter_app/web/icons/Icon-maskable-512.png +0 -0
- package/flutter_app/web/index.html +40 -0
- package/flutter_app/web/manifest.json +35 -0
- package/flutter_app/windows/CMakeLists.txt +108 -0
- package/flutter_app/windows/flutter/CMakeLists.txt +109 -0
- package/flutter_app/windows/flutter/generated_plugin_registrant.cc +50 -0
- package/flutter_app/windows/flutter/generated_plugin_registrant.h +15 -0
- package/flutter_app/windows/flutter/generated_plugins.cmake +36 -0
- package/flutter_app/windows/runner/CMakeLists.txt +41 -0
- package/flutter_app/windows/runner/Runner.rc +121 -0
- package/flutter_app/windows/runner/flutter_window.cpp +533 -0
- package/flutter_app/windows/runner/flutter_window.h +37 -0
- package/flutter_app/windows/runner/main.cpp +53 -0
- package/flutter_app/windows/runner/resource.h +16 -0
- package/flutter_app/windows/runner/resources/app_icon.ico +0 -0
- package/flutter_app/windows/runner/runner.exe.manifest +14 -0
- package/flutter_app/windows/runner/utils.cpp +65 -0
- package/flutter_app/windows/runner/utils.h +19 -0
- package/flutter_app/windows/runner/win32_window.cpp +299 -0
- package/flutter_app/windows/runner/win32_window.h +102 -0
- package/lib/install_helpers.js +31 -0
- package/lib/manager.js +214 -7
- package/package.json +10 -5
- package/runtime/paths.js +136 -0
- package/server/config/analytics.js +30 -0
- package/server/db/database.js +167 -2
- package/server/guest_agent.js +15 -0
- package/server/http/middleware.js +5 -2
- package/server/http/routes.js +2 -0
- package/server/http/static.js +41 -1
- package/server/index.js +4 -14
- package/server/public/.last_build_id +1 -1
- package/server/public/assets/AssetManifest.bin +1 -1
- package/server/public/assets/AssetManifest.bin.json +1 -1
- package/server/public/assets/AssetManifest.json +1 -1
- package/server/public/assets/NOTICES +464 -1
- package/server/public/assets/assets/branding/onboarding_intro.mp4 +0 -0
- package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
- package/server/public/assets/packages/mixpanel_flutter/assets/mixpanel.js +3 -0
- package/server/public/canvaskit/wimp.wasm +0 -0
- package/server/public/flutter_bootstrap.js +2 -2
- package/server/public/index.html +1 -0
- package/server/public/main.dart.js +91177 -85587
- package/server/routes/agents.js +2 -1
- package/server/routes/android.js +1 -5
- package/server/routes/auth.js +26 -5
- package/server/routes/browser.js +1 -14
- package/server/routes/integrations.js +22 -1
- package/server/routes/memory.js +75 -3
- package/server/routes/runtime.js +14 -0
- package/server/routes/settings.js +85 -7
- package/server/routes/wearable.js +67 -0
- package/server/routes/widgets.js +4 -4
- package/server/services/ai/capabilityHealth.js +16 -35
- package/server/services/ai/deliverables/artifact_helpers.js +190 -0
- package/server/services/ai/deliverables/contracts.js +113 -0
- package/server/services/ai/deliverables/index.js +20 -0
- package/server/services/ai/deliverables/selector.js +94 -0
- package/server/services/ai/deliverables/validator.js +63 -0
- package/server/services/ai/deliverables/workflows.js +207 -0
- package/server/services/ai/engine.js +271 -8
- package/server/services/ai/integrated_tools/index.js +98 -0
- package/server/services/ai/integrated_tools/remotion.js +373 -0
- package/server/services/ai/integrated_tools/shared.js +204 -0
- package/server/services/ai/integrated_tools/slidev.js +207 -0
- package/server/services/ai/models.js +31 -37
- package/server/services/ai/providers/githubCopilot.js +97 -0
- package/server/services/ai/providers/openai.js +2 -1
- package/server/services/ai/providers/openaiCodex.js +31 -0
- package/server/services/ai/runEvents.js +100 -0
- package/server/services/ai/settings.js +20 -20
- package/server/services/ai/systemPrompt.js +6 -0
- package/server/services/ai/toolRunner.js +34 -6
- package/server/services/ai/toolSelector.js +54 -1
- package/server/services/ai/tools.js +150 -116
- package/server/services/cli/executor.js +4 -0
- package/server/services/desktop/screenRecorder.js +65 -9
- package/server/services/integrations/figma/provider.js +1 -0
- package/server/services/integrations/github/provider.js +3 -3
- package/server/services/integrations/google/provider.js +1 -0
- package/server/services/integrations/manager.js +25 -5
- package/server/services/integrations/microsoft/provider.js +1 -0
- package/server/services/integrations/oauth_provider.js +15 -5
- package/server/services/integrations/provider_config_store.js +22 -13
- package/server/services/integrations/registry.js +2 -4
- package/server/services/integrations/spotify/provider.js +1 -0
- package/server/services/integrations/trello/provider.js +842 -0
- package/server/services/manager.js +73 -155
- package/server/services/mcp/client.js +120 -23
- package/server/services/memory/manager.js +242 -26
- package/server/services/messaging/access_policy.js +10 -0
- package/server/services/messaging/manager.js +49 -0
- package/server/services/messaging/meshtastic.js +277 -0
- package/server/services/messaging/meshtastic_env.js +40 -0
- package/server/services/messaging/meshtastic_protocol.js +530 -0
- package/server/services/messaging/meshtastic_tcp_transport.js +25 -0
- package/server/services/runtime/backends/local-vm.js +20 -0
- package/server/services/runtime/manager.js +15 -23
- package/server/services/runtime/qemu.js +71 -20
- package/server/services/runtime/settings.js +6 -12
- package/server/services/runtime/validation.js +10 -1
- package/server/services/tasks/runtime.js +1 -1
- package/server/services/voice/openaiSpeech.js +6 -1
- package/server/services/voice/providers.js +142 -14
- package/server/services/voice/runtimeManager.js +156 -19
- package/server/services/voice/turnRunner.js +29 -9
- package/server/services/wearable/firmware_manifest.js +353 -0
- package/server/services/wearable/gateway.js +350 -0
- package/server/services/wearable/protocol.js +45 -0
- package/server/services/wearable/service.js +240 -0
- package/server/services/websocket.js +3 -1
- package/server/services/widgets/focus_widget.js +137 -0
- package/server/services/widgets/service.js +133 -2
- package/server/services/workspace/manager.js +301 -0
- package/server/utils/deployment.js +4 -3
- package/server/services/ai/providers/codex.js +0 -244
- package/server/services/ai/providers/copilot.js +0 -457
- package/server/services/integrations/codex/provider.js +0 -281
- package/server/services/integrations/home_assistant/provider.js +0 -630
- package/server/services/messaging/access_policy.test.js +0 -228
- package/server/services/runtime/backends/host.js +0 -37
package/.env.example
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
PORT=3333
|
|
6
6
|
NODE_ENV=production
|
|
7
|
-
|
|
7
|
+
# Auto-generated on first start or setup if left blank.
|
|
8
|
+
SESSION_SECRET=
|
|
8
9
|
|
|
9
10
|
# Optional: dedicated key for encrypting local at-rest secrets (for example API_KEYS.json).
|
|
10
11
|
# If unset, encryption falls back to SESSION_SECRET.
|
|
@@ -23,7 +24,7 @@ NEOAGENT_DEPLOYMENT_MODE=self_hosted
|
|
|
23
24
|
# Deployment profile:
|
|
24
25
|
# private -> single-user / trusted host runtime
|
|
25
26
|
# prod -> multi-user / isolated per-user VM runtime
|
|
26
|
-
NEOAGENT_PROFILE=
|
|
27
|
+
NEOAGENT_PROFILE=prod
|
|
27
28
|
|
|
28
29
|
# VM runtime settings used by `prod`.
|
|
29
30
|
# Set these before switching NEOAGENT_PROFILE=prod.
|
|
@@ -38,9 +39,8 @@ NEOAGENT_VM_BASE_IMAGE=
|
|
|
38
39
|
|
|
39
40
|
# The guest image must boot a Linux guest that runs `npm run start:guest-agent`
|
|
40
41
|
# and exposes the guest agent on port 8421.
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
NEOAGENT_VM_GUEST_TOKEN=change-this-guest-token-before-prod
|
|
42
|
+
# Auto-generated on first start or setup if left blank.
|
|
43
|
+
NEOAGENT_VM_GUEST_TOKEN=
|
|
44
44
|
NEOAGENT_VM_MEMORY_MB=4096
|
|
45
45
|
NEOAGENT_VM_CPUS=2
|
|
46
46
|
|
|
@@ -51,6 +51,15 @@ NEOAGENT_RELEASE_CHANNEL=stable
|
|
|
51
51
|
# Example: http://localhost:3333,https://yourdomain.com
|
|
52
52
|
ALLOWED_ORIGINS=
|
|
53
53
|
|
|
54
|
+
########################################
|
|
55
|
+
# Analytics
|
|
56
|
+
########################################
|
|
57
|
+
|
|
58
|
+
# Mixpanel project token used by the Flutter app.
|
|
59
|
+
# Leave this blank to disable analytics, or set your own public project token.
|
|
60
|
+
# Keep the token below if you want to support the development of NeoAgent with anonymous usage analytics.
|
|
61
|
+
NEOAGENT_MIXPANEL_TOKEN=4a47ae6a05cf39a8faf0438a1200dde6
|
|
62
|
+
|
|
54
63
|
########################################
|
|
55
64
|
# Service email
|
|
56
65
|
########################################
|
|
@@ -98,6 +107,18 @@ GOOGLE_AI_KEY=your-google-ai-key-here
|
|
|
98
107
|
# • MiniMax-M2.7 via the Anthropic-compatible MiniMax endpoint
|
|
99
108
|
MINIMAX_API_KEY=your-minimax-api-key-here
|
|
100
109
|
|
|
110
|
+
# GitHub Copilot OAuth token — used for:
|
|
111
|
+
# • Copilot-backed chat/coding models (gpt-5.3, gpt-4.1)
|
|
112
|
+
# Set via: neoagent login github-copilot
|
|
113
|
+
GITHUB_COPILOT_ACCESS_TOKEN=
|
|
114
|
+
|
|
115
|
+
# OpenAI Codex OAuth token — used for:
|
|
116
|
+
# • Codex-backed chat/coding models (gpt-5.3-codex, gpt-4.1-codex)
|
|
117
|
+
# Set via: neoagent login openai-codex
|
|
118
|
+
OPENAI_CODEX_ACCESS_TOKEN=
|
|
119
|
+
# Optional refresh token if your login flow returns it.
|
|
120
|
+
OPENAI_CODEX_REFRESH_TOKEN=
|
|
121
|
+
|
|
101
122
|
########################################
|
|
102
123
|
# Provider endpoint overrides
|
|
103
124
|
########################################
|
|
@@ -105,6 +126,10 @@ MINIMAX_API_KEY=your-minimax-api-key-here
|
|
|
105
126
|
# OPENAI_BASE_URL=https://your-openai-compatible-endpoint/v1
|
|
106
127
|
# ANTHROPIC_BASE_URL=https://your-anthropic-compatible-endpoint
|
|
107
128
|
# XAI_BASE_URL=https://api.x.ai/v1
|
|
129
|
+
# OPENAI_CODEX_BASE_URL=https://chatgpt.com/backend-api/codex
|
|
130
|
+
# OPENAI_CODEX_EDITOR_VERSION=vscode/1.99.0
|
|
131
|
+
# OPENAI_CODEX_EDITOR_PLUGIN_VERSION=neoagent/1.0.0
|
|
132
|
+
# OPENAI_CODEX_USER_AGENT=NeoAgent/1.0.0
|
|
108
133
|
|
|
109
134
|
########################################
|
|
110
135
|
# Official integrations
|
|
@@ -152,6 +177,17 @@ GITHUB_OAUTH_CLIENT_ID=your-github-oauth-client-id
|
|
|
152
177
|
GITHUB_OAUTH_CLIENT_SECRET=your-github-oauth-client-secret
|
|
153
178
|
GITHUB_OAUTH_REDIRECT_URI=
|
|
154
179
|
|
|
180
|
+
# Spotify official integration OAuth client.
|
|
181
|
+
# Redirect URI should match <PUBLIC_URL>/api/integrations/oauth/callback.
|
|
182
|
+
SPOTIFY_OAUTH_CLIENT_ID=your-spotify-oauth-client-id
|
|
183
|
+
SPOTIFY_OAUTH_CLIENT_SECRET=your-spotify-oauth-client-secret
|
|
184
|
+
SPOTIFY_OAUTH_REDIRECT_URI=
|
|
185
|
+
|
|
186
|
+
# Trello official integration API key.
|
|
187
|
+
# This is used for Trello account connections in Official Integrations.
|
|
188
|
+
# Users still connect their own Trello account token per agent in the UI.
|
|
189
|
+
TRELLO_API_KEY=your-trello-api-key
|
|
190
|
+
|
|
155
191
|
########################################
|
|
156
192
|
# Tools and media services
|
|
157
193
|
########################################
|
|
@@ -176,8 +212,13 @@ DEEPGRAM_LANGUAGE=multi
|
|
|
176
212
|
|
|
177
213
|
OLLAMA_URL=http://localhost:11434
|
|
178
214
|
|
|
215
|
+
# Local screen OCR capture (macOS desktop context recorder).
|
|
216
|
+
# Set to false to disable background screen capture/OCR polling.
|
|
217
|
+
NEOAGENT_SCREEN_RECORDER_ENABLED=true
|
|
218
|
+
|
|
179
219
|
########################################
|
|
180
220
|
# Messaging and voice integrations
|
|
181
221
|
########################################
|
|
182
222
|
|
|
223
|
+
MESHTASTIC_ENABLED=true
|
|
183
224
|
TELNYX_WEBHOOK_TOKEN=
|
package/docs/capabilities.md
CHANGED
|
@@ -75,10 +75,10 @@ The agent tool `read_health_data` returns summaries and recent samples. It is de
|
|
|
75
75
|
|
|
76
76
|
NeoAgent has two separate integration layers:
|
|
77
77
|
|
|
78
|
-
- Official integrations expose structured tools for Google Workspace, Microsoft 365, Notion, Slack, Figma, Home Assistant, Weather, Spotify, and a separate personal WhatsApp connection.
|
|
78
|
+
- Official integrations expose structured tools for Google Workspace, Microsoft 365, Notion, Slack, Figma, Home Assistant, Trello, Weather, Spotify, and a separate personal WhatsApp connection.
|
|
79
79
|
- Messaging platforms let the agent talk through WhatsApp, Telegram, Discord, Slack, Google Chat, Teams, Matrix, Signal, iMessage/BlueBubbles, IRC, Twitch, LINE, Mattermost, configurable webhook bridges, and Telnyx Voice.
|
|
80
80
|
|
|
81
|
-
Official integration examples include Gmail thread search and send mail, Google Calendar events, Drive upload/download/export/share links, Docs create/append/replace, Sheets read/update/append/create, Microsoft Outlook/Calendar/OneDrive/Teams tools, Notion search/page/block/database tools, Slack conversation/message tools, Figma file/node/comment/image tools, Home Assistant entity/config reads and service calls, Weather current/forecast tools plus weather-event task triggers, Spotify playback/search/control tools, and a personal WhatsApp integration with isolated chat read/send tools and per-account read-only versus read/write access.
|
|
81
|
+
Official integration examples include Gmail thread search and send mail, Google Calendar events, Drive upload/download/export/share links, Docs create/append/replace, Sheets read/update/append/create, Microsoft Outlook/Calendar/OneDrive/Teams tools, Notion search/page/block/database tools, Slack conversation/message tools, Figma file/node/comment/image tools, Home Assistant entity/config reads and service calls, Trello board/list/card/comment/search tools, Weather current/forecast tools plus weather-event task triggers, Spotify playback/search/control tools, and a personal WhatsApp integration with isolated chat read/send tools and per-account read-only versus read/write access.
|
|
82
82
|
|
|
83
83
|
Messaging examples include Telegram and Discord messages, Slack channel replies, Matrix room messages, Google Chat and Teams webhook delivery, Signal bridge delivery, iMessage/BlueBubbles sends, WhatsApp text and media sends, Telnyx inbound voice, Telnyx outbound calls, and scheduled-task call delivery.
|
|
84
84
|
|
|
@@ -112,7 +112,7 @@ Runtime settings let operators choose where higher-risk work runs:
|
|
|
112
112
|
|
|
113
113
|
| Profile | Runtime shape |
|
|
114
114
|
|---|---|
|
|
115
|
-
| `trusted-host` | CLI
|
|
115
|
+
| `trusted-host` | CLI and Android tools run on the host; browser runs in the VM or paired extension |
|
|
116
116
|
| `secure-vm` | CLI, browser, and Android tools run through the local VM backend |
|
|
117
117
|
|
|
118
118
|
Production policy can require the secure VM profile and a strong VM guest token.
|
package/docs/configuration.md
CHANGED
|
@@ -18,6 +18,17 @@ AI provider credentials, OAuth client secrets, and deployment controls are not c
|
|
|
18
18
|
| `NEOAGENT_DEPLOYMENT_MODE` | `self_hosted` | `self_hosted` enables in-app update controls; `managed` hides operator-only controls for SaaS deployments. |
|
|
19
19
|
| `NEOAGENT_RELEASE_CHANNEL` | `stable` | Release track used by the self-hosted updater. |
|
|
20
20
|
|
|
21
|
+
## Analytics
|
|
22
|
+
|
|
23
|
+
NeoAgent can send anonymous Mixpanel usage events from the Flutter client. The events cover app startup, section navigation, auth success, backend setup, onboarding dismissal, chat sends, recording start/stop, task runs, update checks, and update triggers. They do not include message content, credentials, or other app data.
|
|
24
|
+
|
|
25
|
+
Set `NEOAGENT_MIXPANEL_TOKEN` to your own public Mixpanel project token to enable analytics. Leave it blank to disable analytics entirely.
|
|
26
|
+
When analytics is enabled, the web client shows a dismissible cookie-consent banner until the user accepts or declines.
|
|
27
|
+
|
|
28
|
+
| Variable | Default | Description |
|
|
29
|
+
|---|---:|---|
|
|
30
|
+
| `NEOAGENT_MIXPANEL_TOKEN` | optional | Public Mixpanel project token used by the Flutter client. |
|
|
31
|
+
|
|
21
32
|
## Service Email
|
|
22
33
|
|
|
23
34
|
Service email is optional. When `NEOAGENT_EMAIL_FROM` and `NEOAGENT_EMAIL_SMTP_HOST` are set, NeoAgent uses SMTP for account security flows: signup confirmation, password reset, unusual login notifications, password change notifications, and email change notifications. Confirmation and reset links use the same `PUBLIC_URL` base as the other server-generated links.
|
|
@@ -68,7 +79,7 @@ Recording insight generation is controlled in app AI settings with `auto_recordi
|
|
|
68
79
|
|
|
69
80
|
## Official Integrations
|
|
70
81
|
|
|
71
|
-
Official integrations use OAuth or provider-native account linking and expose structured tools to the agent. The built-in registry currently covers Google Workspace, Notion, Microsoft 365, Slack, Figma, Home Assistant, Weather, Spotify, and personal WhatsApp.
|
|
82
|
+
Official integrations use OAuth or provider-native account linking and expose structured tools to the agent. The built-in registry currently covers Google Workspace, Notion, Microsoft 365, Slack, Figma, Home Assistant, Trello, Weather, Spotify, and personal WhatsApp.
|
|
72
83
|
|
|
73
84
|
All OAuth callbacks default to `PUBLIC_URL + /api/integrations/oauth/callback` unless you set a provider-specific redirect URI.
|
|
74
85
|
|
|
@@ -90,17 +101,14 @@ All OAuth callbacks default to `PUBLIC_URL + /api/integrations/oauth/callback` u
|
|
|
90
101
|
| `FIGMA_OAUTH_CLIENT_ID` | Figma OAuth client ID |
|
|
91
102
|
| `FIGMA_OAUTH_CLIENT_SECRET` | Figma OAuth client secret |
|
|
92
103
|
| `FIGMA_OAUTH_REDIRECT_URI` | Optional Figma OAuth callback URL |
|
|
93
|
-
| `
|
|
94
|
-
| `HOME_ASSISTANT_OAUTH_CLIENT_ID` | Optional fallback Home Assistant OAuth client ID. |
|
|
95
|
-
| `HOME_ASSISTANT_OAUTH_CLIENT_SECRET` | Optional fallback Home Assistant OAuth client secret. |
|
|
96
|
-
| `HOME_ASSISTANT_OAUTH_REDIRECT_URI` | Optional fallback Home Assistant OAuth callback URL. |
|
|
97
|
-
| `HOME_ASSISTANT_ALLOW_PRIVATE_BASE_URL` | Optional safety override. Set to `1` only if you intentionally allow Home Assistant base URLs on localhost/private networks. |
|
|
104
|
+
| `TRELLO_API_KEY` | Optional Trello Power-Up API key. If set, users only need to provide their personal token in Official Integrations. |
|
|
98
105
|
| `SPOTIFY_OAUTH_CLIENT_ID` | Spotify OAuth client ID |
|
|
99
106
|
| `SPOTIFY_OAUTH_CLIENT_SECRET` | Spotify OAuth client secret |
|
|
100
107
|
| `SPOTIFY_OAUTH_REDIRECT_URI` | Optional Spotify OAuth callback URL |
|
|
101
108
|
|
|
102
|
-
Home Assistant no longer
|
|
103
|
-
|
|
109
|
+
Home Assistant and Trello no longer require server-side setup. Each user can open Official Integrations and enter their own provider-specific credentials in the Flutter UI.
|
|
110
|
+
|
|
111
|
+
Trello integration is flexible: users can provide both API key and token in the UI, or if `TRELLO_API_KEY` is set as a server environment variable, users only need to authenticate with their personal token. Tokens are stored securely per user and are never added to server environment variables.
|
|
104
112
|
|
|
105
113
|
Weather integration uses Open-Meteo public endpoints and does not require OAuth environment variables.
|
|
106
114
|
|
|
@@ -122,11 +130,11 @@ Telnyx webhook verification is configured through the environment.
|
|
|
122
130
|
|
|
123
131
|
## Runtime Isolation
|
|
124
132
|
|
|
125
|
-
Runtime profile and backend selection are stored in user settings, not normally in `.env`. The main profiles are `trusted-host` and `secure-vm`.
|
|
133
|
+
Runtime profile and backend selection are stored in user settings, not normally in `.env`. The main profiles are `trusted-host` and `secure-vm`. CLI and Android tools may still follow the selected runtime profile, but browser control is always isolated: the non-extension browser backend runs in the VM, not on the host device.
|
|
126
134
|
|
|
127
135
|
Production policy can require the VM backend. In that case, set a strong `NEOAGENT_VM_GUEST_TOKEN` of at least 32 characters and avoid placeholder values.
|
|
128
136
|
|
|
129
|
-
The app exposes two browser backend choices:
|
|
137
|
+
The app exposes two browser backend choices: VM and Chrome extension. VM uses the local isolated runtime. Chrome extension uses the paired extension connection on the remote machine instead of the server-local browser. To install only the extension on a remote machine, open NeoAgent, download `/api/browser-extension/download`, unzip it, load the folder through `chrome://extensions` with Developer mode enabled, then pair after logging in to NeoAgent. Unpacked Chrome extensions cannot replace themselves automatically; use the extension popup's update check to compare against the server bundle, then download and reload the latest ZIP when needed.
|
|
130
138
|
|
|
131
139
|
## Secrets Guidance
|
|
132
140
|
|
package/docs/hardware.md
CHANGED
|
@@ -5,4 +5,4 @@ sidebar_label: Hardware
|
|
|
5
5
|
|
|
6
6
|
# Hardware
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
NeoAgent includes a dedicated ESP-IDF wearable firmware target under `firmware/neoagent_wearable_esp32s3_amoled` for the Waveshare ESP32-S3 Touch AMOLED 1.8 board.
|
package/docs/integrations.md
CHANGED
|
@@ -14,12 +14,11 @@ The built-in registry includes:
|
|
|
14
14
|
| Slack | Conversations, history, posting, search, user info, and Slack Web API requests |
|
|
15
15
|
| Figma | Current user, files, nodes, rendered images, comments, and Figma REST requests |
|
|
16
16
|
| Home Assistant | Entity/config reads, service calls, and Home Assistant REST API requests |
|
|
17
|
+
| Trello | Boards, lists, cards, comments, search, and Trello REST API requests |
|
|
17
18
|
| Weather | Keyless Open-Meteo current weather and forecast tools |
|
|
18
19
|
| Spotify | Playback state, recently played, search, and playback controls |
|
|
19
20
|
|
|
20
|
-
OAuth app credentials are configured through server environment variables for most providers. Home Assistant can also be configured per-user in the Flutter **Integrations** UI without any server-side setup. Account connections are created in the Flutter UI under **Integrations**. Connected tools are exposed to the agent as structured tools, so prefer them over browser automation when they can do the job.
|
|
21
|
-
|
|
22
|
-
Weather note: the Weather integration uses Open-Meteo public APIs and does not require OAuth client credentials.
|
|
21
|
+
OAuth app credentials are configured through server environment variables for most providers. Home Assistant and Trello can also be configured per-user in the Flutter **Integrations** UI without any server-side setup. Account connections are created in the Flutter UI under **Integrations**. Connected tools are exposed to the agent as structured tools, so prefer them over browser automation when they can do the job.
|
|
23
22
|
|
|
24
23
|
### Per-Account Access Mode
|
|
25
24
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# This file tracks properties of this Flutter project.
|
|
2
|
+
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
|
3
|
+
#
|
|
4
|
+
# This file should be version controlled and should not be manually edited.
|
|
5
|
+
|
|
6
|
+
version:
|
|
7
|
+
revision: "ac4e799d237041cf905519190471f657b657155a"
|
|
8
|
+
channel: "stable"
|
|
9
|
+
|
|
10
|
+
project_type: app
|
|
11
|
+
|
|
12
|
+
# Tracks metadata for the flutter migrate command
|
|
13
|
+
migration:
|
|
14
|
+
platforms:
|
|
15
|
+
- platform: root
|
|
16
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
17
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
18
|
+
- platform: android
|
|
19
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
20
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
21
|
+
- platform: linux
|
|
22
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
23
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
24
|
+
- platform: macos
|
|
25
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
26
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
27
|
+
- platform: web
|
|
28
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
29
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
30
|
+
- platform: windows
|
|
31
|
+
create_revision: ac4e799d237041cf905519190471f657b657155a
|
|
32
|
+
base_revision: ac4e799d237041cf905519190471f657b657155a
|
|
33
|
+
|
|
34
|
+
# User provided section
|
|
35
|
+
|
|
36
|
+
# List of Local paths (relative to this file) that should be
|
|
37
|
+
# ignored by the migrate tool.
|
|
38
|
+
#
|
|
39
|
+
# Files that are not part of the templates will be ignored by default.
|
|
40
|
+
unmanaged_files:
|
|
41
|
+
- 'lib/main.dart'
|
|
42
|
+
- 'ios/Runner.xcodeproj/project.pbxproj'
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# neoagent_flutter
|
|
2
|
+
|
|
3
|
+
A new Flutter project.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
This project is a starting point for a Flutter application.
|
|
8
|
+
|
|
9
|
+
A few resources to get you started if this is your first Flutter project:
|
|
10
|
+
|
|
11
|
+
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
|
12
|
+
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
|
13
|
+
|
|
14
|
+
For help getting started with Flutter development, view the
|
|
15
|
+
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
|
16
|
+
samples, guidance on mobile development, and a full API reference.
|
|
17
|
+
|
|
18
|
+
## Desktop audio capture note
|
|
19
|
+
|
|
20
|
+
Desktop recording currently depends on `desktop_audio_capture` and is pinned to
|
|
21
|
+
`0.0.2` to avoid unexpected API shifts from automatic minor updates.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# This file configures the analyzer, which statically analyzes Dart code to
|
|
2
|
+
# check for errors, warnings, and lints.
|
|
3
|
+
#
|
|
4
|
+
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
|
5
|
+
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
|
6
|
+
# invoked from the command line by running `flutter analyze`.
|
|
7
|
+
|
|
8
|
+
# The following line activates a set of recommended lints for Flutter apps,
|
|
9
|
+
# packages, and plugins designed to encourage good coding practices.
|
|
10
|
+
include: package:flutter_lints/flutter.yaml
|
|
11
|
+
|
|
12
|
+
analyzer:
|
|
13
|
+
exclude:
|
|
14
|
+
- third_party/**
|
|
15
|
+
|
|
16
|
+
linter:
|
|
17
|
+
# The lint rules applied to this project can be customized in the
|
|
18
|
+
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
|
19
|
+
# included above or to enable additional rules. A list of all available lints
|
|
20
|
+
# and their documentation is published at https://dart.dev/lints.
|
|
21
|
+
#
|
|
22
|
+
# Instead of disabling a lint rule for the entire project in the
|
|
23
|
+
# section below, it can also be suppressed for a single line of code
|
|
24
|
+
# or a specific dart file by using the `// ignore: name_of_lint` and
|
|
25
|
+
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
|
26
|
+
# producing the lint.
|
|
27
|
+
rules:
|
|
28
|
+
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
|
29
|
+
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
|
30
|
+
|
|
31
|
+
# Additional information about this file can be found at
|
|
32
|
+
# https://dart.dev/guides/language/analysis-options
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import java.util.Properties
|
|
2
|
+
|
|
3
|
+
plugins {
|
|
4
|
+
id("com.android.application")
|
|
5
|
+
id("kotlin-android")
|
|
6
|
+
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
|
7
|
+
id("dev.flutter.flutter-gradle-plugin")
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
val envReleaseKeystorePath = System.getenv("ANDROID_KEYSTORE_PATH")?.trim().orEmpty()
|
|
11
|
+
val envReleaseKeystorePassword = System.getenv("ANDROID_KEYSTORE_PASSWORD")?.trim().orEmpty()
|
|
12
|
+
val envReleaseKeyAlias = System.getenv("ANDROID_KEY_ALIAS")?.trim().orEmpty()
|
|
13
|
+
val envReleaseKeyPassword = System.getenv("ANDROID_KEY_PASSWORD")?.trim().orEmpty()
|
|
14
|
+
val keyPropertiesFile = rootProject.file("key.properties")
|
|
15
|
+
val keyProperties = Properties()
|
|
16
|
+
if (keyPropertiesFile.exists()) {
|
|
17
|
+
keyPropertiesFile.inputStream().use(keyProperties::load)
|
|
18
|
+
}
|
|
19
|
+
val repoReleaseKeystorePath = keyProperties.getProperty("storeFile", "").trim()
|
|
20
|
+
val repoReleaseKeystorePassword = keyProperties.getProperty("storePassword", "").trim()
|
|
21
|
+
val repoReleaseKeyAlias = keyProperties.getProperty("keyAlias", "").trim()
|
|
22
|
+
val repoReleaseKeyPassword = keyProperties.getProperty("keyPassword", "").trim()
|
|
23
|
+
val hasEnvReleaseSigning =
|
|
24
|
+
envReleaseKeystorePath.isNotEmpty() &&
|
|
25
|
+
envReleaseKeystorePassword.isNotEmpty() &&
|
|
26
|
+
envReleaseKeyAlias.isNotEmpty() &&
|
|
27
|
+
envReleaseKeyPassword.isNotEmpty()
|
|
28
|
+
val hasRepoReleaseSigning =
|
|
29
|
+
repoReleaseKeystorePath.isNotEmpty() &&
|
|
30
|
+
repoReleaseKeystorePassword.isNotEmpty() &&
|
|
31
|
+
repoReleaseKeyAlias.isNotEmpty() &&
|
|
32
|
+
repoReleaseKeyPassword.isNotEmpty()
|
|
33
|
+
val launcherBuild =
|
|
34
|
+
System.getenv("NEOAGENT_ANDROID_LAUNCHER_MODE")
|
|
35
|
+
?.trim()
|
|
36
|
+
?.lowercase() in setOf("1", "true", "yes", "on")
|
|
37
|
+
val applicationIdValue =
|
|
38
|
+
if (launcherBuild) "com.neoagent.flutter_app.launcher" else "com.neoagent.flutter_app"
|
|
39
|
+
val applicationLabelValue = if (launcherBuild) "NeoAgent Launcher" else "NeoAgent"
|
|
40
|
+
val androidAppModeValue = if (launcherBuild) "launcher" else "standard"
|
|
41
|
+
val launcherHomeEnabledValue = launcherBuild.toString()
|
|
42
|
+
|
|
43
|
+
android {
|
|
44
|
+
namespace = "com.neoagent.flutter_app"
|
|
45
|
+
compileSdk = flutter.compileSdkVersion
|
|
46
|
+
ndkVersion = flutter.ndkVersion
|
|
47
|
+
|
|
48
|
+
compileOptions {
|
|
49
|
+
sourceCompatibility = JavaVersion.VERSION_11
|
|
50
|
+
targetCompatibility = JavaVersion.VERSION_11
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
kotlinOptions {
|
|
54
|
+
jvmTarget = JavaVersion.VERSION_11.toString()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
defaultConfig {
|
|
58
|
+
applicationId = applicationIdValue
|
|
59
|
+
minSdk = 26
|
|
60
|
+
targetSdk = flutter.targetSdkVersion
|
|
61
|
+
versionCode = flutter.versionCode
|
|
62
|
+
versionName = flutter.versionName
|
|
63
|
+
manifestPlaceholders["neoagentAppLabel"] = applicationLabelValue
|
|
64
|
+
manifestPlaceholders["neoagentAppMode"] = androidAppModeValue
|
|
65
|
+
manifestPlaceholders["neoagentLauncherHomeEnabled"] =
|
|
66
|
+
launcherHomeEnabledValue
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
signingConfigs {
|
|
70
|
+
if (hasEnvReleaseSigning) {
|
|
71
|
+
create("release") {
|
|
72
|
+
storeFile = file(envReleaseKeystorePath)
|
|
73
|
+
storePassword = envReleaseKeystorePassword
|
|
74
|
+
keyAlias = envReleaseKeyAlias
|
|
75
|
+
keyPassword = envReleaseKeyPassword
|
|
76
|
+
}
|
|
77
|
+
} else if (hasRepoReleaseSigning) {
|
|
78
|
+
create("release") {
|
|
79
|
+
storeFile = rootProject.file(repoReleaseKeystorePath)
|
|
80
|
+
storePassword = repoReleaseKeystorePassword
|
|
81
|
+
keyAlias = repoReleaseKeyAlias
|
|
82
|
+
keyPassword = repoReleaseKeyPassword
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
buildTypes {
|
|
88
|
+
release {
|
|
89
|
+
signingConfig =
|
|
90
|
+
if (hasEnvReleaseSigning || hasRepoReleaseSigning) {
|
|
91
|
+
signingConfigs.getByName("release")
|
|
92
|
+
} else {
|
|
93
|
+
signingConfigs.getByName("debug")
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
dependencies {
|
|
100
|
+
implementation("androidx.activity:activity-ktx:1.10.1")
|
|
101
|
+
implementation("androidx.car.app:app:1.7.0")
|
|
102
|
+
implementation("androidx.car.app:app-projected:1.7.0")
|
|
103
|
+
implementation("androidx.health.connect:connect-client:1.1.0")
|
|
104
|
+
implementation("androidx.security:security-crypto:1.1.0")
|
|
105
|
+
implementation("androidx.work:work-runtime-ktx:2.10.1")
|
|
106
|
+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
flutter {
|
|
110
|
+
source = "../.."
|
|
111
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
<!-- The INTERNET permission is required for development. Specifically,
|
|
3
|
+
the Flutter tool needs it to communicate with the running application
|
|
4
|
+
to allow setting breakpoints, to provide hot reload, etc.
|
|
5
|
+
-->
|
|
6
|
+
<uses-permission android:name="android.permission.INTERNET"/>
|
|
7
|
+
</manifest>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
xmlns:tools="http://schemas.android.com/tools">
|
|
3
|
+
<uses-permission android:name="android.permission.INTERNET" />
|
|
4
|
+
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
|
|
5
|
+
<uses-permission android:name="android.permission.CAMERA" />
|
|
6
|
+
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
7
|
+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
8
|
+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
9
|
+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
|
10
|
+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
|
|
11
|
+
<uses-permission android:name="android.permission.health.READ_STEPS" />
|
|
12
|
+
<uses-permission android:name="android.permission.health.READ_HEART_RATE" />
|
|
13
|
+
<uses-permission android:name="android.permission.health.READ_SLEEP" />
|
|
14
|
+
<uses-permission android:name="android.permission.health.READ_EXERCISE" />
|
|
15
|
+
<uses-permission android:name="android.permission.health.READ_WEIGHT" />
|
|
16
|
+
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
|
|
17
|
+
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
18
|
+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
19
|
+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
|
20
|
+
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
|
21
|
+
|
|
22
|
+
<queries>
|
|
23
|
+
<package android:name="com.google.android.apps.healthdata" />
|
|
24
|
+
<intent>
|
|
25
|
+
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
|
26
|
+
<data android:mimeType="text/plain"/>
|
|
27
|
+
</intent>
|
|
28
|
+
</queries>
|
|
29
|
+
|
|
30
|
+
<application
|
|
31
|
+
android:label="${neoagentAppLabel}"
|
|
32
|
+
android:name="${applicationName}"
|
|
33
|
+
android:icon="@mipmap/ic_launcher"
|
|
34
|
+
android:usesCleartextTraffic="true">
|
|
35
|
+
<meta-data
|
|
36
|
+
android:name="com.google.android.gms.car.application"
|
|
37
|
+
android:resource="@xml/automotive_app_desc" />
|
|
38
|
+
<activity
|
|
39
|
+
android:name=".MainActivity"
|
|
40
|
+
android:exported="true"
|
|
41
|
+
android:launchMode="singleTop"
|
|
42
|
+
android:taskAffinity=""
|
|
43
|
+
android:theme="@style/LaunchTheme"
|
|
44
|
+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
45
|
+
android:hardwareAccelerated="true"
|
|
46
|
+
android:windowSoftInputMode="adjustResize">
|
|
47
|
+
<!-- Specifies an Android theme to apply to this Activity as soon as
|
|
48
|
+
the Android process has started. This theme is visible to the user
|
|
49
|
+
while the Flutter UI initializes. After that, this theme continues
|
|
50
|
+
to determine the Window background behind the Flutter UI. -->
|
|
51
|
+
<meta-data
|
|
52
|
+
android:name="io.flutter.embedding.android.NormalTheme"
|
|
53
|
+
android:resource="@style/NormalTheme"
|
|
54
|
+
/>
|
|
55
|
+
<intent-filter>
|
|
56
|
+
<action android:name="android.intent.action.MAIN"/>
|
|
57
|
+
<category android:name="android.intent.category.LAUNCHER"/>
|
|
58
|
+
</intent-filter>
|
|
59
|
+
</activity>
|
|
60
|
+
<provider
|
|
61
|
+
android:name="androidx.core.content.FileProvider"
|
|
62
|
+
android:authorities="${applicationId}.fileprovider"
|
|
63
|
+
android:exported="false"
|
|
64
|
+
android:grantUriPermissions="true">
|
|
65
|
+
<meta-data
|
|
66
|
+
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
67
|
+
android:resource="@xml/file_paths" />
|
|
68
|
+
</provider>
|
|
69
|
+
<activity-alias
|
|
70
|
+
android:name=".LauncherHomeAlias"
|
|
71
|
+
android:enabled="${neoagentLauncherHomeEnabled}"
|
|
72
|
+
android:exported="true"
|
|
73
|
+
android:label="${neoagentAppLabel}"
|
|
74
|
+
android:targetActivity=".MainActivity">
|
|
75
|
+
<intent-filter>
|
|
76
|
+
<action android:name="android.intent.action.MAIN" />
|
|
77
|
+
<category android:name="android.intent.category.HOME" />
|
|
78
|
+
<category android:name="android.intent.category.DEFAULT" />
|
|
79
|
+
</intent-filter>
|
|
80
|
+
</activity-alias>
|
|
81
|
+
<activity
|
|
82
|
+
android:name=".health.PermissionsRationaleActivity"
|
|
83
|
+
android:exported="false" />
|
|
84
|
+
<activity
|
|
85
|
+
android:name=".widgets.WidgetConfigActivity"
|
|
86
|
+
android:exported="true"
|
|
87
|
+
android:theme="@style/LaunchTheme" />
|
|
88
|
+
<activity-alias
|
|
89
|
+
android:name=".ViewPermissionUsageActivity"
|
|
90
|
+
android:exported="true"
|
|
91
|
+
android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
|
|
92
|
+
android:targetActivity=".health.PermissionsRationaleActivity">
|
|
93
|
+
<intent-filter>
|
|
94
|
+
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
|
|
95
|
+
<category android:name="android.intent.category.HEALTH_PERMISSIONS" />
|
|
96
|
+
</intent-filter>
|
|
97
|
+
</activity-alias>
|
|
98
|
+
<service
|
|
99
|
+
android:name="androidx.work.impl.foreground.SystemForegroundService"
|
|
100
|
+
android:foregroundServiceType="dataSync"
|
|
101
|
+
tools:node="merge" />
|
|
102
|
+
<service
|
|
103
|
+
android:name=".telecom.NeoAgentConnectionService"
|
|
104
|
+
android:exported="true"
|
|
105
|
+
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
|
|
106
|
+
<intent-filter>
|
|
107
|
+
<action android:name="android.telecom.ConnectionService" />
|
|
108
|
+
</intent-filter>
|
|
109
|
+
</service>
|
|
110
|
+
|
|
111
|
+
<service
|
|
112
|
+
android:name=".auto.NeoAgentCarAppService"
|
|
113
|
+
android:exported="true">
|
|
114
|
+
<intent-filter>
|
|
115
|
+
<action android:name="androidx.car.app.CarAppService" />
|
|
116
|
+
<category android:name="androidx.car.app.category.IOT" />
|
|
117
|
+
</intent-filter>
|
|
118
|
+
<meta-data
|
|
119
|
+
android:name="androidx.car.app.minCarApiLevel"
|
|
120
|
+
android:value="1" />
|
|
121
|
+
</service>
|
|
122
|
+
<service
|
|
123
|
+
android:name=".recording.RecordingForegroundService"
|
|
124
|
+
android:exported="false"
|
|
125
|
+
android:foregroundServiceType="microphone|connectedDevice" />
|
|
126
|
+
<receiver
|
|
127
|
+
android:name=".recording.RecordingBootReceiver"
|
|
128
|
+
android:enabled="true"
|
|
129
|
+
android:exported="false">
|
|
130
|
+
<intent-filter>
|
|
131
|
+
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
|
132
|
+
</intent-filter>
|
|
133
|
+
</receiver>
|
|
134
|
+
<receiver
|
|
135
|
+
android:name=".widgets.AiHomeWidgetProvider"
|
|
136
|
+
android:exported="true">
|
|
137
|
+
<intent-filter>
|
|
138
|
+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
|
139
|
+
</intent-filter>
|
|
140
|
+
<meta-data
|
|
141
|
+
android:name="android.appwidget.provider"
|
|
142
|
+
android:resource="@xml/neoagent_ai_widget_info" />
|
|
143
|
+
</receiver>
|
|
144
|
+
<receiver
|
|
145
|
+
android:name=".widgets.VoiceLaunchWidgetProvider"
|
|
146
|
+
android:exported="true">
|
|
147
|
+
<intent-filter>
|
|
148
|
+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
|
149
|
+
</intent-filter>
|
|
150
|
+
<meta-data
|
|
151
|
+
android:name="android.appwidget.provider"
|
|
152
|
+
android:resource="@xml/neoagent_voice_widget_info" />
|
|
153
|
+
</receiver>
|
|
154
|
+
<meta-data
|
|
155
|
+
android:name="com.neoagent.APP_MODE"
|
|
156
|
+
android:value="${neoagentAppMode}" />
|
|
157
|
+
<meta-data
|
|
158
|
+
android:name="flutterEmbedding"
|
|
159
|
+
android:value="2" />
|
|
160
|
+
|
|
161
|
+
<!-- Notification Listener Service for Interception -->
|
|
162
|
+
<service android:name="notification.listener.service.NotificationListener"
|
|
163
|
+
android:label="NeoAgent Notifications"
|
|
164
|
+
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
|
|
165
|
+
android:exported="true">
|
|
166
|
+
<intent-filter>
|
|
167
|
+
<action android:name="android.service.notification.NotificationListenerService" />
|
|
168
|
+
</intent-filter>
|
|
169
|
+
</service>
|
|
170
|
+
</application>
|
|
171
|
+
</manifest>
|