Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
cc70a7d
integrated the AI meet transcribing service with the VexaAIAPI
SharkyBytes Jul 11, 2025
db95d44
[refactor] : deployed the supabase functions for the auto joining and…
SharkyBytes Jul 13, 2025
d9b04c1
[refactor]: cleared up the files by refactoring and formatting
SharkyBytes Jul 23, 2025
93e24f7
Updated the meeting sqls with trigger for transcription cleanup
SharkyBytes Aug 18, 2025
2e9894e
integrated dynamic backend metrics on dashboard nd enabled Ellena voi…
SharkyBytes Aug 19, 2025
2ced34e
integrated Supabase Edge Function for invoking meeting transcription …
SharkyBytes Aug 19, 2025
f5a34a4
fetched the clean transcriptions and AI summaries from the database i…
SharkyBytes Aug 19, 2025
061fd88
Added the method to invoke the task and tickets API to create the mee…
SharkyBytes Aug 19, 2025
0f0d0e4
Added the donwload option to save the transcription and ai summary as…
SharkyBytes Aug 19, 2025
1dcf46f
Updated the .gitignore for the plugin generate files and changed the …
SharkyBytes Aug 19, 2025
5cad136
Integrated the TeamSwitching dependancy if a ingle mail have multiple…
SharkyBytes Aug 19, 2025
f9f99e8
Replaced the triggers to cronJob for calling the AISummary function
SharkyBytes Aug 19, 2025
f21447a
Fixed the chat Listening widget and enhanced the UserProfile in Dashb…
SharkyBytes Aug 20, 2025
825aa45
Deployed the functions get-embedding and generate-embedding for conte…
SharkyBytes Aug 20, 2025
c3879e4
scheduled the cronJob for processing missing_embededings
SharkyBytes Aug 20, 2025
15e1bf5
Added the search_meeting_summaries RPC functions for getting the rele…
SharkyBytes Aug 20, 2025
e7076e6
Implemented the keyword matching to diverge the request to the RPC fu…
SharkyBytes Aug 20, 2025
67fe289
Added the correct ListingFields for parsing into the meeting context
SharkyBytes Aug 20, 2025
6dcda81
updated the schema to fetch the response ID and embeddings in the cli…
SharkyBytes Aug 20, 2025
db795b3
added the spearate logic for text_formatting in the chatScreen bypass…
SharkyBytes Aug 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
SUPABASE_URL=<YOUR_SUPABASE_URL>
SUPABASE_ANON_KEY=<YOUR_SUPABASE_ANON_KEY>
SUPABASE_SERVICE_ROLE_KEY=<YOUR_SUPABASE_SERVICE_ROLE_KEY>
GEMINI_API_KEY=<YOUR_GEMINI_API_KEY>

VEXA_API_KEY=<YOUR_VEXA_API_KEY>
OPEAI_API_KEY=<YOUR_OPEAI_API_KEY>
Comment thread
SharkyBytes marked this conversation as resolved.
26 changes: 21 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ migrate_working_dir/
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# VS Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
Expand All @@ -33,19 +31,37 @@ migrate_working_dir/
.pub/
/build/

# Flutter auto-generated files
**/GeneratedPluginRegistrant.*
**/generated_plugin_registrant.*
**/generated_plugins.cmake
**/windows/flutter/generated_plugins.cmake
**/linux/flutter/generated_plugins.cmake
**/macos/Flutter/GeneratedPluginRegistrant.swift

# Environment / credentials
.env
firebase*.json
*.keystore
*.jks
fastlane/.env*

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
# Android Studio build artifacts
/android/app/debug
/android/app/profile
/android/app/release

