├── modules ├── panel │ ├── README.md │ ├── .npmrc │ ├── app │ │ ├── 403 │ │ │ └── page.tsx │ │ ├── page.tsx │ │ ├── (pages) │ │ │ ├── login │ │ │ │ └── page.tsx │ │ │ ├── onboarding │ │ │ │ └── page.tsx │ │ │ └── signup │ │ │ │ └── page.tsx │ │ ├── (authenticated) │ │ │ ├── spaces │ │ │ │ ├── page.tsx │ │ │ │ └── [spaceId] │ │ │ │ │ └── meetings │ │ │ │ │ └── page.tsx │ │ │ ├── users │ │ │ │ └── page.tsx │ │ │ ├── settings │ │ │ │ └── page.tsx │ │ │ ├── assistants │ │ │ │ └── page.tsx │ │ │ ├── meetings │ │ │ │ ├── my │ │ │ │ │ └── page.tsx │ │ │ │ ├── archived │ │ │ │ │ └── page.tsx │ │ │ │ └── [meetingId] │ │ │ │ │ └── transcription │ │ │ │ │ └── page.tsx │ │ │ └── playground │ │ │ │ └── page.tsx │ │ └── layout.tsx │ ├── public │ │ ├── favicon.ico │ │ └── assets │ │ │ ├── icons │ │ │ ├── 128x.png │ │ │ ├── vercel.svg │ │ │ ├── file.svg │ │ │ ├── window.svg │ │ │ └── globe.svg │ │ │ └── images │ │ │ ├── hi5.png │ │ │ ├── welcome.png │ │ │ ├── default-avatar.jpg │ │ │ └── extension-install.png │ ├── postcss.config.mjs │ ├── shared │ │ ├── components │ │ │ ├── meetings │ │ │ │ ├── index.ts │ │ │ │ ├── remove-confirmation-modal.tsx │ │ │ │ └── meetings-list.tsx │ │ │ ├── ui │ │ │ │ ├── skeleton.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── label.tsx │ │ │ │ ├── textarea.tsx │ │ │ │ ├── separator.tsx │ │ │ │ ├── progress.tsx │ │ │ │ ├── collapsible.tsx │ │ │ │ ├── input.tsx │ │ │ │ └── modeToggle.tsx │ │ │ ├── platform-logo.tsx │ │ │ ├── loading-page.tsx │ │ │ ├── empty-states │ │ │ │ ├── no-search-result.tsx │ │ │ │ └── database-empty.tsx │ │ │ ├── auth-guard.tsx │ │ │ └── participant-avatar.tsx │ │ ├── types │ │ │ ├── index.ts │ │ │ ├── auth.ts │ │ │ ├── assistants.ts │ │ │ ├── network.ts │ │ │ ├── config.ts │ │ │ ├── space.ts │ │ │ └── user.ts │ │ ├── config.ts │ │ ├── lib │ │ │ ├── utils.ts │ │ │ ├── styling-utils.ts │ │ │ ├── validation-utils.ts │ │ │ ├── formatting-utils.ts │ │ │ ├── index.ts │ │ │ ├── localStorage.ts │ │ │ └── user-utils.ts │ │ ├── providers │ │ │ ├── theme-provider.tsx │ │ │ └── query-provider.tsx │ │ ├── routes.ts │ │ ├── models │ │ │ └── secondary-sidebar.tsx │ │ ├── network │ │ │ └── api │ │ │ │ ├── authController.ts │ │ │ │ ├── systemController.ts │ │ │ │ └── assistantsController.ts │ │ └── hooks │ │ │ ├── use-runtime-config.ts │ │ │ ├── use-mobile.ts │ │ │ └── use-user.ts │ ├── views │ │ ├── (pages) │ │ │ ├── signup │ │ │ │ ├── hooks │ │ │ │ │ └── index.ts │ │ │ │ ├── utils │ │ │ │ │ ├── index.ts │ │ │ │ │ └── validation-constants.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── types.ts │ │ │ │ ├── i18n.ts │ │ │ │ └── api │ │ │ │ │ └── signup-controller.ts │ │ │ ├── onboarding │ │ │ │ ├── index.tsx │ │ │ │ ├── controllers │ │ │ │ │ ├── organizationsController.ts │ │ │ │ │ └── userController.ts │ │ │ │ ├── hooks.ts │ │ │ │ ├── types.ts │ │ │ │ └── i18n.ts │ │ │ ├── login │ │ │ │ ├── i18n.ts │ │ │ │ └── hooks │ │ │ │ │ └── use-login-form.ts │ │ │ └── landing │ │ │ │ └── i18n.ts │ │ └── (authenticated) │ │ │ ├── assistants │ │ │ ├── models.ts │ │ │ └── i18n.ts │ │ │ ├── settings │ │ │ └── i18n.ts │ │ │ └── meetings │ │ │ ├── archived │ │ │ └── index.tsx │ │ │ └── [meetingId] │ │ │ └── transcription │ │ │ └── components │ │ │ └── transcription-reaction-badges.tsx │ ├── next.config.ts │ ├── .prettierrc.json │ ├── eslint.config.mjs │ ├── components.json │ ├── .gitignore │ ├── tsconfig.json │ └── .dockerignore ├── extension │ ├── .npmrc │ ├── src │ │ ├── ui │ │ │ └── uiBundle.ts │ │ ├── assets │ │ │ ├── icons │ │ │ │ ├── 128x.png │ │ │ │ ├── 16x.png │ │ │ │ ├── default-avatar.jpg │ │ │ │ └── light_mode.svg │ │ │ ├── fonts │ │ │ │ └── Inter-Light.woff2 │ │ │ └── images │ │ │ │ ├── no-active-meeting.png │ │ │ │ ├── user-unauthorized.png │ │ │ │ └── meeting_not_started.png │ │ ├── api │ │ │ ├── types.ts │ │ │ └── apiRoutes.ts │ │ ├── prettier.config.js │ │ ├── core │ │ │ ├── platforms │ │ │ │ └── googleMeet.ts │ │ │ ├── utils │ │ │ │ ├── datetime.ts │ │ │ │ └── index.ts │ │ │ ├── configurationManager.ts │ │ │ └── network │ │ │ │ └── apiRequest.ts │ │ └── background.ts │ ├── dist │ │ ├── extension.rar │ │ ├── assets │ │ │ ├── icons │ │ │ │ ├── 16x.png │ │ │ │ ├── 128x.png │ │ │ │ ├── default-avatar.jpg │ │ │ │ └── light_mode.svg │ │ │ ├── fonts │ │ │ │ └── Inter-Light.woff2 │ │ │ └── images │ │ │ │ ├── no-active-meeting.png │ │ │ │ ├── user-unauthorized.png │ │ │ │ └── meeting_not_started.png │ │ ├── manifest.json │ │ └── background.js │ ├── vite-env.d.ts │ ├── tsconfig.json │ ├── eslint.config.mjs │ ├── package.json │ └── manifest.json ├── backend │ ├── src │ │ ├── Au5.Domain │ │ │ ├── GlobalUsing.cs │ │ │ ├── Common │ │ │ │ ├── UserStatus.cs │ │ │ │ ├── Guest.cs │ │ │ │ ├── EntityAttribute.cs │ │ │ │ ├── RoleTypes.cs │ │ │ │ ├── Participant.cs │ │ │ │ └── MeetingStatus.cs │ │ │ ├── Entities │ │ │ │ ├── RoleMenu.cs │ │ │ │ ├── BlacklistedToken.cs │ │ │ │ ├── UserSpace.cs │ │ │ │ ├── MeetingSpace.cs │ │ │ │ ├── Space.cs │ │ │ │ ├── AppliedReactions.cs │ │ │ │ ├── ParticipantInMeeting.cs │ │ │ │ ├── Reaction.cs │ │ │ │ ├── Entry.cs │ │ │ │ ├── Menu.cs │ │ │ │ ├── Organization.cs │ │ │ │ ├── AIContents.cs │ │ │ │ ├── Assistant.cs │ │ │ │ └── GuestsInMeeting.cs │ │ │ └── Au5.Domain.csproj │ │ ├── Au5.AppHost │ │ │ ├── Program.cs │ │ │ ├── appsettings.Development.json │ │ │ ├── appsettings.json │ │ │ ├── Au5.AppHost.csproj │ │ │ └── Properties │ │ │ │ └── launchSettings.json │ │ ├── Au5.Application │ │ │ ├── Features │ │ │ │ ├── Meetings │ │ │ │ │ ├── ToggleArchive │ │ │ │ │ │ ├── ToggleArchiveResponse.cs │ │ │ │ │ │ └── ToggleArchiveCommand.cs │ │ │ │ │ ├── ToggleFavorite │ │ │ │ │ │ ├── ToggleFavoriteResponse.cs │ │ │ │ │ │ └── ToggleFavoriteCommand.cs │ │ │ │ │ ├── Export │ │ │ │ │ │ ├── ExportQuery.cs │ │ │ │ │ │ └── ExportQuery.Validator.cs │ │ │ │ │ ├── CloseMeetingByUser │ │ │ │ │ │ └── CloseMeetingByUserCommand.cs │ │ │ │ │ ├── AddBot │ │ │ │ │ │ ├── AddBotCommand.cs │ │ │ │ │ │ └── AddBotCommand.Validator.cs │ │ │ │ │ ├── Rename │ │ │ │ │ │ ├── RenameMeetingCommand.cs │ │ │ │ │ │ ├── RenameMeetingCommand.Validator.cs │ │ │ │ │ │ └── RenameMeetingCommand.Handler.cs │ │ │ │ │ ├── PublicUrl │ │ │ │ │ │ ├── PublicMeetingUrlCommand.cs │ │ │ │ │ │ └── PublicMeetingUrlCommand.Validator.cs │ │ │ │ │ ├── RemoveMeeting │ │ │ │ │ │ ├── RemoveMeetingCommand.cs │ │ │ │ │ │ └── RemoveMeetingCommand.Handler.cs │ │ │ │ │ ├── MyMeeting │ │ │ │ │ │ └── MyMeetingQuery.cs │ │ │ │ │ └── GetFullTranscription │ │ │ │ │ │ └── GetFullTranscriptionQuery.cs │ │ │ │ ├── AI │ │ │ │ │ ├── Delete │ │ │ │ │ │ ├── DeleteAIContentCommand.cs │ │ │ │ │ │ └── DeleteAIContentCommand.Handler.cs │ │ │ │ │ ├── Generate │ │ │ │ │ │ └── AIGenerateCommand.cs │ │ │ │ │ └── GetAll │ │ │ │ │ │ └── GetAIContentsQuery.cs │ │ │ │ ├── UserManagement │ │ │ │ │ ├── GetMyInfo │ │ │ │ │ │ ├── GetMyInfoQuery.cs │ │ │ │ │ │ └── GetMyInfoQuery.Handler.cs │ │ │ │ │ ├── GetUsers │ │ │ │ │ │ ├── GetUsersQuery.cs │ │ │ │ │ │ └── GetUsersQuery.Handler.cs │ │ │ │ │ ├── Search │ │ │ │ │ │ └── SearchUserQuery.cs │ │ │ │ │ ├── VerifyUser │ │ │ │ │ │ ├── Query │ │ │ │ │ │ │ ├── VerifyUserQuery.cs │ │ │ │ │ │ │ └── VerifyUserQuery.Handler.cs │ │ │ │ │ │ └── Command │ │ │ │ │ │ │ ├── VerifyUserCommand.cs │ │ │ │ │ │ │ └── VerifyUserCommand.Validator.cs │ │ │ │ │ ├── ResendVerificationEmail │ │ │ │ │ │ └── ResendVerificationEmailCommand.cs │ │ │ │ │ ├── GetUserMenus │ │ │ │ │ │ └── GetUserMenusQuery.cs │ │ │ │ │ └── InviteUsers │ │ │ │ │ │ ├── InviteUsersCommand.cs │ │ │ │ │ │ └── InviteUsersCommand.Validator.cs │ │ │ │ ├── Organizations │ │ │ │ │ ├── GetConfig │ │ │ │ │ │ ├── OrganizationQuery.cs │ │ │ │ │ │ ├── OrganizationResponse.cs │ │ │ │ │ │ └── OrganizationQuery.Handler.cs │ │ │ │ │ ├── ExtensionConfig │ │ │ │ │ │ ├── ExtensionConfigQuery.cs │ │ │ │ │ │ └── ExtensionConfigResponse.cs │ │ │ │ │ └── SetConfig │ │ │ │ │ │ ├── OrganizationCommand.cs │ │ │ │ │ │ └── OrganizationCommand.Validator.cs │ │ │ │ ├── Reactions │ │ │ │ │ └── GetAllQuery │ │ │ │ │ │ ├── GetAllReactionsQuery.cs │ │ │ │ │ │ └── GetAllReactionsQuery.Handler.cs │ │ │ │ ├── Assistants │ │ │ │ │ ├── GetAll │ │ │ │ │ │ └── GetAssistantsQuery.cs │ │ │ │ │ └── AddAssistant │ │ │ │ │ │ ├── AddAssistantCommand.cs │ │ │ │ │ │ └── AddAssistantCommand.Validator.cs │ │ │ │ ├── MeetingSpaces │ │ │ │ │ ├── AddMeetingToSpace │ │ │ │ │ │ ├── AddMeetingToSpaceResponse.cs │ │ │ │ │ │ └── AddMeetingToSpaceCommand.cs │ │ │ │ │ └── RemoveMeetingFromSpace │ │ │ │ │ │ ├── RemoveMeetingFromSpaceResponse.cs │ │ │ │ │ │ ├── RemoveMeetingFromSpaceCommand.cs │ │ │ │ │ │ └── RemoveMeetingFromSpaceCommand.Handler.cs │ │ │ │ ├── Spaces │ │ │ │ │ ├── GetSpaceMeetings │ │ │ │ │ │ └── SpaceMeetingsQuery.cs │ │ │ │ │ ├── SpaceMembers │ │ │ │ │ │ └── SpaceMemebersQuery.cs │ │ │ │ │ ├── GetUserSpaces │ │ │ │ │ │ └── UserSpacesQuery.cs │ │ │ │ │ ├── GetSpaces │ │ │ │ │ │ └── SpacesQuery.cs │ │ │ │ │ └── CreateSpace │ │ │ │ │ │ ├── CreateSpaceCommand.cs │ │ │ │ │ │ └── CreateSpaceCommand.Validator.cs │ │ │ │ ├── Authentication │ │ │ │ │ └── Login │ │ │ │ │ │ ├── LoginCommand.cs │ │ │ │ │ │ ├── LoginCommand.Validator.cs │ │ │ │ │ │ └── LoginCommand.Handler.cs │ │ │ │ └── Admin │ │ │ │ │ └── Create │ │ │ │ │ └── CreateAdminCommand.cs │ │ │ ├── Messages │ │ │ │ ├── Message.cs │ │ │ │ ├── CloseMeetingMessage.cs │ │ │ │ ├── MeetingIsActiveMessage.cs │ │ │ │ ├── BotJoinedInMeetingMessage.cs │ │ │ │ ├── GuestJoinedInMeetingMessage.cs │ │ │ │ ├── RequestToAddBotMessage.cs │ │ │ │ ├── UserJoinedInMeetingMessage.cs │ │ │ │ ├── PauseAndPlayTranscriptionMessage.cs │ │ │ │ ├── ReactionAppliedMessage.cs │ │ │ │ ├── EntryMessage.cs │ │ │ │ └── MessageTypesConstants.cs │ │ │ ├── Dtos │ │ │ │ ├── AI │ │ │ │ │ ├── RunThreadRequest.cs │ │ │ │ │ └── CreateAssistantRequest.cs │ │ │ │ ├── MeetingDtos │ │ │ │ │ ├── SpaceDto.cs │ │ │ │ │ ├── ReactionDto.cs │ │ │ │ │ └── EntryDto.cs │ │ │ │ ├── SmtpOptions.cs │ │ │ │ └── Spaces │ │ │ │ │ └── SpaceUserInfo.cs │ │ │ ├── Common │ │ │ │ ├── Options │ │ │ │ │ └── ServiceSettings.cs │ │ │ │ ├── Abstractions │ │ │ │ │ ├── ICacheProvider.cs │ │ │ │ │ ├── IAIClient.cs │ │ │ │ │ ├── IBotFatherAdapter.cs │ │ │ │ │ ├── IApplicationDbContext.cs │ │ │ │ │ ├── ITokenService.cs │ │ │ │ │ ├── IEmailProvider.cs │ │ │ │ │ ├── IMeetingService.cs │ │ │ │ │ └── ICurrentUserService.cs │ │ │ │ ├── DateTimeExtension.cs │ │ │ │ └── Piplines │ │ │ │ │ ├── ValidatorBehavior.cs │ │ │ │ │ └── LoggingBehavior.cs │ │ │ ├── GlobalUsing.cs │ │ │ └── ConfigServices.cs │ │ ├── Au5.Shared │ │ │ ├── IResult.cs │ │ │ ├── ErrorType.cs │ │ │ ├── IDateTimeProvider.cs │ │ │ ├── Au5.Shared.csproj │ │ │ ├── ClaimConstants.cs │ │ │ └── HashHelper.cs │ │ ├── Au5.BackEnd │ │ │ ├── appsettings.json │ │ │ ├── .config │ │ │ │ └── dotnet-tools.json │ │ │ ├── AuthorizationPolicies.cs │ │ │ ├── GlobalUsing.cs │ │ │ ├── Controllers │ │ │ │ ├── BaseController.cs │ │ │ │ ├── AdminController.cs │ │ │ │ ├── ReactionsController.cs │ │ │ │ ├── AssistantsController.cs │ │ │ │ └── OrganizationController.cs │ │ │ ├── Extensions │ │ │ │ └── ClaimsPrincipalExtensions.cs │ │ │ ├── Hubs │ │ │ │ └── IMeetingHub.cs │ │ │ ├── Properties │ │ │ │ └── launchSettings.json │ │ │ └── GlobalHandler │ │ │ │ ├── GlobalExceptionHandler.cs │ │ │ │ └── ValidationExceptionHandler.cs │ │ ├── Au5.Infrastructure │ │ │ ├── Authentication │ │ │ │ └── JwtSettings.cs │ │ │ ├── Persistence │ │ │ │ ├── Config │ │ │ │ │ ├── ParticipantInMeeting.cs │ │ │ │ │ ├── AppliedReactionsConfig.cs │ │ │ │ │ ├── GuestsInMeetingConfig.cs │ │ │ │ │ ├── RoleMenuConfiguration.cs │ │ │ │ │ ├── ReactionConfig.cs │ │ │ │ │ ├── MeetingConfig.cs │ │ │ │ │ ├── AIContentsConfig.cs │ │ │ │ │ ├── UserSpaceConfig.cs │ │ │ │ │ ├── OrganizationConfig.cs │ │ │ │ │ ├── EntryConfig.cs │ │ │ │ │ ├── SpaceConfig.cs │ │ │ │ │ ├── UserConfig.cs │ │ │ │ │ ├── MeetingSpaceConfig.cs │ │ │ │ │ ├── AssistantConfig.cs │ │ │ │ │ └── MenuConfiguration.cs │ │ │ │ ├── Scripts │ │ │ │ │ └── DropTables.sql │ │ │ │ ├── LogMessages.cs │ │ │ │ └── Configurations │ │ │ │ │ └── BlacklistedTokenConfiguration.cs │ │ │ ├── Adapters │ │ │ │ ├── ISmtpClientWrapper.cs │ │ │ │ └── SmtpClientWrapper.cs │ │ │ └── Common │ │ │ │ └── AppResources.cs │ │ └── Au5.ServiceDefaults │ │ │ └── Au5.ServiceDefaults.csproj │ ├── tests │ │ ├── Au5.IntegrationTests │ │ │ ├── xunit.runner.json │ │ │ ├── GLobalUsing.cs │ │ │ ├── Application │ │ │ │ └── AppResources.cs │ │ │ ├── TestCurrentUserServiceFake.cs │ │ │ ├── TestHelpers │ │ │ │ ├── TestHttpClientFactory.cs │ │ │ │ ├── BaseResponseExpectation.cs │ │ │ │ ├── JsonResponse.cs │ │ │ │ ├── TestUserFactory.cs │ │ │ │ └── TestContextHandler.cs │ │ │ └── EmbededResources.cs │ │ └── Au5.UnitTests │ │ │ ├── GlobalUsing.cs │ │ │ ├── Infrastructure │ │ │ └── AppResources.cs │ │ │ ├── Domain │ │ │ └── Entities │ │ │ │ └── UserTests.cs │ │ │ └── Application │ │ │ ├── Services │ │ │ └── MeetingUrlServiceTests.cs │ │ │ └── Features │ │ │ └── Meetings │ │ │ └── Rename │ │ │ └── RenameMeetingCommandValidatorTests.cs │ ├── Directory.Build.props │ ├── .dockerignore │ ├── stylecop.json │ └── Au5.BackEnd.slnx └── stop-podman.ps1 ├── .github ├── dependabot.yml └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .dockerignore └── .vscode └── tasks.json /modules/panel/README.md: -------------------------------------------------------------------------------- 1 | ## Under Review 2 | -------------------------------------------------------------------------------- /modules/panel/.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ -------------------------------------------------------------------------------- /modules/extension/.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ -------------------------------------------------------------------------------- /modules/extension/src/ui/uiBundle.ts: -------------------------------------------------------------------------------- 1 | import "./chatPanel"; 2 | import "."; 3 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/GlobalUsing.cs: -------------------------------------------------------------------------------- 1 | global using Au5.Domain.Common; 2 | -------------------------------------------------------------------------------- /modules/panel/app/403/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(pages)/403"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(pages)/landing"; 2 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/xunit.runner.json: -------------------------------------------------------------------------------- 1 | { 2 | "shadowCopy": false 3 | } -------------------------------------------------------------------------------- /modules/panel/app/(pages)/login/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(pages)/login"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(pages)/onboarding/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(pages)/onboarding"; -------------------------------------------------------------------------------- /modules/panel/app/(pages)/signup/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(pages)/signup"; 2 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/GLobalUsing.cs: -------------------------------------------------------------------------------- 1 | global using Au5.IntegrationTests.Application; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/spaces/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/spaces"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/users/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/users"; 2 | -------------------------------------------------------------------------------- /modules/panel/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/favicon.ico -------------------------------------------------------------------------------- /modules/extension/dist/extension.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/extension.rar -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/settings/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/settings"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/assistants/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/assistants"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/meetings/my/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/meetings/my"; 2 | -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/playground/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/playground"; 2 | -------------------------------------------------------------------------------- /modules/extension/dist/assets/icons/16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/icons/16x.png -------------------------------------------------------------------------------- /modules/extension/src/assets/icons/128x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/icons/128x.png -------------------------------------------------------------------------------- /modules/extension/src/assets/icons/16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/icons/16x.png -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/meetings/archived/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/meetings/archived"; 2 | -------------------------------------------------------------------------------- /modules/panel/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /modules/panel/public/assets/icons/128x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/assets/icons/128x.png -------------------------------------------------------------------------------- /modules/panel/public/assets/images/hi5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/assets/images/hi5.png -------------------------------------------------------------------------------- /modules/extension/dist/assets/icons/128x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/icons/128x.png -------------------------------------------------------------------------------- /modules/panel/public/assets/images/welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/assets/images/welcome.png -------------------------------------------------------------------------------- /modules/extension/dist/assets/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /modules/extension/src/assets/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /modules/extension/src/assets/icons/default-avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/icons/default-avatar.jpg -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/spaces/[spaceId]/meetings/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/spaces/[spaceId]/meetings"; 2 | -------------------------------------------------------------------------------- /modules/panel/public/assets/images/default-avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/assets/images/default-avatar.jpg -------------------------------------------------------------------------------- /modules/panel/shared/components/meetings/index.ts: -------------------------------------------------------------------------------- 1 | export { MeetingCard } from "./meeting-card"; 2 | export { MeetingsList } from "./meetings-list"; 3 | -------------------------------------------------------------------------------- /modules/panel/shared/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./auth"; 2 | export * from "./config"; 3 | export * from "./meeting"; 4 | export * from "./user"; 5 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export { useSignup } from "./use-signup"; 2 | export { useSignupForm } from "./use-signup-form"; 3 | -------------------------------------------------------------------------------- /modules/extension/dist/assets/icons/default-avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/icons/default-avatar.jpg -------------------------------------------------------------------------------- /modules/panel/public/assets/images/extension-install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/panel/public/assets/images/extension-install.png -------------------------------------------------------------------------------- /modules/extension/dist/assets/images/no-active-meeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/images/no-active-meeting.png -------------------------------------------------------------------------------- /modules/extension/dist/assets/images/user-unauthorized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/images/user-unauthorized.png -------------------------------------------------------------------------------- /modules/extension/src/assets/images/no-active-meeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/images/no-active-meeting.png -------------------------------------------------------------------------------- /modules/extension/src/assets/images/user-unauthorized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/images/user-unauthorized.png -------------------------------------------------------------------------------- /modules/extension/dist/assets/images/meeting_not_started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/dist/assets/images/meeting_not_started.png -------------------------------------------------------------------------------- /modules/extension/src/assets/images/meeting_not_started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Au5-ai/Au5/HEAD/modules/extension/src/assets/images/meeting_not_started.png -------------------------------------------------------------------------------- /modules/panel/app/(authenticated)/meetings/[meetingId]/transcription/page.tsx: -------------------------------------------------------------------------------- 1 | export { default } from "@/views/(authenticated)/meetings/[meetingId]/transcription"; 2 | -------------------------------------------------------------------------------- /modules/panel/public/assets/icons/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/panel/shared/config.ts: -------------------------------------------------------------------------------- 1 | export const API_BASE_URL = process.env.API_BASE_URL || "https://api.riter.ir"; 2 | // export const API_BASE_URL = "http://localhost:1366"; 3 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Common/UserStatus.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Common; 2 | 3 | public enum UserStatus 4 | { 5 | SendVerificationLink = 0, 6 | CompleteSignUp = 1 7 | } 8 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.AppHost/Program.cs: -------------------------------------------------------------------------------- 1 | var builder = DistributedApplication.CreateBuilder(args); 2 | 3 | builder.AddProject("au5-backend"); 4 | 5 | builder.Build().Run(); 6 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.AppHost/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/ToggleArchive/ToggleArchiveResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.ToggleArchive; 2 | 3 | public record ToggleArchiveResponse(bool IsArchived); -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Common/Guest.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Common; 2 | 3 | public class Guest 4 | { 5 | public string FullName { get; set; } 6 | 7 | public string PictureUrl { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/IResult.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Shared; 2 | 3 | public interface IResult 4 | { 5 | bool IsSuccess { get; } 6 | 7 | Error Error { get; } 8 | 9 | object GetData(); 10 | } 11 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/utils/index.ts: -------------------------------------------------------------------------------- 1 | export { validators } from "./validators"; 2 | export { VALIDATION_RULES } from "./validation-constants"; 3 | export type { ValidationResult } from "./validators"; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/ToggleFavorite/ToggleFavoriteResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.ToggleFavorite; 2 | 3 | public record ToggleFavoriteResponse(bool IsFavorite); 4 | -------------------------------------------------------------------------------- /modules/panel/shared/lib/utils.ts: -------------------------------------------------------------------------------- 1 | export * from "./styling-utils"; 2 | export * from "./validation-utils"; 3 | export * from "./animation-utils"; 4 | export * from "./formatting-utils"; 5 | export * from "./user-utils"; 6 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/AI/Delete/DeleteAIContentCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.AI.Delete; 2 | 3 | public record DeleteAIContentCommand(Guid Id, Guid MeetingId) : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/Export/ExportQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.Export; 2 | 3 | public record ExportQuery(Guid MeetingId, string Format) : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/GetMyInfo/GetMyInfoQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.GetMyInfo; 2 | 3 | public record GetMyInfoQuery() : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/GetUsers/GetUsersQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.GetUsers; 2 | 3 | public record GetUsersQuery : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/Message.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public abstract class Message 4 | { 5 | public string MeetId { get; set; } 6 | 7 | public abstract string Type { get; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/ErrorType.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Shared; 2 | 3 | public enum ErrorType 4 | { 5 | Failure = 500, 6 | Validation = 400, 7 | NotFound = 404, 8 | Unauthorized = 401, 9 | Forbidden = 403 10 | } 11 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/index.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import SignupClient from "@/views/(pages)/signup/components/signup-client"; 4 | 5 | export default function SignupPage() { 6 | return ; 7 | } 8 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Organizations/GetConfig/OrganizationQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Organizations.GetConfig; 2 | 3 | public record OrganizationQuery : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /modules/extension/src/api/types.ts: -------------------------------------------------------------------------------- 1 | export interface RequestAddBotModel { 2 | meetId: string; 3 | platform: string; 4 | } 5 | 6 | export interface CloseMeetingModel { 7 | meetId: string; 8 | meetingId: string; 9 | } 10 | -------------------------------------------------------------------------------- /modules/extension/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.css" { 2 | const content: string; 3 | export default content; 4 | } 5 | 6 | declare module "*.html" { 7 | const content: string; 8 | export default content; 9 | } 10 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/CloseMeetingMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class CloseMeetingMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.CloseMeeting; 6 | } 7 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Reactions/GetAllQuery/GetAllReactionsQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Reactions.GetAllQuery; 2 | 3 | public sealed record GetAllReactionsQuery() : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/Search/SearchUserQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.Search; 2 | 3 | public record SearchUserQuery(string Query) : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.AppHost/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning", 6 | "Aspire.Hosting.Dcp": "Warning" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Assistants/GetAll/GetAssistantsQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Assistants.GetAll; 2 | 3 | public record GetAssistantsQuery(bool? IsActive) : IRequest>>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/MeetingSpaces/AddMeetingToSpace/AddMeetingToSpaceResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.MeetingSpaces.AddMeetingToSpace; 2 | 3 | public record AddMeetingToSpaceResponse(bool Success, string Message); -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/ToggleArchive/ToggleArchiveCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.ToggleArchive; 2 | 3 | public record ToggleArchiveCommand(Guid MeetingId) : IRequest>; -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/AI/RunThreadRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.AI; 2 | 3 | public class RunThreadRequest 4 | { 5 | public string AssistantId { get; set; } 6 | 7 | public IEnumerable Messages { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Organizations/ExtensionConfig/ExtensionConfigQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Organizations.ExtensionConfig; 2 | 3 | public record ExtensionConfigQuery : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/panel/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | output: "standalone", 6 | reactStrictMode: false, 7 | }; 8 | 9 | export default nextConfig; 10 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/utils/validation-constants.ts: -------------------------------------------------------------------------------- 1 | export const VALIDATION_RULES = { 2 | fullname: { 3 | min: 2, 4 | max: 50, 5 | }, 6 | organizationName: { 7 | min: 2, 8 | max: 100, 9 | }, 10 | } as const; 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/CloseMeetingByUser/CloseMeetingByUserCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.CloseMeetingByUser; 2 | 3 | public record CloseMeetingByUserCommand(Guid MeetingId) : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/ToggleFavorite/ToggleFavoriteCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.ToggleFavorite; 2 | 3 | public record ToggleFavoriteCommand(Guid MeetingId) : IRequest>; 4 | -------------------------------------------------------------------------------- /modules/panel/shared/types/auth.ts: -------------------------------------------------------------------------------- 1 | export interface LoginRequest { 2 | username: string; 3 | password: string; 4 | } 5 | 6 | export interface LoginResponse { 7 | accessToken: string; 8 | tokenType?: string; 9 | expiresIn?: number; 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/MeetingSpaces/RemoveMeetingFromSpace/RemoveMeetingFromSpaceResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.MeetingSpaces.RemoveMeetingFromSpace; 2 | 3 | public record RemoveMeetingFromSpaceResponse(bool Success, string Message); -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/Application/AppResources.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.IntegrationTests.Application; 2 | 3 | public class AppResources 4 | { 5 | public const string ConfigAlreadyExist = "System Already Configured , You can set ForceUpdate=true."; 6 | } 7 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/RoleMenu.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class RoleMenu 5 | { 6 | public RoleTypes RoleType { get; set; } 7 | 8 | public int MenuId { get; set; } 9 | 10 | public Menu Menu { get; set; } 11 | } 12 | -------------------------------------------------------------------------------- /modules/panel/shared/types/assistants.ts: -------------------------------------------------------------------------------- 1 | export interface Assistant { 2 | id: string; 3 | name: string; 4 | llmModel: string; 5 | icon?: string; 6 | instructions?: string; 7 | isDefault?: boolean; 8 | isActive?: boolean; 9 | description?: string; 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/AI/Generate/AIGenerateCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.AI.Generate; 2 | 3 | public record AIGenerateCommand : IStreamRequest 4 | { 5 | public Guid MeetingId { get; set; } 6 | public Guid AssistantId { get; set; } 7 | } 8 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/MeetingDtos/SpaceDto.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.MeetingDtos; 2 | 3 | public class SpaceDto 4 | { 5 | public Guid Id { get; init; } 6 | 7 | public string Name { get; init; } 8 | 9 | public string Description { get; init; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/MeetingSpaces/AddMeetingToSpace/AddMeetingToSpaceCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.MeetingSpaces.AddMeetingToSpace; 2 | 3 | public record AddMeetingToSpaceCommand(Guid MeetingId, Guid SpaceId) : IRequest>; -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/MeetingIsActiveMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class MeetingIsActiveMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.MeetingIsActive; 6 | 7 | public string BotName { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/AddBot/AddBotCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.AddBot; 2 | 3 | public record AddBotCommand(string Platform, string MeetId) : IRequest>; 4 | public record AddBotCommandResponse(Guid MeetingId); 5 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "10.0.0", 7 | "commands": [ 8 | "dotnet-ef" 9 | ], 10 | "rollForward": false 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/BotJoinedInMeetingMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class BotJoinedInMeetingMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.BotJoinedInMeeting; 6 | 7 | public string BotName { get; init; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/panel/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": false, 6 | "printWidth": 80, 7 | "arrowParens": "always", 8 | "singleAttributePerLine": false, 9 | "bracketSameLine": true, 10 | "endOfLine": "auto" 11 | } 12 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/types.ts: -------------------------------------------------------------------------------- 1 | export interface AddUserRequest { 2 | email: string; 3 | fullName: string; 4 | password: string; 5 | repeatedPassword: string; 6 | organizationName: string; 7 | } 8 | 9 | export interface AddUserResponse { 10 | isDone: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/AI/CreateAssistantRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.AI; 2 | 3 | public class CreateAssistantRequest 4 | { 5 | public string Name { get; set; } 6 | 7 | public string Instructions { get; set; } 8 | 9 | public string Model { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/Rename/RenameMeetingCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.Rename; 2 | 3 | public record RenameMeetingCommand(Guid MeetingId, string NewTitle) : IRequest>; 4 | public record RenameMeetingCommandResponse(); 5 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/AuthorizationPolicies.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.BackEnd; 2 | 3 | public static class AuthorizationPolicies 4 | { 5 | public const string AdminOnly = nameof(AdminOnly); 6 | public const string UserOnly = nameof(UserOnly); 7 | public const string UserOrAdmin = nameof(UserOrAdmin); 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/MeetingSpaces/RemoveMeetingFromSpace/RemoveMeetingFromSpaceCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.MeetingSpaces.RemoveMeetingFromSpace; 2 | 3 | public record RemoveMeetingFromSpaceCommand(Guid MeetingId, Guid SpaceId) : IRequest>; -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "nuget" # packages repository 4 | directory: "/" # Location of package manifests 5 | schedule: 6 | interval: "weekly" # Period Of Scheduling 7 | day: "wednesday" # When 8 | open-pull-requests-limit: 8 # Limitaion of Pull-Request 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/GuestJoinedInMeetingMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class GuestJoinedInMeetingMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.GuestJoinedInMeeting; 6 | 7 | public IReadOnlyCollection Guests { get; set; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/extension/src/prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 120, 3 | tabWidth: 2, 4 | semi: true, 5 | trailingComma: "none", 6 | useTabs: false, 7 | singleQuote: false, 8 | bracketSpacing: false, 9 | arrowParens: "avoid", 10 | proseWrap: "never", 11 | requirePragma: false, 12 | }; 13 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/onboarding/index.tsx: -------------------------------------------------------------------------------- 1 | import { Suspense } from "react"; 2 | import OnboardingClient from "./components/onboardingClient"; 3 | 4 | export default function OnboardingPage() { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Spaces/GetSpaceMeetings/SpaceMeetingsQuery.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Features.Meetings.MyMeeting; 2 | 3 | namespace Au5.Application.Features.Spaces.GetSpaceMeetings; 4 | 5 | public record SpaceMeetingsQuery(Guid SpaceId) : IRequest>>; 6 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/VerifyUser/Query/VerifyUserQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.VerifyUser.Query; 2 | 3 | public record VerifyUserQuery(Guid UserId, string HashedEmail) : IRequest>; 4 | 5 | public record VerifyUserResponse(string Email); 6 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/GlobalUsing.cs: -------------------------------------------------------------------------------- 1 | global using Au5.Application; 2 | global using Au5.Application.Messages; 3 | global using Au5.BackEnd; 4 | global using Au5.BackEnd.Hubs; 5 | global using Au5.Infrastructure; 6 | global using Mediator; 7 | global using Microsoft.AspNetCore.Mvc; 8 | global using Microsoft.AspNetCore.SignalR; 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Common/EntityAttribute.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Common; 2 | 3 | /// 4 | /// This class is Entity Marker to find and register entities dynamically. 5 | /// 6 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 7 | public class EntityAttribute : Attribute 8 | { 9 | } 10 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Options/ServiceSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Common.Options; 2 | 3 | public class ServiceSettings 4 | { 5 | public const string SectionName = "ServiceSettings"; 6 | 7 | public bool UseRedis { get; set; } = false; 8 | 9 | public int TokenCleanupIntervalMinutes { get; set; } = 60; 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/PublicUrl/PublicMeetingUrlCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.PublicUrl; 2 | 3 | public record PublicMeetingUrlCommand(Guid MeetingId, int ExpirationDays) : IRequest>; 4 | public record PublicMeetingUrlResponse(string Link, DateTime ExpiryDate); 5 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/RequestToAddBotMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class RequestToAddBotMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.RequestToAddBot; 6 | 7 | public Participant User { get; set; } 8 | 9 | public string Platform { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/RemoveMeeting/RemoveMeetingCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.RemoveMeeting; 2 | 3 | public record RemoveMeetingCommand(Guid MeetingId) : IRequest>; 4 | 5 | public record class RemoveMeetingResponse 6 | { 7 | public bool IsRemoved { get; init; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Common/RoleTypes.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Common; 2 | 3 | public enum RoleTypes : byte 4 | { 5 | /// 6 | /// Administrator role with full system access. 7 | /// 8 | Admin = 1, 9 | 10 | /// 11 | /// Standard user role with limited access. 12 | /// 13 | User = 2, 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/UserJoinedInMeetingMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class UserJoinedInMeetingMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.UserJoinedInMeeting; 6 | 7 | public string Platform { get; set; } 8 | 9 | public Participant User { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | using Au5.BackEnd.Filters; 2 | using Microsoft.AspNetCore.Authorization; 3 | 4 | namespace Au5.BackEnd.Controllers; 5 | 6 | [Authorize] 7 | [ApiController] 8 | [ServiceFilter(typeof(ResultHandlingActionFilter))] 9 | [Route("[controller]")] 10 | public class BaseController : ControllerBase 11 | { 12 | } 13 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.UnitTests/GlobalUsing.cs: -------------------------------------------------------------------------------- 1 | global using System.Security.Claims; 2 | global using System.Text; 3 | global using Au5.Application.Common.Abstractions; 4 | global using Au5.Domain.Common; 5 | global using Au5.Infrastructure.Authentication; 6 | global using Microsoft.EntityFrameworkCore; 7 | global using Microsoft.Extensions.Options; 8 | global using Moq; 9 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/i18n.ts: -------------------------------------------------------------------------------- 1 | export const CAPTIONS = { 2 | downloadExtensionTitle: "Download Extension", 3 | downloadExtensionDescription: "Get the browser extension to get started", 4 | signupTitle: "Create Account", 5 | signupDescription: "Enter your details to create your account", 6 | downloadButtonText: "Add to Chrome - It's free!", 7 | } as const; 8 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/ICacheProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Common.Abstractions; 2 | 3 | public interface ICacheProvider 4 | { 5 | Task SetAsync(string key, T value, TimeSpan expiration); 6 | 7 | Task GetAsync(string key); 8 | 9 | Task RemoveAsync(string key); 10 | 11 | Task ExistsAsync(string key); 12 | } 13 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/PauseAndPlayTranscriptionMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class PauseAndPlayTranscriptionMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.PauseAndPlayTranscription; 6 | 7 | public Participant User { get; set; } 8 | 9 | public bool IsPaused { get; set; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Authentication/Login/LoginCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Authentication.Login; 2 | 3 | public record LoginCommand(string Username, string Password) : IRequest>; 4 | 5 | public record TokenResponse( 6 | string AccessToken, 7 | int ExpiresIn, 8 | string RefreshToken, 9 | string TokenType); 10 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/BlacklistedToken.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class BlacklistedToken 5 | { 6 | public Guid Id { get; set; } 7 | 8 | public string UserId { get; set; } 9 | 10 | public string Jti { get; set; } 11 | 12 | public DateTime ExpiresAt { get; set; } 13 | 14 | public DateTime BlacklistedAt { get; set; } 15 | } 16 | -------------------------------------------------------------------------------- /modules/panel/shared/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/shared/lib/utils"; 2 | 3 | function Skeleton({ className, ...props }: React.ComponentProps<"div">) { 4 | return ( 5 |
10 | ); 11 | } 12 | 13 | export { Skeleton }; 14 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Admin/Create/CreateAdminCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Admin.Create; 2 | 3 | public record CreateAdminCommand(string Email, string FullName, string Password, string RepeatedPassword, string OrganizationName) : IRequest>; 4 | 5 | public record CreateAdminResponse 6 | { 7 | public bool IsDone { get; init; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/panel/shared/providers/theme-provider.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import * as React from "react"; 4 | import { ThemeProvider as NextThemesProvider } from "next-themes"; 5 | 6 | export function ThemeProvider({ 7 | children, 8 | ...props 9 | }: React.ComponentProps) { 10 | return {children}; 11 | } 12 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Organizations/GetConfig/OrganizationResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Organizations.GetConfig; 2 | 3 | public record OrganizationResponse 4 | { 5 | public string OrganizationName { get; set; } 6 | 7 | public string BotName { get; set; } 8 | 9 | public string Direction { get; set; } 10 | 11 | public string Language { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Authentication/JwtSettings.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Infrastructure.Authentication; 2 | 3 | public class JwtSettings 4 | { 5 | public string SecretKey { get; set; } 6 | 7 | public string EncryptionKey { get; set; } 8 | 9 | public string Issuer { get; set; } 10 | 11 | public string Audience { get; set; } 12 | 13 | public int ExpiryMinutes { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/MeetingDtos/ReactionDto.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.MeetingDtos; 2 | 3 | public record ReactionDto 4 | { 5 | public int Id { get; init; } 6 | 7 | public string Type { get; init; } 8 | 9 | public string Emoji { get; init; } 10 | 11 | public string ClassName { get; init; } 12 | 13 | public IReadOnlyList Participants { get; init; } 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Spaces/SpaceMembers/SpaceMemebersQuery.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Dtos.Spaces; 2 | 3 | namespace Au5.Application.Features.Spaces.SpaceMembers; 4 | 5 | public record SpaceMemebersQuery(Guid SpaceId) : IRequest>; 6 | 7 | public record SpaceMembersResponse 8 | { 9 | public IReadOnlyCollection Users { get; init; } 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/UserSpace.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class UserSpace 5 | { 6 | public Guid UserId { get; set; } 7 | 8 | public User User { get; set; } 9 | 10 | public Guid SpaceId { get; set; } 11 | 12 | public Space Space { get; set; } 13 | 14 | public DateTime JoinedAt { get; set; } 15 | 16 | public bool IsAdmin { get; set; } 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/SmtpOptions.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos; 2 | 3 | public record SmtpOptions 4 | { 5 | public string Host { get; init; } 6 | public int Port { get; init; } 7 | public bool UseSsl { get; set; } 8 | public string User { get; init; } 9 | public string Password { get; init; } 10 | public string From { get; set; } 11 | public string BaseUrl { get; init; } 12 | } 13 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/ResendVerificationEmail/ResendVerificationEmailCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.ResendVerificationEmail; 2 | 3 | public record ResendVerificationEmailCommand : IRequest> 4 | { 5 | public Guid UserId { get; init; } 6 | } 7 | 8 | public record ResendVerificationEmailResponse(string Link); 9 | -------------------------------------------------------------------------------- /modules/backend/Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0 4 | enable 5 | true 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /modules/panel/public/assets/icons/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/panel/public/assets/icons/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Organizations/SetConfig/OrganizationCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Organizations.SetConfig; 2 | 3 | public record OrganizationCommand : IRequest 4 | { 5 | public string OrganizationName { get; init; } 6 | 7 | public string BotName { get; init; } 8 | 9 | public string Direction { get; init; } 10 | 11 | public string Language { get; init; } 12 | } 13 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/IDateTimeProvider.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Shared; 2 | 3 | public interface IDataProvider 4 | { 5 | DateTime Now { get; } 6 | 7 | DateTime UtcNow { get; } 8 | 9 | Guid NewGuid(); 10 | } 11 | 12 | public class SystemDataProvider : IDataProvider 13 | { 14 | public DateTime Now => DateTime.Now; 15 | 16 | public DateTime UtcNow => DateTime.UtcNow; 17 | 18 | public Guid NewGuid() => Guid.NewGuid(); 19 | } 20 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/ReactionAppliedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class ReactionAppliedMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.ReactionApplied; 6 | 7 | public int ReactionId { get; set; } 8 | 9 | public Guid BlockId { get; set; } 10 | 11 | public Participant User { get; set; } 12 | 13 | public string ReactionType { get; set; } 14 | } 15 | -------------------------------------------------------------------------------- /modules/panel/shared/routes.ts: -------------------------------------------------------------------------------- 1 | export const ROUTES = { 2 | SIGNUP: "/signup", 3 | LOGIN: "/login", 4 | PLAYGROUND: "/playground", 5 | FORBIDDEN: "/403", 6 | MEETINGS: { 7 | ROOT: "/meetings", 8 | TRANSCRIPTION: (meetingId: string) => 9 | `/meetings/${meetingId}/transcription`, 10 | }, 11 | EXTENSION_LINK: 12 | "https://github.com/Au5-ai/Au5/tree/main/modules/extension/dist/extension.rar", 13 | } as const; 14 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/VerifyUser/Command/VerifyUserCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.VerifyUser.Command; 2 | 3 | public record VerifyUserCommand(Guid UserId, Guid OrganizationId, string HashedEmail, string FullName, string Password, string RepeatedPassword) : IRequest>; 4 | 5 | public record VerifyUserResponse 6 | { 7 | public bool IsDone { get; init; } 8 | } 9 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/IAIClient.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Dtos.AI; 2 | 3 | namespace Au5.Application.Common.Abstractions; 4 | 5 | public interface IAIClient 6 | { 7 | Task> RunThreadAsync(RunThreadRequest request, CancellationToken cancellationToken = default); 8 | 9 | Task CreateAssistantAsync(CreateAssistantRequest request, CancellationToken cancellationToken = default); 10 | } 11 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/GlobalUsing.cs: -------------------------------------------------------------------------------- 1 | global using Au5.Application.Common.Abstractions; 2 | global using Au5.Application.Dtos.MeetingDtos; 3 | global using Au5.Application.Messages; 4 | global using Au5.Domain.Common; 5 | global using Au5.Domain.Entities; 6 | global using Au5.Shared; 7 | global using FluentValidation; 8 | global using FluentValidation.Results; 9 | global using Mediator; 10 | global using Microsoft.EntityFrameworkCore; 11 | -------------------------------------------------------------------------------- /modules/extension/src/core/platforms/googleMeet.ts: -------------------------------------------------------------------------------- 1 | import {IMeetingPlatform, platformRegex} from "../types"; 2 | 3 | export class GoogleMeet implements IMeetingPlatform { 4 | constructor(private url: string) {} 5 | getMeetId(): string { 6 | const match = this.url.match(platformRegex.googleMeet); 7 | return match ? `${match[1]}` : "Google Meet"; 8 | } 9 | 10 | getPlatformName(): string { 11 | return "GoogleMeet"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/EntryMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public class EntryMessage : Message 4 | { 5 | public override string Type => MessageTypesConstants.Entry; 6 | 7 | public Guid BlockId { get; set; } 8 | 9 | public string Content { get; set; } 10 | 11 | public DateTime Timestamp { get; set; } 12 | 13 | public string EntryType { get; set; } 14 | 15 | public Participant Participant { get; set; } 16 | } 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/MeetingSpace.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class MeetingSpace 5 | { 6 | public Guid MeetingId { get; set; } 7 | 8 | public Meeting Meeting { get; set; } 9 | 10 | public Guid SpaceId { get; set; } 11 | 12 | public Space Space { get; set; } 13 | 14 | public DateTime CreatedAt { get; set; } 15 | 16 | public Guid UserId { get; set; } 17 | 18 | public User User { get; set; } 19 | } 20 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Spaces/GetUserSpaces/UserSpacesQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Spaces.GetUserSpaces; 2 | 3 | public record UserSpacesQuery : IRequest>>; 4 | 5 | public record UserSpaceResponse 6 | { 7 | public Guid Id { get; init; } 8 | 9 | public string Name { get; init; } 10 | 11 | public string Description { get; init; } 12 | 13 | public bool IsAdmin { get; init; } 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/Spaces/SpaceUserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.Spaces; 2 | 3 | public record SpaceUserInfo 4 | { 5 | public Guid UserId { get; init; } 6 | 7 | public bool IsYou { get; init; } 8 | 9 | public string FullName { get; init; } 10 | 11 | public string Email { get; init; } 12 | 13 | public bool IsAdmin { get; init; } 14 | 15 | public string PictureUrl { get; init; } 16 | 17 | public DateTime JoinedAt { get; init; } 18 | } 19 | -------------------------------------------------------------------------------- /modules/panel/views/(authenticated)/assistants/models.ts: -------------------------------------------------------------------------------- 1 | export const Emojis = [ 2 | // General AI/robot 3 | "🤖", // AI/robot 4 | "✍️", // Author 5 | // Coding/Tech 6 | "💻", // Coding 7 | // Design/Creativity 8 | "🎨", // Design 9 | // Research/Knowledge 10 | "📚", // Knowledge 11 | "🧠", // Brain/analysis 12 | "🌐", // Language/translation 13 | // Support/Help 14 | "🦾", // Assistant/robotic arm 15 | // Engineering 16 | "🧑‍🔧", // Engineer 17 | ]; 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/IBotFatherAdapter.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Services.Models; 2 | 3 | namespace Au5.Application.Common.Abstractions; 4 | 5 | public interface IBotFatherAdapter 6 | { 7 | Task> CreateBotContainerAsync(string baseUrl, BotPayload payload, CancellationToken cancellationToken); 8 | 9 | Task> RemoveBotContainerAsync(string baseUrl, string meetId, string hashToken, CancellationToken cancellationToken); 10 | } 11 | -------------------------------------------------------------------------------- /modules/panel/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/onboarding/controllers/organizationsController.ts: -------------------------------------------------------------------------------- 1 | import { apiRequestClient } from "@/shared/network/apiRequestClient"; 2 | import { ExtensionConfig } from "../types"; 3 | import { API_URLS } from "@/shared/network/api/urls"; 4 | 5 | export const organizationsController = { 6 | getExtensionConfig: (): Promise => 7 | apiRequestClient(API_URLS.ORGANIZATION.EXTENSION_CONFIG, { 8 | method: "GET", 9 | }), 10 | }; 11 | -------------------------------------------------------------------------------- /modules/extension/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "bundler", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "outDir": "dist", 11 | "types": ["vite/client", "chrome"] 12 | }, 13 | "include": ["src/**/*.ts", "src/content.ts", "vite-env.d.ts", "src/**/*"], 14 | "exclude": ["node_modules"] 15 | } 16 | -------------------------------------------------------------------------------- /modules/panel/shared/types/network.ts: -------------------------------------------------------------------------------- 1 | export interface ProblemDetails { 2 | type?: string; 3 | title?: string; 4 | status?: number; 5 | detail?: string; 6 | traceId?: string; 7 | [key: string]: any; 8 | } 9 | 10 | export class ApiError extends Error { 11 | constructor( 12 | public status: number, 13 | public title: string, 14 | public problemDetails: ProblemDetails, 15 | ) { 16 | super(problemDetails.detail || title); 17 | this.name = "ApiError"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/TestCurrentUserServiceFake.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Common.Abstractions; 2 | using Au5.Domain.Common; 3 | 4 | namespace Au5.IntegrationTests; 5 | 6 | public class TestCurrentUserServiceFake : ICurrentUserService 7 | { 8 | public Guid UserId { get; set; } = Guid.Empty; 9 | 10 | public RoleTypes? Role { get; set; } = RoleTypes.Admin; 11 | 12 | public Guid OrganizationId { get; set; } = Guid.Empty; 13 | 14 | public bool IsAuthenticated { get; set; } = false; 15 | } 16 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/signup/api/signup-controller.ts: -------------------------------------------------------------------------------- 1 | import { apiRequestClient } from "@/shared/network/apiRequestClient"; 2 | import { AddUserRequest, AddUserResponse } from "../types"; 3 | import { API_URLS } from "@/shared/network/api/urls"; 4 | 5 | export const signupController = { 6 | createAdmin: (data: AddUserRequest): Promise => 7 | apiRequestClient(API_URLS.SINGUP.ADD_ADMIN, { 8 | method: "POST", 9 | body: JSON.stringify(data), 10 | }), 11 | }; 12 | -------------------------------------------------------------------------------- /modules/extension/src/core/utils/datetime.ts: -------------------------------------------------------------------------------- 1 | export namespace DateTime { 2 | export function toHoursAndMinutes(isoString: string): string; 3 | export function toHoursAndMinutes(date: Date): string; 4 | 5 | export function toHoursAndMinutes(input: string | Date): string { 6 | const date = typeof input === "string" ? new Date(input) : input; 7 | const hh = date.getUTCHours().toString().padStart(2, "0"); 8 | const mm = date.getUTCMinutes().toString().padStart(2, "0"); 9 | return `${hh}:${mm}`; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | **/.git 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md 26 | !**/.gitignore 27 | !.git/HEAD 28 | !.git/config 29 | !.git/packed-refs 30 | !.git/refs/heads/** -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/IApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore; 2 | 3 | namespace Au5.Application.Common.Abstractions; 4 | 5 | /// 6 | /// This interface facilitates communication between the application layer, infrastructure, and the DbContext. 7 | /// 8 | public interface IApplicationDbContext 9 | { 10 | public Task SaveChangesAsync(CancellationToken cancellationToken); 11 | 12 | DbSet Set() 13 | where TEntity : class; 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Assistants/AddAssistant/AddAssistantCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Assistants.AddAssistant; 2 | 3 | public class AddAssistantCommand : IRequest> 4 | { 5 | public string Name { get; init; } 6 | 7 | public string Icon { get; init; } 8 | 9 | public string Description { get; init; } 10 | 11 | public string Instructions { get; init; } 12 | 13 | public string LLMModel { get; set; } 14 | } 15 | 16 | public record AddAssisstantResponse(Guid Id); 17 | -------------------------------------------------------------------------------- /modules/panel/shared/lib/styling-utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | 8 | export const getColorFromName = (name: string) => { 9 | if (!name) return "#6b7280"; 10 | let hash = 0; 11 | for (let i = 0; i < name.length; i++) { 12 | hash = name.charCodeAt(i) + ((hash << 5) - hash); 13 | } 14 | const hue = hash % 360; 15 | return `hsl(${hue}, 70%, 65%)`; 16 | }; 17 | -------------------------------------------------------------------------------- /modules/panel/shared/types/config.ts: -------------------------------------------------------------------------------- 1 | export interface AppConfig { 2 | user: { 3 | id: string; 4 | fullName: string; 5 | pictureUrl?: string; 6 | }; 7 | service: { 8 | panelUrl: string; 9 | baseUrl: string; 10 | direction: string; 11 | language: string; 12 | hubUrl: string; 13 | companyName: string; 14 | botName: string; 15 | }; 16 | } 17 | 18 | export interface SystemConfigs { 19 | organizationName: string; 20 | botName: string; 21 | direction: string; 22 | language: string; 23 | } 24 | -------------------------------------------------------------------------------- /modules/panel/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } 22 | -------------------------------------------------------------------------------- /modules/backend/.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | **/.git 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md 26 | !**/.gitignore 27 | !.git/HEAD 28 | !.git/config 29 | !.git/packed-refs 30 | !.git/refs/heads/** -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/AddBot/AddBotCommand.Validator.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Common; 2 | 3 | namespace Au5.Application.Features.Meetings.AddBot; 4 | 5 | public class AddBotCommandValiadtor : AbstractValidator 6 | { 7 | public AddBotCommandValiadtor() 8 | { 9 | RuleFor(x => x.MeetId) 10 | .NotEmpty() 11 | .WithMessage(AppResources.Validation.Required); 12 | 13 | RuleFor(x => x.Platform) 14 | .NotEmpty() 15 | .WithMessage(AppResources.Validation.Required); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/ParticipantInMeeting.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class ParticipantInMeetingConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_ParticipantInMeeting"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /modules/panel/shared/models/secondary-sidebar.tsx: -------------------------------------------------------------------------------- 1 | import { Chrome, Gem, Info } from "lucide-react"; 2 | import { ROUTES } from "../routes"; 3 | 4 | const navSecondary = [ 5 | { 6 | title: "Install Chrome Extension", 7 | url: ROUTES.EXTENSION_LINK, 8 | icon: Chrome, 9 | }, 10 | { 11 | title: "Request a Feature", 12 | url: "https://github.com/Au5-ai/au5/issues", 13 | icon: Gem, 14 | }, 15 | { 16 | title: "About Riter", 17 | action: "about", 18 | icon: Info, 19 | }, 20 | ]; 21 | export { navSecondary }; 22 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Dtos/MeetingDtos/EntryDto.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Dtos.MeetingDtos; 2 | 3 | public record EntryDto 4 | { 5 | public Guid BlockId { get; init; } 6 | 7 | public Guid ParticipantId { get; init; } 8 | 9 | public string FullName { get; init; } 10 | 11 | public string Content { get; init; } 12 | 13 | public string Time { get; init; } 14 | 15 | public string Timeline { get; init; } 16 | 17 | public string EntryType { get; init; } 18 | 19 | public IReadOnlyList Reactions { get; init; } 20 | } 21 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Spaces/GetSpaces/SpacesQuery.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Dtos.Spaces; 2 | 3 | namespace Au5.Application.Features.Spaces.GetSpaces; 4 | 5 | public record SpacesQuery : IRequest>>; 6 | 7 | public record SpaceResponse 8 | { 9 | public Guid Id { get; init; } 10 | 11 | public string Name { get; init; } 12 | 13 | public string Description { get; init; } 14 | 15 | public bool IsActive { get; init; } 16 | 17 | public List Users { get; init; } 18 | } 19 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Common/Participant.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Common; 2 | 3 | public class Participant 4 | { 5 | public Participant() 6 | { 7 | } 8 | 9 | public Participant(Guid id, string fullName, string email, string pictureUrl) 10 | { 11 | Id = id; 12 | FullName = fullName; 13 | PictureUrl = pictureUrl; 14 | Email = email; 15 | } 16 | 17 | public Guid Id { get; set; } 18 | 19 | public string FullName { get; set; } 20 | 21 | public string PictureUrl { get; set; } 22 | 23 | public string Email { get; set; } 24 | } 25 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/ITokenService.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Features.Authentication.Login; 2 | 3 | namespace Au5.Application.Common.Abstractions; 4 | 5 | public interface ITokenService 6 | { 7 | TokenResponse GenerateToken(Guid extensionId, string fullName, RoleTypes role, Guid organizationId); 8 | 9 | string GenerateBotToken(Guid meetingId, string meetId); 10 | 11 | Task BlacklistTokenAsync(string userId, string jti, DateTime expiry); 12 | 13 | Task IsTokenBlacklistedAsync(string userId, string jti); 14 | } 15 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Controllers/AdminController.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Features.Admin.Create; 2 | using Microsoft.AspNetCore.Authorization; 3 | 4 | namespace Au5.BackEnd.Controllers; 5 | 6 | [Route("admin")] 7 | public class AdminController(ISender mediator) : BaseController 8 | { 9 | [HttpPost("hello")] 10 | [AllowAnonymous] 11 | [ProducesResponseType(StatusCodes.Status200OK)] 12 | public async Task CreateAdmin([FromBody] CreateAdminCommand command) 13 | { 14 | return Ok(await mediator.Send(command)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/Space.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class Space 5 | { 6 | public Guid Id { get; set; } 7 | 8 | public string Name { get; set; } 9 | 10 | public string Description { get; set; } 11 | 12 | public bool IsActive { get; set; } 13 | 14 | public Guid OrganizationId { get; set; } 15 | 16 | public Organization Organization { get; set; } 17 | 18 | public ICollection UserSpaces { get; set; } 19 | 20 | public ICollection MeetingSpaces { get; set; } 21 | } 22 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Au5.Domain.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | enable 6 | disable 7 | 8 | 9 | 10 | 11 | all 12 | runtime; build; native; contentfiles; analyzers; buildtransitive 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/AppliedReactions.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class AppliedReactions 5 | { 6 | public int Id { get; set; } 7 | 8 | public int EntryId { get; set; } 9 | 10 | public Entry Entry { get; set; } 11 | 12 | public int ReactionId { get; set; } 13 | 14 | public Reaction Reaction { get; set; } 15 | 16 | /// 17 | /// Gets or sets list of user IDs who applied this reaction to the entry as Json. 18 | /// 19 | public List Participants { get; set; } 20 | } 21 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/Au5.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | all 12 | runtime; build; native; contentfiles; analyzers; buildtransitive 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/Rename/RenameMeetingCommand.Validator.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Common; 2 | 3 | namespace Au5.Application.Features.Meetings.Rename; 4 | 5 | public class RenameMeetingCommandValidator : AbstractValidator 6 | { 7 | public RenameMeetingCommandValidator() 8 | { 9 | RuleFor(s => s.MeetingId) 10 | .NotEmpty() 11 | .WithMessage(AppResources.Validation.Required); 12 | 13 | RuleFor(s => s.NewTitle) 14 | .NotEmpty() 15 | .WithMessage(AppResources.Validation.Required); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/IEmailProvider.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Dtos; 2 | 3 | namespace Au5.Application.Common.Abstractions; 4 | 5 | public interface IEmailProvider 6 | { 7 | Task> SendInviteAsync(IReadOnlyCollection invited, string organizationName, SmtpOptions smtpOption); 8 | } 9 | 10 | public record InviteResponse 11 | { 12 | public string Email { get; init; } 13 | public Guid UserId { get; init; } 14 | public string Link { get; init; } 15 | public bool IsEmailSent { get; init; } 16 | } 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/ParticipantInMeeting.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class ParticipantInMeeting 5 | { 6 | public int Id { get; set; } 7 | 8 | public Guid MeetingId { get; set; } 9 | 10 | public Meeting Meeting { get; set; } 11 | 12 | /// 13 | /// Gets or sets the user ID of the participant in the meeting. 14 | /// It can be optional if the participant does not have an account in the system. 15 | /// 16 | public Guid UserId { get; set; } 17 | 18 | public User User { get; set; } 19 | } 20 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/Reaction.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations.Schema; 2 | 3 | namespace Au5.Domain.Entities; 4 | 5 | [Entity] 6 | public class Reaction 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Type { get; set; } 11 | 12 | public string Emoji { get; set; } 13 | 14 | public string ClassName { get; set; } 15 | 16 | public bool IsActive { get; set; } 17 | 18 | public Guid OrganizationId { get; set; } 19 | 20 | [ForeignKey(nameof(OrganizationId))] 21 | public Organization Organization { get; set; } 22 | } 23 | -------------------------------------------------------------------------------- /modules/backend/stylecop.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", 3 | "settings": { 4 | "indentation": { 5 | "useTabs": true 6 | }, 7 | "orderingRules": { 8 | "usingDirectivesPlacement": "outsideNamespace" 9 | }, 10 | "namingRules": { 11 | "allowCommonHungarianPrefixes": true, 12 | "allowedHungarianPrefixes": [ 13 | "db", 14 | "co", 15 | "e" 16 | ] 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /modules/panel/views/(pages)/onboarding/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useMutation } from "@tanstack/react-query"; 2 | import { AddUserRequest, AddUserResponse } from "./types"; 3 | import { userController } from "./controllers/userController"; 4 | 5 | export function useSignup() { 6 | return useMutation({ 7 | mutationFn: userController.verifyUser, 8 | onSuccess: async () => {}, 9 | // onError: (error) => { 10 | // const message = handleAuthError(error); 11 | // toast.error(message); 12 | // }, 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "Dev: Start React Panel", 6 | "type": "shell", 7 | "command": "npm", 8 | "args": ["run", "dev"], 9 | "group": "build", 10 | "isBackground": true, 11 | "options": { 12 | "cwd": "${workspaceFolder}/modules/panel" 13 | }, 14 | "problemMatcher": [], 15 | "presentation": { 16 | "echo": true, 17 | "reveal": "always", 18 | "focus": false, 19 | "panel": "new" 20 | } 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/Entry.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class Entry 5 | { 6 | public int Id { get; set; } 7 | 8 | public Guid BlockId { get; set; } 9 | 10 | public Guid ParticipantId { get; set; } 11 | 12 | public string FullName { get; set; } 13 | 14 | public string Content { get; set; } 15 | 16 | public DateTime Timestamp { get; set; } 17 | 18 | public string Timeline { get; set; } 19 | 20 | public string EntryType { get; set; } 21 | 22 | public ICollection Reactions { get; set; } 23 | } 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[Feat]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Additional context (Optional)** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /modules/panel/views/(authenticated)/assistants/i18n.ts: -------------------------------------------------------------------------------- 1 | export const ASSISTANTS_CAPTIONS = { 2 | title: "AI Assistants", 3 | description: 4 | "Create and manage your custom AI assistants to boost productivity and automate tasks.", 5 | addAITools: "Add Assistant", 6 | errorLoading: "Sorry, we couldn't load your assistants. Please try again.", 7 | successAdd: "Your new assistant was added!", 8 | fields: { 9 | name: "Assistant Name", 10 | instructions: "Instructions (what should this assistant do?)", 11 | description: "Short Description", 12 | }, 13 | }; 14 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Controllers/ReactionsController.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Features.Reactions.GetAllQuery; 2 | using Microsoft.AspNetCore.Authorization; 3 | 4 | namespace Au5.BackEnd.Controllers; 5 | 6 | public class ReactionsController(ISender mediator) : BaseController 7 | { 8 | [HttpGet] 9 | [ProducesResponseType(StatusCodes.Status200OK)] 10 | [Authorize(Policy = AuthorizationPolicies.UserOrAdmin)] 11 | public async ValueTask GetAll(CancellationToken ct) 12 | { 13 | return Ok(await mediator.Send(new GetAllReactionsQuery(), ct)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/TestHelpers/TestHttpClientFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.IntegrationTests.TestHelpers; 2 | 3 | public class TestHttpClientFactory : IHttpClientFactory 4 | { 5 | private readonly FakeHttpMessageHandler _fakeHttpMessageHandler; 6 | 7 | public TestHttpClientFactory(FakeHttpMessageHandler fakeHandler) 8 | { 9 | _fakeHttpMessageHandler = fakeHandler; 10 | } 11 | 12 | public HttpClient CreateClient(string name) 13 | { 14 | var httpClient = new HttpClient(_fakeHttpMessageHandler, disposeHandler: true); 15 | return httpClient; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/ClaimConstants.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Claims; 2 | 3 | namespace Au5.Shared; 4 | 5 | public static class ClaimConstants 6 | { 7 | public const string UserId = ClaimTypes.NameIdentifier; 8 | public const string Name = ClaimTypes.Name; 9 | public const string Role = ClaimTypes.Role; 10 | public const string OrganizationId = "organization_id"; 11 | public const string Jti = "jti"; 12 | public const string Exp = "exp"; 13 | public const string MeetingId = "meeting_id"; 14 | public const string MeetId = "meet_id"; 15 | public const string Type = "type"; 16 | } 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Organizations/ExtensionConfig/ExtensionConfigResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Organizations.ExtensionConfig; 2 | 3 | public record ExtensionConfigResponse 4 | { 5 | public Participant User { get; init; } 6 | public Service Service { get; init; } 7 | } 8 | 9 | public record Service 10 | { 11 | public string HubUrl { get; init; } 12 | 13 | public string Direction { get; init; } 14 | 15 | public string Language { get; init; } 16 | 17 | public string ServiceBaseUrl { get; init; } 18 | 19 | public string PanelUrl { get; init; } 20 | } 21 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Spaces/CreateSpace/CreateSpaceCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Spaces.CreateSpace; 2 | 3 | public record CreateSpaceCommand : IRequest> 4 | { 5 | public string Name { get; init; } 6 | 7 | public string Description { get; init; } 8 | 9 | public List Users { get; init; } 10 | } 11 | 12 | public record UserInSpace 13 | { 14 | public Guid UserId { get; init; } 15 | 16 | public bool IsAdmin { get; init; } 17 | } 18 | 19 | public record CreateSpaceResponse 20 | { 21 | public Guid Id { get; init; } 22 | } 23 | -------------------------------------------------------------------------------- /modules/panel/shared/network/api/authController.ts: -------------------------------------------------------------------------------- 1 | import { LoginRequest, LoginResponse } from "@/shared/types"; 2 | import { apiRequestClient } from "../apiRequestClient"; 3 | import { API_URLS } from "./urls"; 4 | 5 | export const authController = { 6 | login: (credentials: LoginRequest): Promise => 7 | apiRequestClient(API_URLS.AUTH.LOGIN, { 8 | method: "POST", 9 | body: JSON.stringify(credentials), 10 | }), 11 | 12 | logout: (): Promise => 13 | apiRequestClient(API_URLS.AUTH.LOGOUT, { 14 | method: "POST", 15 | }), 16 | }; 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/Menu.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class Menu 5 | { 6 | public int Id { get; set; } 7 | 8 | public string Title { get; set; } 9 | 10 | public string Url { get; set; } 11 | 12 | public string Icon { get; set; } 13 | 14 | public int? ParentId { get; set; } 15 | 16 | public int SortOrder { get; set; } 17 | 18 | public bool IsActive { get; set; } 19 | 20 | public Menu Parent { get; set; } 21 | 22 | public ICollection Children { get; set; } = []; 23 | 24 | public ICollection RoleMenus { get; set; } = []; 25 | } 26 | -------------------------------------------------------------------------------- /modules/panel/shared/lib/validation-utils.ts: -------------------------------------------------------------------------------- 1 | export const validateUrl = (url: string): boolean => { 2 | try { 3 | new URL(url); 4 | return true; 5 | } catch { 6 | return false; 7 | } 8 | }; 9 | 10 | export const validateEmail = (email: string): boolean => { 11 | const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 12 | return emailRegex.test(email); 13 | }; 14 | 15 | export const validatePassword = (password: string): boolean => { 16 | const passwordRegex = 17 | /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; 18 | return passwordRegex.test(password); 19 | }; 20 | -------------------------------------------------------------------------------- /modules/panel/shared/network/api/systemController.ts: -------------------------------------------------------------------------------- 1 | import { SystemConfigs } from "@/shared/types"; 2 | import { apiRequestClient } from "../apiRequestClient"; 3 | import { API_URLS } from "./urls"; 4 | 5 | export const systemController = { 6 | getConfig: (): Promise => 7 | apiRequestClient(API_URLS.ORGANIZATION.CONFIG, { 8 | method: "GET", 9 | }), 10 | 11 | setConfig: (configs: SystemConfigs): Promise => 12 | apiRequestClient(API_URLS.ORGANIZATION.CONFIG, { 13 | method: "POST", 14 | body: JSON.stringify(configs), 15 | }), 16 | }; 17 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/login/i18n.ts: -------------------------------------------------------------------------------- 1 | export const loginCaptions = { 2 | title: "Login to your account", 3 | subtitle: "Enter your email below to login to your account", 4 | loginButton: "Login", 5 | loggingInButton: "Logging in...", 6 | orContinueWith: "Or continue with", 7 | noAccountText: "Don't have an account?", 8 | createAccountLink: "Create an account", 9 | welcomeBackTitle: "Welcome Back", 10 | successLogin: "Successfully logged in!", 11 | welcomeMessage: 12 | "Empower your meetings with real-time transcription, smart automation, and seamless integrations.", 13 | } as const; 14 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Scripts/DropTables.sql: -------------------------------------------------------------------------------- 1 | Drop table [dbo].[AIContents] 2 | Drop table [dbo].[AppliedReactions] 3 | Drop table [dbo].[Assistant] 4 | Drop table [dbo].[GuestsInMeeting] 5 | Drop table [dbo].[MeetingSpace] 6 | Drop table [dbo].[MigrationHistory] 7 | Drop table [dbo].[ParticipantInMeeting] 8 | Drop table [dbo].[Reaction] 9 | Drop table [dbo].[RoleMenus] 10 | Drop table [dbo].[Menus] 11 | Drop table [dbo].[UserSpace] 12 | Drop table [dbo].[Space] 13 | Drop table [dbo].[Entry] 14 | Drop table [dbo].[Meeting] 15 | Drop table [dbo].[User] 16 | Drop table [dbo].[Organization] 17 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Shared/HashHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Cryptography; 2 | using System.Text; 3 | 4 | namespace Au5.Shared; 5 | 6 | public static class HashHelper 7 | { 8 | public static string HashPassword(string password, Guid salt) 9 | { 10 | var salted = Encoding.UTF8.GetBytes(password + salt); 11 | var hash = SHA256.HashData(salted); 12 | return Convert.ToBase64String(hash); 13 | } 14 | 15 | public static string HashSafe(string data) 16 | { 17 | var bytes = Encoding.UTF8.GetBytes(data); 18 | var hash = SHA256.HashData(bytes); 19 | return Convert.ToHexString(hash); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /modules/extension/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import globals from "globals"; 3 | import tseslint from "typescript-eslint"; 4 | import unicorn from "eslint-plugin-unicorn"; 5 | import { defineConfig } from "eslint/config"; 6 | 7 | export default defineConfig([ 8 | { 9 | files: ["**/*.{js,ts,mjs,cjs,cts,mts}"], 10 | languageOptions: { 11 | globals: globals.browser, 12 | }, 13 | plugins: { 14 | js, 15 | unicorn, 16 | }, 17 | rules: { 18 | ...unicorn.configs.recommended.rules, 19 | }, 20 | }, 21 | ...tseslint.configs.recommended, 22 | ]); 23 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/Export/ExportQuery.Validator.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.Meetings.Export; 2 | 3 | public class ExportQueryValidator : AbstractValidator 4 | { 5 | public ExportQueryValidator() 6 | { 7 | RuleFor(x => x.MeetingId) 8 | .NotEmpty() 9 | .WithMessage("Meeting ID is required."); 10 | 11 | RuleFor(x => x.Format) 12 | .NotEmpty() 13 | .WithMessage("Format is required.") 14 | .Must(format => string.Equals(format, "text", StringComparison.OrdinalIgnoreCase)) 15 | .WithMessage("Only 'text' format is currently supported."); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/GetUserMenus/GetUserMenusQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.GetUserMenus; 2 | 3 | public record GetUserMenusQuery() : IRequest>>; 4 | 5 | public class GetUserMenusResponse 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Title { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string Icon { get; set; } 14 | 15 | public bool ShowBadge { get; set; } 16 | 17 | public string Badge { get; set; } 18 | 19 | public List Children { get; set; } = []; 20 | } 21 | -------------------------------------------------------------------------------- /modules/panel/views/(authenticated)/settings/i18n.ts: -------------------------------------------------------------------------------- 1 | export const SYSTEM_CAPTIONS = { 2 | title: "Settings", 3 | description: "Configure your bot and meeting organization parameters", 4 | tabs: { 5 | configuration: "Configuration", 6 | reactions: "Reactions", 7 | ai: "AI", 8 | autoCorrection: "Auto Correction", 9 | personalize: "Personalize", 10 | }, 11 | tabsContent: { 12 | reactions: "Manage your reactions here.", 13 | ai: "Manage your AI here.", 14 | autoCorrection: "Manage your auto correction here.", 15 | personalization: "Manage your personalization here.", 16 | }, 17 | } as const; 18 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/onboarding/types.ts: -------------------------------------------------------------------------------- 1 | export interface ExtensionConfig { 2 | service: { 3 | panelUrl: string; 4 | serviceBaseUrl: string; 5 | direction: string; 6 | language: string; 7 | hubUrl: string; 8 | organizationName: string; 9 | }; 10 | user: { 11 | id: string; 12 | fullName: string; 13 | pictureUrl: string; 14 | }; 15 | } 16 | 17 | export interface AddUserRequest { 18 | userId: string; 19 | hashedEmail: string; 20 | fullName: string; 21 | password: string; 22 | repeatedPassword: string; 23 | } 24 | 25 | export interface AddUserResponse { 26 | isDone: boolean; 27 | } 28 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/TestHelpers/BaseResponseExpectation.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | 3 | namespace Au5.IntegrationTests.TestHelpers; 4 | 5 | public abstract class BaseResponseExpectation 6 | { 7 | public string ExpectedRequest { get; set; } = string.Empty; 8 | 9 | required public HttpMethod Method { get; init; } 10 | 11 | required public string RequestAddress { get; init; } 12 | 13 | public HttpStatusCode ResponseStatusCode { get; init; } = HttpStatusCode.OK; 14 | 15 | public bool OneTimeUse { get; set; } = true; 16 | 17 | public abstract HttpResponseMessage ToHttpResponseMessage(HttpRequestMessage request); 18 | } 19 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/AppliedReactionsConfig.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class AppliedReactionsConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_AppliedReactions"); 13 | 14 | builder.OwnsMany(t => t.Participants, participants => 15 | { 16 | participants.ToJson(); 17 | }); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Meetings/PublicUrl/PublicMeetingUrlCommand.Validator.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Common; 2 | 3 | namespace Au5.Application.Features.Meetings.PublicUrl; 4 | 5 | public class PublicMeetingUrlCommandValidator : AbstractValidator 6 | { 7 | public PublicMeetingUrlCommandValidator() 8 | { 9 | RuleFor(s => s.MeetingId) 10 | .NotEmpty() 11 | .WithMessage(AppResources.Validation.Required); 12 | RuleFor(s => s.ExpirationDays) 13 | .NotNull() 14 | .Must(s => s is 30 or 60 or 90) 15 | .WithMessage("ExpirationDays must be one of the following values: 30, 60, or 90."); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/panel/shared/hooks/use-runtime-config.ts: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useQuery } from "@tanstack/react-query"; 4 | 5 | interface RuntimeConfig { 6 | apiBaseUrl: string; 7 | } 8 | 9 | export function useRuntimeConfig() { 10 | return useQuery({ 11 | queryKey: ["runtime-config"], 12 | queryFn: async () => { 13 | const response = await fetch("/api/config"); 14 | if (!response.ok) { 15 | throw new Error("Failed to fetch runtime config"); 16 | } 17 | return response.json(); 18 | }, 19 | staleTime: Infinity, // Config doesn't change during runtime 20 | refetchOnWindowFocus: false, 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /modules/panel/shared/lib/formatting-utils.ts: -------------------------------------------------------------------------------- 1 | export const formatDuration = (timeString: string): string => { 2 | if (!timeString) return "0 min"; 3 | 4 | const [hours, minutes] = timeString.split(":"); 5 | const totalMinutes = parseInt(hours) * 60 + parseInt(minutes); 6 | 7 | return `${totalMinutes} min`; 8 | }; 9 | 10 | export const truncateFirstLine = ( 11 | text: string | null | undefined, 12 | maxLength: number = 48, 13 | ): string | null => { 14 | if (!text) return null; 15 | const firstLine = text.split(/\r?\n/)[0]; 16 | if (firstLine.length > maxLength) { 17 | return firstLine.slice(0, maxLength) + " ..."; 18 | } 19 | return firstLine; 20 | }; 21 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/Organization.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json.Serialization; 2 | 3 | namespace Au5.Domain.Entities; 4 | 5 | [Entity] 6 | public class Organization 7 | { 8 | [JsonIgnore] 9 | public Guid Id { get; set; } 10 | 11 | public string OrganizationName { get; set; } 12 | 13 | public string BotName { get; set; } 14 | 15 | public string Direction { get; set; } 16 | 17 | public string Language { get; set; } 18 | 19 | [JsonIgnore] 20 | public ICollection Users { get; set; } 21 | 22 | [JsonIgnore] 23 | public ICollection Reactions { get; set; } 24 | 25 | [JsonIgnore] 26 | public ICollection Assistants { get; set; } 27 | } 28 | -------------------------------------------------------------------------------- /modules/panel/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /modules/panel/shared/components/platform-logo.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; 3 | 4 | interface PlatformLogoProps { 5 | platform: string; 6 | } 7 | 8 | const PLATFORM_LOGOS: Record = { 9 | googlemeet: "/assets/images/googleMeets.svg", 10 | teams: "/assets/images/meets.svg", 11 | }; 12 | 13 | const DEFAULT_LOGO = "/assets/images/meets.svg"; 14 | 15 | export function PlatformLogo({ platform }: PlatformLogoProps) { 16 | const logoSrc = 17 | PLATFORM_LOGOS[platform.replace(" ", "").toLowerCase()] || DEFAULT_LOGO; 18 | 19 | return ( 20 | {`${platform} 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/DateTimeExtension.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Common; 2 | public static class DateTimeExtensions 3 | { 4 | public static TimeSpan DiffTo(this DateTime start, DateTime end) 5 | { 6 | return end - start; 7 | } 8 | 9 | public static string ToReadableString(this TimeSpan timeSpan) 10 | { 11 | if (timeSpan.TotalMinutes < 1) 12 | { 13 | return $"{timeSpan.Seconds}s"; 14 | } 15 | 16 | if (timeSpan.TotalHours < 1) 17 | { 18 | return $"{timeSpan.Minutes}m"; 19 | } 20 | 21 | return timeSpan.TotalDays < 1 22 | ? $"{timeSpan.Hours}h {timeSpan.Minutes}m" 23 | : $"{timeSpan.Days}d {timeSpan.Hours}h {timeSpan.Minutes}m"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Extensions/ClaimsPrincipalExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Claims; 2 | using Au5.Domain.Common; 3 | 4 | namespace Au5.BackEnd.Extensions; 5 | 6 | public static class ClaimsPrincipalExtensions 7 | { 8 | public static Participant ToParticipant(this ClaimsPrincipal principal) 9 | { 10 | ArgumentNullException.ThrowIfNull(principal); 11 | 12 | return new Participant 13 | { 14 | Id = Guid.TryParse(principal.FindFirst(ClaimTypes.NameIdentifier)?.Value, out var id) ? id : Guid.Empty, 15 | FullName = principal.FindFirstValue(ClaimTypes.Name) ?? string.Empty, 16 | PictureUrl = principal.FindFirstValue("pictureUrl") ?? string.Empty, 17 | }; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /modules/panel/shared/components/loading-page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { GLOBAL_CAPTIONS } from "@/shared/i18n/captions"; 4 | 5 | interface LoadingPageProps { 6 | text?: string; 7 | className?: string; 8 | } 9 | 10 | export function LoadingPage({ 11 | text = GLOBAL_CAPTIONS.loading, 12 | }: LoadingPageProps) { 13 | return ( 14 |
15 |
16 |
17 |

{text}

18 |
19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /modules/panel/shared/hooks/use-mobile.ts: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | const MOBILE_BREAKPOINT = 768; 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState( 7 | undefined, 8 | ); 9 | 10 | React.useEffect(() => { 11 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); 12 | const onChange = () => { 13 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 14 | }; 15 | mql.addEventListener("change", onChange); 16 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); 17 | return () => mql.removeEventListener("change", onChange); 18 | }, []); 19 | 20 | return !!isMobile; 21 | } 22 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Adapters/ISmtpClientWrapper.cs: -------------------------------------------------------------------------------- 1 | using MailKit.Net.Smtp; 2 | using MimeKit; 3 | 4 | namespace Au5.Infrastructure.Adapters; 5 | 6 | public interface ISmtpClientWrapper : IDisposable 7 | { 8 | SmtpCapabilities Capabilities { get; } 9 | 10 | Task ConnectAsync(string host, int port, MailKit.Security.SecureSocketOptions options, CancellationToken cancellationToken = default); 11 | 12 | Task AuthenticateAsync(string user, string password, CancellationToken cancellationToken = default); 13 | 14 | Task SendAsync(MimeMessage message, CancellationToken cancellationToken = default); 15 | 16 | Task DisconnectAsync(bool quit, CancellationToken cancellationToken = default); 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Common/Abstractions/IMeetingService.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Common.Abstractions; 2 | 3 | public interface IMeetingService 4 | { 5 | string GetMeetingKey(string meetId); 6 | 7 | Task AddUserToMeeting(UserJoinedInMeetingMessage userJoined); 8 | 9 | Task AddGuestsToMeet(string meetId, IReadOnlyCollection guests); 10 | 11 | Task BotIsAdded(string meetId, string botName); 12 | 13 | Task PauseMeeting(string meetId, bool isPause); 14 | 15 | Task UpsertBlock(EntryMessage entry); 16 | 17 | Task AppliedReaction(ReactionAppliedMessage reaction); 18 | 19 | Task CloseMeeting(string meetId, CancellationToken cancellationToken); 20 | } 21 | -------------------------------------------------------------------------------- /modules/extension/src/assets/icons/light_mode.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/GuestsInMeetingConfig.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class GuestsInMeetingConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_GuestsInMeeting"); 13 | 14 | builder.Property(m => m.FullName) 15 | .IsUnicode(true) 16 | .HasMaxLength(50); 17 | 18 | builder.Property(m => m.PictureUrl) 19 | .IsUnicode(true) 20 | .HasMaxLength(250); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /modules/extension/dist/assets/icons/light_mode.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /modules/panel/shared/components/ui/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./avatar"; 2 | export * from "./badge"; 3 | export * from "./breadcrumb"; 4 | export * from "./button"; 5 | export * from "./card"; 6 | export * from "./collapsible"; 7 | export * from "./dialog"; 8 | export * from "./dropdown-menu"; 9 | export * from "./input"; 10 | export * from "./label"; 11 | export * from "./loading"; 12 | export * from "./popover"; 13 | export * from "./progress"; 14 | export * from "./separator"; 15 | export * from "./sheet"; 16 | export * from "./sidebar"; 17 | export * from "./skeleton"; 18 | export * from "./sonner"; 19 | export * from "./switch"; 20 | export * from "./table"; 21 | export * from "./tabs"; 22 | export * from "./tooltip"; 23 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.AppHost/Au5.AppHost.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Exe 7 | net9.0 8 | enable 9 | enable 10 | true 11 | 2aadc033-b80f-44a0-9d04-bba193746359 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/Authentication/Login/LoginCommand.Validator.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Common; 2 | 3 | namespace Au5.Application.Features.Authentication.Login; 4 | 5 | public class LoginCommandValidator : AbstractValidator 6 | { 7 | public LoginCommandValidator() 8 | { 9 | RuleFor(x => x.Username) 10 | .NotEmpty() 11 | .WithMessage(AppResources.Validation.Required) 12 | .EmailAddress() 13 | .WithMessage(AppResources.Validation.InvalidUsernameFormat); 14 | 15 | RuleFor(x => x.Password) 16 | .NotEmpty() 17 | .WithMessage(AppResources.Validation.Required) 18 | .MinimumLength(6) 19 | .WithMessage(AppResources.Validation.InvalidPasswordFormat); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /modules/panel/shared/components/empty-states/no-search-result.tsx: -------------------------------------------------------------------------------- 1 | import { NoSearchResultsProps } from "@/shared/types/empty-state"; 2 | import NoRecordsState from "./no-record"; 3 | import { Search } from "lucide-react"; 4 | import { GLOBAL_CAPTIONS } from "@/shared/i18n/captions"; 5 | 6 | export function NoSearchResults({ onClear }: NoSearchResultsProps) { 7 | return ( 8 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Hubs/IMeetingHub.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.BackEnd.Hubs; 2 | public interface IMeetingHub 3 | { 4 | Task UserJoinedInMeeting(UserJoinedInMeetingMessage msg, CancellationToken cancellationToken); 5 | 6 | Task RequestToAddBot(RequestToAddBotMessage requestToAddBotMessage, CancellationToken cancellationToken); 7 | 8 | Task BotJoinedInMeeting(string meetingId, CancellationToken cancellationToken); 9 | 10 | Task Entry(EntryMessage transcription, CancellationToken cancellationToken); 11 | 12 | Task ReactionApplied(ReactionAppliedMessage reaction, CancellationToken cancellationToken); 13 | 14 | Task PauseAndPlayTranscription(PauseAndPlayTranscriptionMessage message, CancellationToken cancellationToken); 15 | } 16 | -------------------------------------------------------------------------------- /modules/stop-podman.ps1: -------------------------------------------------------------------------------- 1 | # Au5 Podman Stop Script 2 | # Run this script to stop all Au5 services 3 | 4 | Write-Host "Stopping Au5 services..." 5 | 6 | # Stop the pod (stops all containers in the pod) 7 | podman pod stop au5-pod 8 | 9 | Write-Host "Au5 services stopped." 10 | 11 | # Optionally remove everything (uncomment if you want to clean up completely) 12 | # Write-Host "Removing Au5 pod and containers..." 13 | # podman pod rm -f au5-pod 14 | 15 | # Write-Host "Removing volumes (this will delete all data!)..." 16 | # podman volume rm sqlserver_data redis_data qdrant_data 17 | 18 | Write-Host "To restart services, run: ./start-podman.ps1" 19 | Write-Host "To completely remove everything, uncomment the cleanup lines in this script." 20 | -------------------------------------------------------------------------------- /modules/panel/shared/components/empty-states/database-empty.tsx: -------------------------------------------------------------------------------- 1 | import { EmptyDatabaseProps } from "@/shared/types/empty-state"; 2 | import NoRecordsState from "./no-record"; 3 | import { GLOBAL_CAPTIONS } from "@/shared/i18n/captions"; 4 | import { Database } from "lucide-react"; 5 | 6 | export function EmptyDatabase({ 7 | onAction, 8 | actionLabel = GLOBAL_CAPTIONS.emptyState.database.empty.action, 9 | }: EmptyDatabaseProps) { 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /modules/panel/shared/components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import * as React from "react"; 4 | import * as LabelPrimitive from "@radix-ui/react-label"; 5 | 6 | import { cn } from "@/shared/lib/utils"; 7 | 8 | function Label({ 9 | className, 10 | ...props 11 | }: React.ComponentProps) { 12 | return ( 13 | 21 | ); 22 | } 23 | 24 | export { Label }; 25 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/RoleMenuConfiguration.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class RoleMenuConfiguration : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.ToTable("RoleMenus"); 12 | 13 | builder.HasKey(rm => new { rm.RoleType, rm.MenuId }); 14 | 15 | builder.Property(rm => rm.RoleType) 16 | .IsRequired(); 17 | 18 | builder.HasOne(rm => rm.Menu) 19 | .WithMany(m => m.RoleMenus) 20 | .HasForeignKey(rm => rm.MenuId) 21 | .OnDelete(DeleteBehavior.Cascade); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/ReactionConfig.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class ReactionConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_Reaction"); 13 | 14 | builder.Property(r => r.Type) 15 | .IsRequired() 16 | .HasMaxLength(100); 17 | 18 | builder.Property(r => r.Emoji) 19 | .IsUnicode(true) 20 | .IsRequired() 21 | .HasMaxLength(10); 22 | 23 | builder.Property(r => r.ClassName) 24 | .IsRequired() 25 | .HasMaxLength(100); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Messages/MessageTypesConstants.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Messages; 2 | 3 | public static class MessageTypesConstants 4 | { 5 | public const string UserJoinedInMeeting = "UserJoinedInMeeting"; 6 | public const string BotJoinedInMeeting = "BotJoinedInMeeting"; 7 | public const string GuestJoinedInMeeting = "GuestJoinedInMeeting"; 8 | public const string Entry = "Entry"; 9 | public const string ReactionApplied = "ReactionApplied"; 10 | public const string GeneralMessage = "GeneralMessage"; 11 | public const string RequestToAddBot = "RequestToAddBot"; 12 | public const string PauseAndPlayTranscription = "PauseAndPlayTranscription"; 13 | public const string MeetingIsActive = "MeetingIsActive"; 14 | public const string CloseMeeting = "CloseMeeting"; 15 | } 16 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.IntegrationTests/TestHelpers/JsonResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Http.Json; 2 | 3 | namespace Au5.IntegrationTests.TestHelpers; 4 | 5 | public class JsonResponse : BaseResponseExpectation 6 | { 7 | required public string ExpectedResponse { get; init; } 8 | 9 | public override HttpResponseMessage ToHttpResponseMessage(HttpRequestMessage request) 10 | { 11 | if (!string.IsNullOrEmpty(ExpectedRequest)) 12 | { 13 | var actualContent = request.Content?.ReadAsStringAsync().Result; 14 | Assert.Equal(actualContent, ExpectedRequest); 15 | } 16 | 17 | var response = new HttpResponseMessage(ResponseStatusCode) 18 | { 19 | StatusCode = ResponseStatusCode, 20 | Content = JsonContent.Create(ExpectedResponse) 21 | }; 22 | 23 | return response; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /modules/panel/shared/providers/query-provider.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; 4 | import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; 5 | import { useState } from "react"; 6 | 7 | export function QueryProvider({ children }: { children: React.ReactNode }) { 8 | const [queryClient] = useState( 9 | () => 10 | new QueryClient({ 11 | defaultOptions: { 12 | queries: { 13 | retry: 1, 14 | refetchOnWindowFocus: false, 15 | }, 16 | }, 17 | }), 18 | ); 19 | 20 | return ( 21 | 22 | {children} 23 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Domain/Entities/AIContents.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Domain.Entities; 2 | 3 | [Entity] 4 | public class AIContents 5 | { 6 | public Guid Id { get; set; } 7 | 8 | public Guid UserId { get; set; } 9 | 10 | public User User { get; set; } 11 | 12 | public Guid MeetingId { get; set; } 13 | 14 | public Meeting Meeting { get; set; } 15 | 16 | public Guid AssistantId { get; set; } 17 | 18 | public Assistant Assistant { get; set; } 19 | 20 | public string Content { get; set; } 21 | 22 | public int CompletionTokens { get; set; } 23 | 24 | public int PromptTokens { get; set; } 25 | 26 | public int TotalTokens { get; set; } 27 | 28 | public DateTime CreatedAt { get; set; } 29 | 30 | public bool IsActive { get; set; } 31 | 32 | public Guid? RemoverUserId { get; set; } 33 | } 34 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/onboarding/controllers/userController.ts: -------------------------------------------------------------------------------- 1 | import { apiRequestClient } from "@/shared/network/apiRequestClient"; 2 | import { API_URLS } from "@/shared/network/api/urls"; 3 | import { AddUserRequest, AddUserResponse } from "../types"; 4 | 5 | export const userController = { 6 | verify: (userId: string, hash: string): Promise<{ email: string }> => 7 | apiRequestClient<{ email: string }>(API_URLS.USERS.VERIFY(userId, hash), { 8 | method: "GET", 9 | }), 10 | verifyUser: (signupData: AddUserRequest): Promise => 11 | apiRequestClient( 12 | API_URLS.USERS.VERIFY(signupData.userId, signupData.hashedEmail), 13 | { 14 | method: "POST", 15 | body: JSON.stringify(signupData), 16 | }, 17 | ), 18 | }; 19 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/AI/GetAll/GetAIContentsQuery.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.AI.GetAll; 2 | 3 | public record GetAIContentsQuery(Guid MeetingId) : IRequest>>; 4 | 5 | public record AIContentsResponse 6 | { 7 | public Guid Id { get; set; } 8 | 9 | public Participant User { get; set; } 10 | 11 | public AIContentAssistant Assistant { get; set; } 12 | 13 | public string Content { get; set; } 14 | 15 | public string CreatedAt { get; set; } 16 | } 17 | 18 | public record AIContentAssistant 19 | { 20 | public Guid Id { get; set; } 21 | 22 | public string Name { get; set; } 23 | 24 | public string Icon { get; set; } 25 | 26 | public string Description { get; set; } 27 | 28 | public string Instructions { get; set; } 29 | } 30 | -------------------------------------------------------------------------------- /modules/panel/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": [ 26 | "next-env.d.ts", 27 | "**/*.ts", 28 | "**/*.tsx", 29 | ".next/types/**/*.ts", 30 | "components/users/_editModal" 31 | ], 32 | "exclude": ["node_modules"] 33 | } 34 | -------------------------------------------------------------------------------- /modules/panel/views/(pages)/landing/i18n.ts: -------------------------------------------------------------------------------- 1 | export const landingCaptions = { 2 | heroSection: { 3 | title: { 4 | part1: "Turn your", 5 | meetings: "meetings", 6 | part2: "into insights", 7 | }, 8 | description: 9 | "Get accurate transcripts, AI-powered summaries, and actionable insights from every meeting. Works with Zoom, Teams, Google Meet, and more.", 10 | downloadButton: "Download Chrome Extension", 11 | features: { 12 | noCreditCard: "No credit card required", 13 | alwaysFree: "Always free", 14 | }, 15 | imageAlt: "Au5.ai meeting insights dashboard", 16 | }, 17 | navigation: { 18 | signup: "Sign Up", 19 | login: "Log In", 20 | }, 21 | } as const; 22 | 23 | // For backward compatibility 24 | export const heroSectionCaptions = landingCaptions.heroSection; 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | **Describe the bug** 10 | A clear and concise description of what the bug is. 11 | 12 | **To Reproduce** 13 | Steps to reproduce the behavior: 14 | 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | 28 | - OS: [e.g. iOS] 29 | - Browser [e.g. chrome, safari] 30 | - Version [e.g. 22] 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/LogMessages.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Logging; 2 | 3 | namespace Au5.Infrastructure.Persistence; 4 | 5 | public static partial class LogMessages 6 | { 7 | [LoggerMessage(EventId = 0, Level = LogLevel.Error, Message = "DataBase Exception")] 8 | public static partial void LogDatabaseException(this ILogger logger, Exception exception); 9 | 10 | [LoggerMessage(EventId = 1, Level = LogLevel.Error, Message = "Initializing Database - {message}")] 11 | public static partial void LogDatabaseInitializationException(this ILogger logger, string message, Exception exception); 12 | 13 | [LoggerMessage(EventId = 2, Level = LogLevel.Information, Message = "Initializing Database - {message}")] 14 | public static partial void LogDatabaseInitializationInfo(this ILogger logger, string message); 15 | } 16 | -------------------------------------------------------------------------------- /modules/extension/src/api/apiRoutes.ts: -------------------------------------------------------------------------------- 1 | import {AppConfiguration} from "../core/types"; 2 | 3 | export class ApiRoutes { 4 | private static instance: ApiRoutes; 5 | 6 | private constructor(private config: AppConfiguration) {} 7 | 8 | public static getInstance(config: AppConfiguration): ApiRoutes { 9 | if (!ApiRoutes.instance) { 10 | ApiRoutes.instance = new ApiRoutes(config); 11 | } 12 | return ApiRoutes.instance; 13 | } 14 | 15 | public addBot(): string { 16 | return `${this.config.service.serviceBaseUrl}/meetings/bots`; 17 | } 18 | 19 | public getReactions(): string { 20 | return `${this.config.service.serviceBaseUrl}/reactions`; 21 | } 22 | 23 | public closeMeeting(meetingId: string): string { 24 | return `${this.config.service.serviceBaseUrl}/meetings/${meetingId}/close`; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /modules/panel/shared/lib/index.ts: -------------------------------------------------------------------------------- 1 | import { toast } from "sonner"; 2 | 3 | export * from "./utils"; 4 | 5 | export { cn } from "./styling-utils"; 6 | export { validateUrl, validateEmail, validatePassword } from "./utils"; 7 | export { handleCelebration } from "./animation-utils"; 8 | export { formatDuration } from "./formatting-utils"; 9 | export { getRoleDisplay, getRoleType } from "./user-utils"; 10 | export type { RoleDisplay } from "./user-utils"; 11 | 12 | export const CopyToClipboard = (text: string) => { 13 | if (!text) return; 14 | if (typeof navigator.clipboard !== "undefined") { 15 | navigator.clipboard 16 | .writeText(text) 17 | .then(() => toast.success("Copied to clipboard!")) 18 | .catch(() => toast.error("Failed to copy.")); 19 | } else { 20 | toast.error("Clipboard API not supported."); 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/GetUsers/GetUsersQuery.Handler.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.GetUsers; 2 | 3 | public class GetUsersQueryHandler(IApplicationDbContext applicationDbContext, ICurrentUserService currentUserService) 4 | : IRequestHandler> 5 | { 6 | private readonly IApplicationDbContext _dbContext = applicationDbContext; 7 | private readonly ICurrentUserService _currentUser = currentUserService; 8 | 9 | public async ValueTask> Handle(GetUsersQuery request, CancellationToken cancellationToken) 10 | { 11 | var users = await _dbContext.Set() 12 | .Where(x => x.OrganizationId == _currentUser.OrganizationId) 13 | .AsNoTracking() 14 | .ToListAsync(cancellationToken); 15 | 16 | return users; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.BackEnd/Controllers/AssistantsController.cs: -------------------------------------------------------------------------------- 1 | using Au5.Application.Features.Assistants.AddAssistant; 2 | using Au5.Application.Features.Assistants.GetAll; 3 | using Microsoft.AspNetCore.Authorization; 4 | 5 | namespace Au5.BackEnd.Controllers; 6 | 7 | public class AssistantsController(IMediator mediator) : BaseController 8 | { 9 | [HttpGet] 10 | [Route("")] 11 | [Authorize(Policy = AuthorizationPolicies.UserOrAdmin)] 12 | public async Task GetAll([FromQuery] bool? isActive) 13 | { 14 | return Ok(await mediator.Send(new GetAssistantsQuery(isActive))); 15 | } 16 | 17 | [HttpPost] 18 | [Route("")] 19 | [Authorize(Policy = AuthorizationPolicies.UserOrAdmin)] 20 | public async Task Add([FromBody] AddAssistantCommand command) 21 | { 22 | return Ok(await mediator.Send(command)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/MeetingConfig.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class MeetingConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_Meeting"); 13 | 14 | builder.Property(m => m.MeetName) 15 | .IsUnicode(true) 16 | .HasMaxLength(200); 17 | 18 | builder.Property(m => m.BotName) 19 | .IsUnicode(true) 20 | .HasMaxLength(200); 21 | 22 | builder.Property(m => m.Platform) 23 | .HasMaxLength(20); 24 | 25 | builder.Property(m => m.HashToken) 26 | .IsUnicode(false) 27 | .HasMaxLength(100); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Application/Features/UserManagement/InviteUsers/InviteUsersCommand.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.Application.Features.UserManagement.InviteUsers; 2 | 3 | public record InviteUsersCommand(List Invites) : IRequest>; 4 | 5 | public record InviteUsersRequest 6 | { 7 | public string Email { get; init; } 8 | 9 | public RoleTypes Role { get; init; } 10 | } 11 | 12 | public class InviteUsersResponse 13 | { 14 | required public IReadOnlyCollection Results { get; init; } 15 | } 16 | 17 | public class InvitationResult 18 | { 19 | required public string Email { get; init; } 20 | 21 | public bool StoredInDatabase { get; init; } 22 | 23 | public bool EmailSent { get; init; } 24 | 25 | public bool AlreadyExists { get; init; } 26 | 27 | public string ErrorMessage { get; init; } 28 | } 29 | -------------------------------------------------------------------------------- /modules/backend/tests/Au5.UnitTests/Infrastructure/AppResources.cs: -------------------------------------------------------------------------------- 1 | namespace Au5.UnitTests.Infrastructure; 2 | 3 | /// 4 | /// Infrastructure layer resource strings organized by category and component. 5 | /// 6 | public static class AppResources 7 | { 8 | /// 9 | /// Bot management and communication related errors. 10 | /// 11 | internal static class BotFather 12 | { 13 | public const string FailedToAdd = "Failed to add bot to the meeting. Please check the bot service status and try again."; 14 | public const string FailedToRemove = "Failed to remove bot from the meeting. Please try again or contact support if the issue persists."; 15 | public const string FailedCommunicateWithBotFather = "Unable to communicate with the BotFather service. Please check the service status and network connectivity."; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/panel/shared/network/api/assistantsController.ts: -------------------------------------------------------------------------------- 1 | import { apiRequestClient } from "../apiRequestClient"; 2 | import { API_URLS } from "./urls"; 3 | import { Assistant } from "@/shared/types/assistants"; 4 | 5 | export const assistantsController = { 6 | getActive: (isActive?: boolean): Promise => { 7 | let url = API_URLS.ASSISTANTS.ROOT; 8 | if (isActive !== undefined && isActive !== null) { 9 | url += `?isActive=${isActive}`; 10 | } 11 | return apiRequestClient(url, { 12 | method: "GET", 13 | }); 14 | }, 15 | create: (data: { name: string; description: string }): Promise => 16 | apiRequestClient(API_URLS.ASSISTANTS.ROOT, { 17 | method: "POST", 18 | body: JSON.stringify(data), 19 | headers: { "Content-Type": "application/json" }, 20 | }), 21 | }; 22 | -------------------------------------------------------------------------------- /modules/backend/src/Au5.Infrastructure/Persistence/Config/AIContentsConfig.cs: -------------------------------------------------------------------------------- 1 | using Au5.Domain.Entities; 2 | using Microsoft.EntityFrameworkCore; 3 | using Microsoft.EntityFrameworkCore.Metadata.Builders; 4 | 5 | namespace Au5.Infrastructure.Persistence.Config; 6 | 7 | public class AIContentsConfig : IEntityTypeConfiguration 8 | { 9 | public void Configure(EntityTypeBuilder builder) 10 | { 11 | builder.HasKey(t => t.Id) 12 | .HasName("PK_dbo_AIContents"); 13 | 14 | builder.Property(x => x.Content) 15 | .IsRequired() 16 | .IsUnicode(true) 17 | .HasColumnType("nvarchar(max)"); 18 | 19 | builder.Property(x => x.UserId).IsRequired(); 20 | 21 | builder.Property(x => x.AssistantId).IsRequired(); 22 | 23 | builder.Property(x => x.MeetingId).IsRequired(); 24 | 25 | builder.Property(x => x.IsActive).IsRequired(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /modules/panel/shared/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/shared/lib"; 2 | import * as React from "react"; 3 | 4 | function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { 5 | return ( 6 |