diff --git a/examples/simple_chat/.metadata b/example/.metadata similarity index 100% rename from examples/simple_chat/.metadata rename to example/.metadata diff --git a/examples/simple_chat/README.md b/example/README.md similarity index 100% rename from examples/simple_chat/README.md rename to example/README.md diff --git a/examples/simple_chat/android/.gitignore b/example/android/.gitignore similarity index 100% rename from examples/simple_chat/android/.gitignore rename to example/android/.gitignore diff --git a/examples/simple_chat/android/app/build.gradle.kts b/example/android/app/build.gradle.kts similarity index 100% rename from examples/simple_chat/android/app/build.gradle.kts rename to example/android/app/build.gradle.kts diff --git a/examples/simple_chat/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from examples/simple_chat/android/app/src/debug/AndroidManifest.xml rename to example/android/app/src/debug/AndroidManifest.xml diff --git a/examples/simple_chat/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml similarity index 100% rename from examples/simple_chat/android/app/src/main/AndroidManifest.xml rename to example/android/app/src/main/AndroidManifest.xml diff --git a/examples/simple_chat/android/app/src/main/kotlin/com/example/simple_chat/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/simple_chat/MainActivity.kt similarity index 100% rename from examples/simple_chat/android/app/src/main/kotlin/com/example/simple_chat/MainActivity.kt rename to example/android/app/src/main/kotlin/com/example/simple_chat/MainActivity.kt diff --git a/examples/simple_chat/android/app/src/main/res/drawable-v21/launch_background.xml b/example/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from examples/simple_chat/android/app/src/main/res/drawable-v21/launch_background.xml rename to example/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/examples/simple_chat/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from examples/simple_chat/android/app/src/main/res/drawable/launch_background.xml rename to example/android/app/src/main/res/drawable/launch_background.xml diff --git a/examples/simple_chat/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from examples/simple_chat/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/examples/simple_chat/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from examples/simple_chat/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/examples/simple_chat/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from examples/simple_chat/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/examples/simple_chat/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from examples/simple_chat/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/examples/simple_chat/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from examples/simple_chat/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/examples/simple_chat/android/app/src/main/res/values-night/styles.xml b/example/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from examples/simple_chat/android/app/src/main/res/values-night/styles.xml rename to example/android/app/src/main/res/values-night/styles.xml diff --git a/examples/simple_chat/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml similarity index 100% rename from examples/simple_chat/android/app/src/main/res/values/styles.xml rename to example/android/app/src/main/res/values/styles.xml diff --git a/examples/simple_chat/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from examples/simple_chat/android/app/src/profile/AndroidManifest.xml rename to example/android/app/src/profile/AndroidManifest.xml diff --git a/examples/simple_chat/android/build.gradle.kts b/example/android/build.gradle.kts similarity index 100% rename from examples/simple_chat/android/build.gradle.kts rename to example/android/build.gradle.kts diff --git a/examples/simple_chat/android/gradle.properties b/example/android/gradle.properties similarity index 100% rename from examples/simple_chat/android/gradle.properties rename to example/android/gradle.properties diff --git a/examples/simple_chat/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/simple_chat/android/gradle/wrapper/gradle-wrapper.jar rename to example/android/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/simple_chat/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/simple_chat/android/gradle/wrapper/gradle-wrapper.properties rename to example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/simple_chat/android/settings.gradle.kts b/example/android/settings.gradle.kts similarity index 100% rename from examples/simple_chat/android/settings.gradle.kts rename to example/android/settings.gradle.kts diff --git a/examples/simple_chat/ios/.gitignore b/example/ios/.gitignore similarity index 100% rename from examples/simple_chat/ios/.gitignore rename to example/ios/.gitignore diff --git a/examples/simple_chat/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from examples/simple_chat/ios/Flutter/AppFrameworkInfo.plist rename to example/ios/Flutter/AppFrameworkInfo.plist diff --git a/examples/simple_chat/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from examples/simple_chat/ios/Flutter/Debug.xcconfig rename to example/ios/Flutter/Debug.xcconfig diff --git a/examples/simple_chat/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig similarity index 100% rename from examples/simple_chat/ios/Flutter/Release.xcconfig rename to example/ios/Flutter/Release.xcconfig diff --git a/examples/simple_chat/ios/Podfile b/example/ios/Podfile similarity index 100% rename from examples/simple_chat/ios/Podfile rename to example/ios/Podfile diff --git a/examples/simple_chat/ios/Podfile.lock b/example/ios/Podfile.lock similarity index 100% rename from examples/simple_chat/ios/Podfile.lock rename to example/ios/Podfile.lock diff --git a/examples/simple_chat/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/simple_chat/ios/Runner.xcodeproj/project.pbxproj rename to example/ios/Runner.xcodeproj/project.pbxproj diff --git a/examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from examples/simple_chat/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/simple_chat/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from examples/simple_chat/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/simple_chat/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/simple_chat/ios/Runner.xcworkspace/contents.xcworkspacedata rename to example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/simple_chat/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/simple_chat/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/simple_chat/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from examples/simple_chat/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/simple_chat/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift similarity index 100% rename from examples/simple_chat/ios/Runner/AppDelegate.swift rename to example/ios/Runner/AppDelegate.swift diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from examples/simple_chat/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/examples/simple_chat/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from examples/simple_chat/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/examples/simple_chat/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from examples/simple_chat/ios/Runner/Base.lproj/Main.storyboard rename to example/ios/Runner/Base.lproj/Main.storyboard diff --git a/examples/simple_chat/ios/Runner/Info.plist b/example/ios/Runner/Info.plist similarity index 100% rename from examples/simple_chat/ios/Runner/Info.plist rename to example/ios/Runner/Info.plist diff --git a/examples/simple_chat/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from examples/simple_chat/ios/Runner/Runner-Bridging-Header.h rename to example/ios/Runner/Runner-Bridging-Header.h diff --git a/examples/simple_chat/ios/RunnerTests/RunnerTests.swift b/example/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from examples/simple_chat/ios/RunnerTests/RunnerTests.swift rename to example/ios/RunnerTests/RunnerTests.swift diff --git a/examples/simple_chat/lib/api_key/io_get_api_key.dart b/example/lib/api_key/io_get_api_key.dart similarity index 100% rename from examples/simple_chat/lib/api_key/io_get_api_key.dart rename to example/lib/api_key/io_get_api_key.dart diff --git a/examples/simple_chat/lib/api_key/web_get_api_key.dart b/example/lib/api_key/web_get_api_key.dart similarity index 100% rename from examples/simple_chat/lib/api_key/web_get_api_key.dart rename to example/lib/api_key/web_get_api_key.dart diff --git a/examples/simple_chat/lib/configuration.dart b/example/lib/configuration.dart similarity index 100% rename from examples/simple_chat/lib/configuration.dart rename to example/lib/configuration.dart diff --git a/examples/simple_chat/lib/main.dart b/example/lib/main.dart similarity index 100% rename from examples/simple_chat/lib/main.dart rename to example/lib/main.dart diff --git a/examples/simple_chat/lib/message.dart b/example/lib/message.dart similarity index 100% rename from examples/simple_chat/lib/message.dart rename to example/lib/message.dart diff --git a/examples/simple_chat/linux/.gitignore b/example/linux/.gitignore similarity index 100% rename from examples/simple_chat/linux/.gitignore rename to example/linux/.gitignore diff --git a/examples/simple_chat/linux/CMakeLists.txt b/example/linux/CMakeLists.txt similarity index 100% rename from examples/simple_chat/linux/CMakeLists.txt rename to example/linux/CMakeLists.txt diff --git a/examples/simple_chat/linux/flutter/CMakeLists.txt b/example/linux/flutter/CMakeLists.txt similarity index 100% rename from examples/simple_chat/linux/flutter/CMakeLists.txt rename to example/linux/flutter/CMakeLists.txt diff --git a/examples/simple_chat/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from examples/simple_chat/linux/flutter/generated_plugin_registrant.cc rename to example/linux/flutter/generated_plugin_registrant.cc diff --git a/examples/simple_chat/linux/flutter/generated_plugin_registrant.h b/example/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from examples/simple_chat/linux/flutter/generated_plugin_registrant.h rename to example/linux/flutter/generated_plugin_registrant.h diff --git a/examples/simple_chat/linux/flutter/generated_plugins.cmake b/example/linux/flutter/generated_plugins.cmake similarity index 100% rename from examples/simple_chat/linux/flutter/generated_plugins.cmake rename to example/linux/flutter/generated_plugins.cmake diff --git a/examples/simple_chat/linux/runner/CMakeLists.txt b/example/linux/runner/CMakeLists.txt similarity index 100% rename from examples/simple_chat/linux/runner/CMakeLists.txt rename to example/linux/runner/CMakeLists.txt diff --git a/examples/simple_chat/linux/runner/main.cc b/example/linux/runner/main.cc similarity index 100% rename from examples/simple_chat/linux/runner/main.cc rename to example/linux/runner/main.cc diff --git a/examples/simple_chat/linux/runner/my_application.cc b/example/linux/runner/my_application.cc similarity index 100% rename from examples/simple_chat/linux/runner/my_application.cc rename to example/linux/runner/my_application.cc diff --git a/examples/simple_chat/linux/runner/my_application.h b/example/linux/runner/my_application.h similarity index 100% rename from examples/simple_chat/linux/runner/my_application.h rename to example/linux/runner/my_application.h diff --git a/examples/simple_chat/macos/.gitignore b/example/macos/.gitignore similarity index 100% rename from examples/simple_chat/macos/.gitignore rename to example/macos/.gitignore diff --git a/examples/simple_chat/macos/Flutter/Flutter-Debug.xcconfig b/example/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from examples/simple_chat/macos/Flutter/Flutter-Debug.xcconfig rename to example/macos/Flutter/Flutter-Debug.xcconfig diff --git a/examples/simple_chat/macos/Flutter/Flutter-Release.xcconfig b/example/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from examples/simple_chat/macos/Flutter/Flutter-Release.xcconfig rename to example/macos/Flutter/Flutter-Release.xcconfig diff --git a/examples/simple_chat/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from examples/simple_chat/macos/Flutter/GeneratedPluginRegistrant.swift rename to example/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/examples/simple_chat/macos/Podfile b/example/macos/Podfile similarity index 100% rename from examples/simple_chat/macos/Podfile rename to example/macos/Podfile diff --git a/examples/simple_chat/macos/Podfile.lock b/example/macos/Podfile.lock similarity index 100% rename from examples/simple_chat/macos/Podfile.lock rename to example/macos/Podfile.lock diff --git a/examples/simple_chat/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/simple_chat/macos/Runner.xcodeproj/project.pbxproj rename to example/macos/Runner.xcodeproj/project.pbxproj diff --git a/examples/simple_chat/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/simple_chat/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/simple_chat/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from examples/simple_chat/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/simple_chat/macos/Runner.xcworkspace/contents.xcworkspacedata b/example/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/simple_chat/macos/Runner.xcworkspace/contents.xcworkspacedata rename to example/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/simple_chat/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/simple_chat/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/simple_chat/macos/Runner/AppDelegate.swift b/example/macos/Runner/AppDelegate.swift similarity index 100% rename from examples/simple_chat/macos/Runner/AppDelegate.swift rename to example/macos/Runner/AppDelegate.swift diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from examples/simple_chat/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/examples/simple_chat/macos/Runner/Base.lproj/MainMenu.xib b/example/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from examples/simple_chat/macos/Runner/Base.lproj/MainMenu.xib rename to example/macos/Runner/Base.lproj/MainMenu.xib diff --git a/examples/simple_chat/macos/Runner/Configs/AppInfo.xcconfig b/example/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from examples/simple_chat/macos/Runner/Configs/AppInfo.xcconfig rename to example/macos/Runner/Configs/AppInfo.xcconfig diff --git a/examples/simple_chat/macos/Runner/Configs/Debug.xcconfig b/example/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from examples/simple_chat/macos/Runner/Configs/Debug.xcconfig rename to example/macos/Runner/Configs/Debug.xcconfig diff --git a/examples/simple_chat/macos/Runner/Configs/Release.xcconfig b/example/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from examples/simple_chat/macos/Runner/Configs/Release.xcconfig rename to example/macos/Runner/Configs/Release.xcconfig diff --git a/examples/simple_chat/macos/Runner/Configs/Warnings.xcconfig b/example/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from examples/simple_chat/macos/Runner/Configs/Warnings.xcconfig rename to example/macos/Runner/Configs/Warnings.xcconfig diff --git a/examples/simple_chat/macos/Runner/DebugProfile.entitlements b/example/macos/Runner/DebugProfile.entitlements similarity index 100% rename from examples/simple_chat/macos/Runner/DebugProfile.entitlements rename to example/macos/Runner/DebugProfile.entitlements diff --git a/examples/simple_chat/macos/Runner/Info.plist b/example/macos/Runner/Info.plist similarity index 100% rename from examples/simple_chat/macos/Runner/Info.plist rename to example/macos/Runner/Info.plist diff --git a/examples/simple_chat/macos/Runner/MainFlutterWindow.swift b/example/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from examples/simple_chat/macos/Runner/MainFlutterWindow.swift rename to example/macos/Runner/MainFlutterWindow.swift diff --git a/examples/simple_chat/macos/Runner/Release.entitlements b/example/macos/Runner/Release.entitlements similarity index 100% rename from examples/simple_chat/macos/Runner/Release.entitlements rename to example/macos/Runner/Release.entitlements diff --git a/examples/simple_chat/macos/RunnerTests/RunnerTests.swift b/example/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from examples/simple_chat/macos/RunnerTests/RunnerTests.swift rename to example/macos/RunnerTests/RunnerTests.swift diff --git a/examples/simple_chat/pubspec.yaml b/example/pubspec.yaml similarity index 100% rename from examples/simple_chat/pubspec.yaml rename to example/pubspec.yaml diff --git a/examples/simple_chat/test/smoke_test.dart b/example/test/smoke_test.dart similarity index 100% rename from examples/simple_chat/test/smoke_test.dart rename to example/test/smoke_test.dart diff --git a/examples/simple_chat/web/favicon.png b/example/web/favicon.png similarity index 100% rename from examples/simple_chat/web/favicon.png rename to example/web/favicon.png diff --git a/examples/simple_chat/web/icons/Icon-192.png b/example/web/icons/Icon-192.png similarity index 100% rename from examples/simple_chat/web/icons/Icon-192.png rename to example/web/icons/Icon-192.png diff --git a/examples/simple_chat/web/icons/Icon-512.png b/example/web/icons/Icon-512.png similarity index 100% rename from examples/simple_chat/web/icons/Icon-512.png rename to example/web/icons/Icon-512.png diff --git a/examples/simple_chat/web/icons/Icon-maskable-192.png b/example/web/icons/Icon-maskable-192.png similarity index 100% rename from examples/simple_chat/web/icons/Icon-maskable-192.png rename to example/web/icons/Icon-maskable-192.png diff --git a/examples/simple_chat/web/icons/Icon-maskable-512.png b/example/web/icons/Icon-maskable-512.png similarity index 100% rename from examples/simple_chat/web/icons/Icon-maskable-512.png rename to example/web/icons/Icon-maskable-512.png diff --git a/examples/simple_chat/web/index.html b/example/web/index.html similarity index 100% rename from examples/simple_chat/web/index.html rename to example/web/index.html diff --git a/examples/simple_chat/web/manifest.json b/example/web/manifest.json similarity index 100% rename from examples/simple_chat/web/manifest.json rename to example/web/manifest.json diff --git a/examples/simple_chat/windows/.gitignore b/example/windows/.gitignore similarity index 100% rename from examples/simple_chat/windows/.gitignore rename to example/windows/.gitignore diff --git a/examples/simple_chat/windows/CMakeLists.txt b/example/windows/CMakeLists.txt similarity index 100% rename from examples/simple_chat/windows/CMakeLists.txt rename to example/windows/CMakeLists.txt diff --git a/examples/simple_chat/windows/flutter/CMakeLists.txt b/example/windows/flutter/CMakeLists.txt similarity index 100% rename from examples/simple_chat/windows/flutter/CMakeLists.txt rename to example/windows/flutter/CMakeLists.txt diff --git a/examples/simple_chat/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from examples/simple_chat/windows/flutter/generated_plugin_registrant.cc rename to example/windows/flutter/generated_plugin_registrant.cc diff --git a/examples/simple_chat/windows/flutter/generated_plugin_registrant.h b/example/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from examples/simple_chat/windows/flutter/generated_plugin_registrant.h rename to example/windows/flutter/generated_plugin_registrant.h diff --git a/examples/simple_chat/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake similarity index 100% rename from examples/simple_chat/windows/flutter/generated_plugins.cmake rename to example/windows/flutter/generated_plugins.cmake diff --git a/examples/simple_chat/windows/runner/CMakeLists.txt b/example/windows/runner/CMakeLists.txt similarity index 100% rename from examples/simple_chat/windows/runner/CMakeLists.txt rename to example/windows/runner/CMakeLists.txt diff --git a/examples/simple_chat/windows/runner/Runner.rc b/example/windows/runner/Runner.rc similarity index 100% rename from examples/simple_chat/windows/runner/Runner.rc rename to example/windows/runner/Runner.rc diff --git a/examples/simple_chat/windows/runner/flutter_window.cpp b/example/windows/runner/flutter_window.cpp similarity index 100% rename from examples/simple_chat/windows/runner/flutter_window.cpp rename to example/windows/runner/flutter_window.cpp diff --git a/examples/simple_chat/windows/runner/flutter_window.h b/example/windows/runner/flutter_window.h similarity index 100% rename from examples/simple_chat/windows/runner/flutter_window.h rename to example/windows/runner/flutter_window.h diff --git a/examples/simple_chat/windows/runner/main.cpp b/example/windows/runner/main.cpp similarity index 100% rename from examples/simple_chat/windows/runner/main.cpp rename to example/windows/runner/main.cpp diff --git a/examples/simple_chat/windows/runner/resource.h b/example/windows/runner/resource.h similarity index 100% rename from examples/simple_chat/windows/runner/resource.h rename to example/windows/runner/resource.h diff --git a/examples/simple_chat/windows/runner/resources/app_icon.ico b/example/windows/runner/resources/app_icon.ico similarity index 100% rename from examples/simple_chat/windows/runner/resources/app_icon.ico rename to example/windows/runner/resources/app_icon.ico diff --git a/examples/simple_chat/windows/runner/runner.exe.manifest b/example/windows/runner/runner.exe.manifest similarity index 100% rename from examples/simple_chat/windows/runner/runner.exe.manifest rename to example/windows/runner/runner.exe.manifest diff --git a/examples/simple_chat/windows/runner/utils.cpp b/example/windows/runner/utils.cpp similarity index 100% rename from examples/simple_chat/windows/runner/utils.cpp rename to example/windows/runner/utils.cpp diff --git a/examples/simple_chat/windows/runner/utils.h b/example/windows/runner/utils.h similarity index 100% rename from examples/simple_chat/windows/runner/utils.h rename to example/windows/runner/utils.h diff --git a/examples/simple_chat/windows/runner/win32_window.cpp b/example/windows/runner/win32_window.cpp similarity index 100% rename from examples/simple_chat/windows/runner/win32_window.cpp rename to example/windows/runner/win32_window.cpp diff --git a/examples/simple_chat/windows/runner/win32_window.h b/example/windows/runner/win32_window.h similarity index 100% rename from examples/simple_chat/windows/runner/win32_window.h rename to example/windows/runner/win32_window.h diff --git a/examples/examples.md b/examples/examples.md new file mode 100644 index 000000000..fb9767fe1 --- /dev/null +++ b/examples/examples.md @@ -0,0 +1,155 @@ +# Examples + +This directory contains example applications demonstrating the `genui` SDK capabilities. + +## Overview + +| Example | Complexity | Backend | Description | +|---------|------------|---------|-------------| +| [catalog_gallery](#catalog_gallery) | Simple | None | Visual reference for core catalog widgets | +| [custom_backend](#custom_backend) | Intermediate | Custom/Saved | Demonstrates custom backend integration | +| [travel_app](#travel_app) | Advanced | Firebase/Google AI | Full travel planning assistant with custom catalog | +| [verdure](#verdure) | Advanced | Python A2A Server | Full-stack landscape design agent | + +## Running Examples + +Most examples support multiple AI backends. The default is typically Google Generative AI which requires an API key: + +```bash +# Get API key from https://aistudio.google.com/app/apikey +flutter run --dart-define=GEMINI_API_KEY=YOUR_API_KEY +``` + +--- + +## catalog_gallery + +A developer tool for visualizing and testing the core widget catalog. Displays all available `CoreCatalogItems` widgets and allows interaction testing. + +**Key Features:** +- Browse all core catalog widgets +- Interactive widget testing with event logging +- Sample file loading support + +**Run:** +```bash +cd examples/catalog_gallery +flutter run +``` + +--- + +## custom_backend + +Demonstrates integrating genui with a custom backend without using predefined provider packages (`genui_firebase_ai`, `genui_google_generative_ai`). + +**Key Features:** +- Direct integration with `A2uiMessageProcessor` +- Manual tool call parsing and handling +- Saved response testing for development without API calls +- Shows how to build `UiSchemaDefinition` and `catalogToFunctionDeclaration` + +**Key Files:** +- `lib/backend.dart` - Custom backend implementation +- `lib/gemini_client.dart` - Direct Gemini API client +- `assets/data/saved-response-*.json` - Pre-recorded responses for testing + +**Run:** +```bash +cd examples/custom_backend +flutter run --dart-define=GEMINI_API_KEY=YOUR_API_KEY +``` + +--- + +## travel_app + +A full-featured travel planning assistant demonstrating advanced genui capabilities with a custom domain-specific widget catalog. + +**Key Features:** +- Custom widget catalog with travel-specific components (carousel, itinerary, filter chips) +- Tool use (`ListHotelsTool` for fetching hotel data) +- System prompt engineering for AI behavior +- Dynamic UI generation based on conversation +- Supports Firebase AI and Google Generative AI backends + +**Key Files:** +- `lib/src/catalog.dart` - Custom travel widgets catalog +- `lib/src/catalog/` - Individual widget implementations +- `lib/src/travel_planner_page.dart` - Main page with system prompt +- `lib/src/tools/booking/` - AI tool implementations +- `lib/src/config/configuration.dart` - Backend configuration + +**Custom Widgets:** +- `TravelCarousel` - Image carousel for destinations +- `OptionsFilterChipInput` / `CheckboxFilterChipsInput` - User preference inputs +- `Itinerary` / `ItineraryEntry` - Trip planning display +- `ListingsBooker` - Hotel booking interface +- `Trailhead` - Suggested follow-up questions +- `TabbedSections` - Tabbed content display + +**Run:** +```bash +cd examples/travel_app +flutter run --dart-define=GEMINI_API_KEY=YOUR_API_KEY +``` + +**Switch to Firebase:** +1. Edit `lib/src/config/configuration.dart`: set `aiBackend = AiBackend.firebase` +2. Uncomment Firebase imports in `lib/main.dart` +3. Run `flutterfire configure` to generate Firebase options + +--- + +## verdure + +A full-stack example with a Python server and Flutter client demonstrating the A2A (Agent-to-Agent) protocol for landscape design. + +**Prerequisites:** +- Python 3.13+ +- [UV](https://docs.astral.sh/uv/) package manager +- Gemini API key + +**Architecture:** +``` +verdure/ +├── server/ # Python A2A server +│ └── verdure/ # Agent implementation +└── client/ # Flutter client app +``` + +**Run Server:** +```bash +cd examples/verdure/server/verdure +echo "GEMINI_API_KEY=YOUR_API_KEY" > .env +uv run . +# Server starts on http://localhost:10002 +``` + +**Run Client:** +```bash +cd examples/verdure/client +flutter run +``` + +**Android Emulator:** +The emulator uses `10.0.2.2` as localhost alias. Start server with: +```bash +uv run . --base-url="http://10.0.2.2:10002" +``` + +**Key Files:** +- `server/verdure/agent.py` - AI agent logic +- `server/verdure/a2ui_schema.py` - A2UI protocol schema +- `client/lib/features/ai/ai_provider.dart` - Client AI integration + +--- + +## Choosing an Example + +| Goal | Recommended Example | +|------|---------------------| +| Understand core widgets | `catalog_gallery` | +| Build custom backend integration | `custom_backend` | +| Build a production-like app with custom catalog | `travel_app` | +| Implement client-server architecture with A2A | `verdure` | diff --git a/packages/genui/CHANGELOG.md b/packages/genui/CHANGELOG.md index b8f2cb642..1166c517a 100644 --- a/packages/genui/CHANGELOG.md +++ b/packages/genui/CHANGELOG.md @@ -1,6 +1,8 @@ # `genui` Changelog ## 0.6.1 +- Moved simple chat example to example so that pub.dev recognizes examples are provided. +- Documented some variable for better dartcode documentation. - **Fix**: Corrected `DateTimeInput` catalog item JSON key mapping (#622). - **Fix**: Added missing `weight` property to `Component` constructor (#603). diff --git a/packages/genui/lib/src/model/a2ui_schemas.dart b/packages/genui/lib/src/model/a2ui_schemas.dart index 6e35030d0..e9e71d488 100644 --- a/packages/genui/lib/src/model/a2ui_schemas.dart +++ b/packages/genui/lib/src/model/a2ui_schemas.dart @@ -10,6 +10,9 @@ import 'tools.dart'; /// Provides a set of pre-defined, reusable schema objects for common /// A2UI patterns, simplifying the creation of CatalogItem definitions. class A2uiSchemas { + /// This class is not meant to be instantiated. + A2uiSchemas._(); + /// Schema for a value that can be either a literal string or a /// data-bound path to a string in the DataModel. If both path and /// literal are provided, the value at the path will be initialized diff --git a/packages/genui/lib/src/model/catalog_item.dart b/packages/genui/lib/src/model/catalog_item.dart index 4e1715a02..b1a18a9dc 100644 --- a/packages/genui/lib/src/model/catalog_item.dart +++ b/packages/genui/lib/src/model/catalog_item.dart @@ -25,7 +25,17 @@ typedef ExampleBuilderCallback = String Function(); /// A callback that builds a widget for a catalog item. typedef CatalogWidgetBuilder = Widget Function(CatalogItemContext itemContext); +/// Context provided to a [CatalogItem]'s widget builder. +/// +/// This class encapsulates all the information and callbacks needed to build +/// a catalog widget, including access to the widget's data, its position in +/// the component tree, and mechanisms for building children and dispatching +/// events. class CatalogItemContext { + /// Creates a [CatalogItemContext] with the required parameters. + /// + /// All parameters are required to ensure the widget builder has complete + /// context for rendering and interaction. CatalogItemContext({ required this.data, required this.id, @@ -37,13 +47,28 @@ class CatalogItemContext { required this.surfaceId, }); + /// The parsed data for this component from the AI-generated definition. final Object data; + + /// The unique identifier for this component instance. final String id; + + /// Callback to build a child widget by its component ID. final ChildBuilderCallback buildChild; + + /// Callback to dispatch UI events (e.g., button taps) back to the system. final DispatchEventCallback dispatchEvent; + + /// The Flutter [BuildContext] for this widget. final BuildContext buildContext; + + /// The [DataContext] for accessing and modifying the data model. final DataContext dataContext; + + /// Callback to retrieve a component definition by its ID. final GetComponentCallback getComponent; + + /// The ID of the surface this component belongs to. final String surfaceId; } diff --git a/packages/genui/lib/src/model/chat_message.dart b/packages/genui/lib/src/model/chat_message.dart index ee8f965c8..f1042c420 100644 --- a/packages/genui/lib/src/model/chat_message.dart +++ b/packages/genui/lib/src/model/chat_message.dart @@ -243,5 +243,9 @@ final class AiUiMessage extends ChatMessage { final String surfaceId; + /// The parts of this message, containing a text description of the UI. + /// + /// This is automatically generated from the [definition] and provides + /// context for the AI about the current UI state. final List parts; } diff --git a/packages/genui/lib/test/fake_content_generator.dart b/packages/genui/lib/test/fake_content_generator.dart index bde6dc8f3..e210106b0 100644 --- a/packages/genui/lib/test/fake_content_generator.dart +++ b/packages/genui/lib/test/fake_content_generator.dart @@ -2,6 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +/// A fake implementation of [ContentGenerator] for testing purposes. +/// +/// This library provides [FakeContentGenerator], which allows tests to +/// simulate AI responses without making actual API calls. +library fake_content_generator; + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -9,7 +15,15 @@ import 'package:flutter/foundation.dart'; import '../genui.dart'; /// A fake [ContentGenerator] for use in tests. +/// +/// This implementation allows tests to control AI responses by: +/// - Tracking calls to [sendRequest] via [sendRequestCallCount] +/// - Capturing the last message and history via [lastMessage] and [lastHistory] +/// - Emitting fake A2UI messages via [addA2uiMessage] +/// - Emitting fake text responses via [addTextResponse] +/// - Pausing execution via [sendRequestCompleter] class FakeContentGenerator implements ContentGenerator { + /// Creates a new [FakeContentGenerator] instance. FakeContentGenerator(); final _a2uiMessageController = StreamController.broadcast();