# iOS build artifacts
ios/Pods/
ios/.symlinks/
ios/Flutter/Flutter.framework
ios/Flutter/Flutter.podspec
ios/Flutter/App.framework
ios/Flutter/Generated.xcconfig
ios/Flutter/ephemeral/
2 changes: 1 addition & 1 deletion android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ android {
applicationId = "org.aossie.ell_ena"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
minSdk = maxOf(21, flutter.minSdkVersion)
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
Expand Down
10 changes: 10 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<application
android:label="Ell-ena"
android:name="${applicationName}"
Expand Down Expand Up @@ -53,5 +59,9 @@
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
</intent>
<!-- Speech recognition service for Android 11+ visibility -->
<intent>
<action android:name="android.speech.RecognitionService" />
</intent>
</queries>
</manifest>
166 changes: 84 additions & 82 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,82 +1,84 @@

import 'package:flutter/material.dart';
import 'screens/splash_screen.dart';
import 'screens/home/home_screen.dart';
import 'screens/chat/chat_screen.dart';
import 'services/navigation_service.dart';
import 'services/supabase_service.dart';
import 'services/ai_service.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();

try {
// Initialize Supabase
await SupabaseService().initialize();

// Initialize AI Service
await AIService().initialize();
} catch (e) {
debugPrint('Error initializing services: $e');
// Continue with the app even if initialization fails
// The app will show appropriate error messages when trying to use these features
}

runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ell-ena',
debugShowCheckedModeBanner: false,
navigatorKey: NavigationService().navigatorKey,
theme: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
primaryColor: Colors.green.shade400,
scaffoldBackgroundColor: const Color(0xFF1A1A1A),
colorScheme: ColorScheme.dark(
primary: Colors.green.shade400,
secondary: Colors.green.shade700,
surface: const Color(0xFF2A2A2A),
background: const Color(0xFF1A1A1A),
),
textTheme: const TextTheme(
displayLarge: TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
letterSpacing: 1.2,
),
bodyLarge: TextStyle(fontSize: 16, letterSpacing: 0.5),
),
),
home: const SplashScreen(),
onGenerateRoute: (settings) {
if (settings.name == '/') {
return MaterialPageRoute(
builder: (context) => const SplashScreen(),
settings: settings,
);
} else if (settings.name == '/home') {
final args = settings.arguments as Map<String, dynamic>?;
return MaterialPageRoute(
builder: (context) => HomeScreen(arguments: args),
settings: settings,
);
} else if (settings.name == '/chat') {
final args = settings.arguments as Map<String, dynamic>?;
return MaterialPageRoute(
builder: (context) => ChatScreen(arguments: args),
settings: settings,
);
}
return null;
},
);
}
}

import 'package:flutter/material.dart';
import 'screens/splash_screen.dart';
import 'screens/home/home_screen.dart';
import 'screens/chat/chat_screen.dart';
import 'services/navigation_service.dart';
import 'services/supabase_service.dart';
import 'services/ai_service.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();

try {
await SupabaseService().initialize();

await AIService().initialize();
} catch (e) {
debugPrint('Error initializing services: $e');
}

runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ell-ena',
debugShowCheckedModeBanner: false,
navigatorKey: NavigationService().navigatorKey,
navigatorObservers: <NavigatorObserver>[AppRouteObserver.instance],
theme: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
primaryColor: Colors.green.shade400,
scaffoldBackgroundColor: const Color(0xFF1A1A1A),
colorScheme: ColorScheme.dark(
primary: Colors.green.shade400,
secondary: Colors.green.shade700,
surface: const Color(0xFF2A2A2A),
background: const Color(0xFF1A1A1A),
),
textTheme: const TextTheme(
displayLarge: TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
letterSpacing: 1.2,
),
bodyLarge: TextStyle(fontSize: 16, letterSpacing: 0.5),
),
),
home: const SplashScreen(),
onGenerateRoute: (settings) {
if (settings.name == '/') {
return MaterialPageRoute(
builder: (context) => const SplashScreen(),
settings: settings,
);
} else if (settings.name == '/home') {
final args = settings.arguments as Map<String, dynamic>?;
return MaterialPageRoute(
builder: (context) => HomeScreen(arguments: args),
settings: settings,
);
} else if (settings.name == '/chat') {
final args = settings.arguments as Map<String, dynamic>?;
return MaterialPageRoute(
builder: (context) => ChatScreen(arguments: args),
settings: settings,
);
}
return null;
},
);
}
}

// Simple singleton RouteObserver to allow screens to refresh on focus
class AppRouteObserver extends RouteObserver<ModalRoute<void>> {
AppRouteObserver._();
static final AppRouteObserver instance = AppRouteObserver._();
}
Loading