@iblai/iblai-js 2.28.1 → 2.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { useRef, useEffect, useMemo, useCallback, useState, createContext, useContext, forwardRef, createElement as createElement$1, useLayoutEffect, useReducer, useImperativeHandle, isValidElement, Children, PureComponent, cloneElement, Component, useDebugValue, Fragment as Fragment$2, useId as useId$2, lazy, Suspense } from 'react';
3
3
  import * as dataLayer from '@iblai/data-layer';
4
- import { useGetCredentialsSchemaQuery, useGetLlmsQuery, useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useGetUserProfileSummaryQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerCourseOutlineQuery, getSections, findResumeBlock, flattenOutline, normalizeLearnerCompletionError, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useUpdateGlobalMemoryMutation, useUpdateMentorMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useGetAllMentorMemoriesQuery, useDeleteGlobalMemoryMutation, useDeleteMentorMemoryMutation, useUpdateArtifactMutation, useLazyGetArtifactVersionQuery, useLazyListArtifactVersionsQuery, useSetCurrentVersionMutation, useListArtifactVersionsQuery, useLazyGetArtifactQuery, useLazyListArtifactsQuery, useEditSessionMutation, useListArtifactsQuery, useLazyGetSessionIdQuery, useGetAiSearchMentorsQuery, useGetUserChatHistoryReportsQuery, USER_CHAT_HISTORY_REPORT_ACTIVE_STATES, useCreateUserChatHistoryReportMutation, useLazyGetDownloadReportFromURLQuery, useGetUserChatHistoryReportStatusQuery, userChatHistoryApiSlice, USER_CHAT_HISTORY_QUERY_KEYS, useGetUserChatHistoryQuery, useGetUserChatHistoryFilterQuery, useGetMentorsQuery, useGetUserChatHistorySessionQuery, useUserLlmUsageSummary, useUserLlmSpendOverTime, useUserLlmCostByModel, useUserLlmCostByService, useUserLlmRecentActivity, USER_LLM_RECENT_ACTIVITY_PAGE_SIZE, useUserLlmTraceObservations, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useGetVectorDocumentsQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, useGetAccessibleUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useGetTenantMetadataQuery, useUpdateTenantMetadataMutation, useLazyGetTenantMetadataQuery, useDeleteApiKeyMutation, useGetApiKeyQuery, useGetApiKeyFieldPermissionsQuery, useUpdateApiKeyMutation, useGetApiKeysQuery, unwrapApiTokenList, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetMaskedLLMCredentialsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useGetAgentSpendCapQuery, useGetTenantSpendCapQuery, useListAgentUserSpendCapsQuery, useUpsertAgentSpendCapMutation, useDeleteAgentSpendCapMutation, useUpsertTenantSpendCapMutation, useDeleteTenantSpendCapMutation, useUpsertUserSpendCapMutation, useDeleteUserSpendCapMutation, useGetLlmUsageMetricsQuery, useListAgentSpendCapsQuery, useGetCreditTransactionsQuery, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, VERCEL_SPA, useGetCustomDomainsQuery, useGetHostingProjectsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useCreateHostingProjectDomainMutation, useUpdateHostingDomainMutation, useDeleteHostingDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useCreateMentorMemoryMutation, splitHostPortInput, validateHostPort, useCreateVirtualMachineNetworkPolicyMutation, useUpdateVirtualMachineNetworkPolicyMutation, VIRTUAL_MACHINE_MAX_POLICY_HOSTS, getVirtualMachineApiError, useDeleteVirtualMachineNetworkPolicyMutation, extractBoundMentorIds, useCreateVirtualMachineSecretMutation, useUpdateVirtualMachineSecretMutation, VIRTUAL_MACHINE_SECRET_VALUE_MIN_LENGTH, VIRTUAL_MACHINE_ENV_VAR_PATTERN, useDeleteVirtualMachineSecretMutation, useGetIntegrationCredentialsQuery, useListVirtualMachineNetworkPoliciesQuery, useListVirtualMachineSecretsQuery, getVirtualMachineErrorStatus, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, USER_PROGRESS_DATA_POINTS, useResetTemplateMutation, useSendTestTemplateEmailMutation, useUpdateTemplateMutation, useGetTemplateDetailsQuery, USER_PROGRESS_SUMMARY_TYPE, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetLlmUsageTracesQuery, useGetLlmUsageObservationsQuery, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetAverageRatingQuery, useGetModelCostsQuery, useGetPerUserCostsQuery, useGetTenantCostQuery, useGetAgentCostQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useGetPlatformAuditLogsQuery, PLATFORM_AUDIT_EVENT_TYPES, PLATFORM_AUDIT_ACTION_CODES, useGetMentorMemoriesQuery, useLazyGetCourseMetaDataQuery, useLazyGetCourseCompletionOutlinesQuery, useLazyGetCourseEligibilityQuery, useLazyGetUserEnrolledCoursesQuery, useLazyGetUserAssignedCoursesQuery, useLazyGetUserCredentialsQuery, useLazyGetOverTimeActivityQuery, useLazyGetCatalogSearchQuery, useCreateOrUpdateUserReportedSkillMutation, useCreateOrUpdateUserDesiredSkillMutation, useLazyGetPathwayListQuery, useLazyGetUserAssignedPathwaysQuery, useLazyGetUserEnrolledPathwaysQuery, useLazyGetPathwayCompletionQuery, useLazyGetProgramListQuery, useLazyGetProgramCompletionQuery, useLazyGetUserEnrolledProgramsQuery, useLazyGetAssignedProgramsQuery, useLazyGetUserSkillsPointsQuery, useLazyGetUserReportedSkillsQuery, useLazyGetUserDesiredSkillsQuery, useLazyGetUserCatalogPathwaysQuery, useLazyGetPerLearnerInfoQuery, useLazyGetEdxSSOTokenQuery, useCreateCourseEnrollmentMutation, useCreateStripeCheckoutSessionMutation, useLazyGetCourseProgressQuery, useLazyGetCourseCompletionQuery, useLazyGetPersonnalizedSearchQuery, useUpdateExamAttemptMutation, useStartExamMutation, useLazyGetExamInfoQuery, useGetMentorSettingsQuery, useEditMentorJsonMutation, isVirtualMachineEgressNetworked, findUncoveredSecretHosts, VIRTUAL_MACHINE_MAX_SECRETS_PER_MENTOR, VIRTUAL_MACHINE_DEFAULT_BILLING, VIRTUAL_MACHINE_EGRESS_PROFILES, useEditMentorMutation, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillResourcesQuery, useCreateAgentSkillResourceMutation, useUpdateAgentSkillResourceMutation, useUploadAgentSkillResourceAssetMutation, useDeleteAgentSkillResourceMutation, useGetMentorSkillAssignmentsQuery, useGetAgentSkillsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, filterSlashSkills, useGetMentorSkillAssignmentsInfiniteQuery, MENTOR_SKILL_ASSIGNMENTS_PAGE_SIZE, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useCreateMemoryCategoryMutation, useUpdateMemoryCategoryMutation, useDeleteMemoryCategoryMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
4
+ import { useGetCredentialsSchemaQuery, useGetLlmsQuery, useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useGetUserProfileSummaryQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerCourseOutlineQuery, getSections, findResumeBlock, flattenOutline, normalizeLearnerCompletionError, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useUpdateGlobalMemoryMutation, useUpdateMentorMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useGetAllMentorMemoriesQuery, useDeleteGlobalMemoryMutation, useDeleteMentorMemoryMutation, useUpdateArtifactMutation, useLazyGetArtifactVersionQuery, useLazyListArtifactVersionsQuery, useSetCurrentVersionMutation, useListArtifactVersionsQuery, useLazyGetArtifactQuery, useLazyListArtifactsQuery, useEditSessionMutation, useListArtifactsQuery, useLazyGetSessionIdQuery, useGetAiSearchMentorsQuery, useGetUserChatHistoryReportsQuery, USER_CHAT_HISTORY_REPORT_ACTIVE_STATES, useCreateUserChatHistoryReportMutation, useLazyGetDownloadReportFromURLQuery, useGetUserChatHistoryReportStatusQuery, userChatHistoryApiSlice, USER_CHAT_HISTORY_QUERY_KEYS, useGetUserChatHistoryQuery, useGetUserChatHistoryFilterQuery, useGetMentorsQuery, useGetUserChatHistorySessionQuery, useUserLlmUsageSummary, useUserLlmSpendOverTime, useUserLlmCostByModel, useUserLlmRecentActivity, USER_LLM_RECENT_ACTIVITY_PAGE_SIZE, useUserLlmTraceObservations, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useGetVectorDocumentsQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, useGetAccessibleUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useGetTenantMetadataQuery, useUpdateTenantMetadataMutation, useLazyGetTenantMetadataQuery, useDeleteApiKeyMutation, useGetApiKeyQuery, useGetApiKeyFieldPermissionsQuery, useUpdateApiKeyMutation, useGetApiKeysQuery, unwrapApiTokenList, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetMaskedLLMCredentialsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useGetAgentSpendCapQuery, useGetTenantSpendCapQuery, useListAgentUserSpendCapsQuery, useUpsertAgentSpendCapMutation, useDeleteAgentSpendCapMutation, useUpsertTenantSpendCapMutation, useDeleteTenantSpendCapMutation, useUpsertUserSpendCapMutation, useDeleteUserSpendCapMutation, useGetLlmUsageMetricsQuery, useListAgentSpendCapsQuery, useGetCreditTransactionsQuery, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, VERCEL_SPA, useGetCustomDomainsQuery, useGetHostingProjectsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useCreateHostingProjectDomainMutation, useUpdateHostingDomainMutation, useDeleteHostingDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useCreateMentorMemoryMutation, splitHostPortInput, validateHostPort, useCreateVirtualMachineNetworkPolicyMutation, useUpdateVirtualMachineNetworkPolicyMutation, VIRTUAL_MACHINE_MAX_POLICY_HOSTS, getVirtualMachineApiError, useDeleteVirtualMachineNetworkPolicyMutation, extractBoundMentorIds, useCreateVirtualMachineSecretMutation, useUpdateVirtualMachineSecretMutation, VIRTUAL_MACHINE_SECRET_VALUE_MIN_LENGTH, VIRTUAL_MACHINE_ENV_VAR_PATTERN, useDeleteVirtualMachineSecretMutation, useGetIntegrationCredentialsQuery, useListVirtualMachineNetworkPoliciesQuery, useListVirtualMachineSecretsQuery, getVirtualMachineErrorStatus, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, USER_PROGRESS_DATA_POINTS, useResetTemplateMutation, useSendTestTemplateEmailMutation, useUpdateTemplateMutation, useGetTemplateDetailsQuery, USER_PROGRESS_SUMMARY_TYPE, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetLlmUsageTracesQuery, useGetLlmUsageObservationsQuery, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetAverageRatingQuery, useGetModelCostsQuery, useGetPerUserCostsQuery, useGetTenantCostQuery, useGetAgentCostQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useGetPlatformAuditLogsQuery, PLATFORM_AUDIT_EVENT_TYPES, PLATFORM_AUDIT_ACTION_CODES, useGetMentorMemoriesQuery, useLazyGetCourseMetaDataQuery, useLazyGetCourseCompletionOutlinesQuery, useLazyGetCourseEligibilityQuery, useLazyGetUserEnrolledCoursesQuery, useLazyGetUserAssignedCoursesQuery, useLazyGetUserCredentialsQuery, useLazyGetOverTimeActivityQuery, useLazyGetCatalogSearchQuery, useCreateOrUpdateUserReportedSkillMutation, useCreateOrUpdateUserDesiredSkillMutation, useLazyGetPathwayListQuery, useLazyGetUserAssignedPathwaysQuery, useLazyGetUserEnrolledPathwaysQuery, useLazyGetPathwayCompletionQuery, useLazyGetProgramListQuery, useLazyGetProgramCompletionQuery, useLazyGetUserEnrolledProgramsQuery, useLazyGetAssignedProgramsQuery, useLazyGetUserSkillsPointsQuery, useLazyGetUserReportedSkillsQuery, useLazyGetUserDesiredSkillsQuery, useLazyGetUserCatalogPathwaysQuery, useLazyGetPerLearnerInfoQuery, useLazyGetEdxSSOTokenQuery, useCreateCourseEnrollmentMutation, useCreateStripeCheckoutSessionMutation, useLazyGetCourseProgressQuery, useLazyGetCourseCompletionQuery, useLazyGetPersonnalizedSearchQuery, useUpdateExamAttemptMutation, useStartExamMutation, useLazyGetExamInfoQuery, useGetMentorSettingsQuery, useEditMentorJsonMutation, isVirtualMachineEgressNetworked, findUncoveredSecretHosts, VIRTUAL_MACHINE_MAX_SECRETS_PER_MENTOR, VIRTUAL_MACHINE_DEFAULT_BILLING, VIRTUAL_MACHINE_EGRESS_PROFILES, useEditMentorMutation, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillResourcesQuery, useCreateAgentSkillResourceMutation, useUpdateAgentSkillResourceMutation, useUploadAgentSkillResourceAssetMutation, useDeleteAgentSkillResourceMutation, useGetMentorSkillAssignmentsQuery, useGetAgentSkillsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, filterSlashSkills, useGetMentorSkillAssignmentsInfiniteQuery, MENTOR_SKILL_ASSIGNMENTS_PAGE_SIZE, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useCreateMemoryCategoryMutation, useUpdateMemoryCategoryMutation, useDeleteMemoryCategoryMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
5
5
  import { useDispatch, useSelector } from 'react-redux';
6
6
  import { selectSessionId, selectActiveChatMessages, useCachedSessionId, chatActions, LOCAL_STORAGE_KEYS, TimeTracker, selectRbacPermissions, useCurrentTenant, canViewOtherUsersChatHistory, isPureWatcher, getInitials, useTenantMetadata, useUsername, selectStreaming, isLoggedIn, TOOL_NAME_MAP, WRITE_TODOS_TOOL, WithPermissions, canWriteField, useStripeUpgrade, openExternalUrl, CHAT_AREA_SIZE, isAlphaNumeric32, checkRbacPermission, getTimeAgo, REQUIRED_ACTIONS_FOR_GROUPS, getVisibleAnalyticsTabs, canViewMonetizationAnalytics, getUserName as getUserName$2, formatRelativeTime as formatRelativeTime$2, ANONYMOUS_USERNAME, combineCSVData, WATCHER_HIDDEN_REPORTS, canViewPlatformAuditLogs, redirectToAuthSpaJoinTenant, redirectToAuthSpa, getAuthSpaJoinUrl, useOS, selectNumberOfActiveChatMessages, TOOLS, hasRemoteAiConfig, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, chatInputSliceActions, removeFile, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
7
7
  import { toast } from 'sonner';
@@ -1943,6 +1943,16 @@ var advancedPlatformMembership$3 = {
1943
1943
  switchEnabled: "enabled",
1944
1944
  switchDisabled: "disabled"
1945
1945
  };
1946
+ var advancedSeoDiscoverability$3 = {
1947
+ toastUpdateSuccess: "SEO discoverability setting updated successfully",
1948
+ toastUpdateError: "Failed to update SEO discoverability setting",
1949
+ label: "SEO Discoverability",
1950
+ infoAriaLabel: "More info about SEO discoverability",
1951
+ infoTooltip: "Make this organization's public course, program, and pathway pages crawlable by search engines and AI, and include them in the sitemap.",
1952
+ switchAriaLabel: "SEO discoverability",
1953
+ switchEnabled: "enabled",
1954
+ switchDisabled: "disabled"
1955
+ };
1946
1956
  var advancedProviderConfig$3 = {
1947
1957
  regionAriaLabel: "Provider Configuration",
1948
1958
  sectionTitle: "Provider Configuration",
@@ -5512,7 +5522,10 @@ var profileIndex$3 = {
5512
5522
  groupRecords: "Records",
5513
5523
  descLlmUsagePreview: "Spend, tokens and requests across conversations.",
5514
5524
  sectionFeatures: "Features",
5515
- tooltipDisplayMentorAI: "Keeps the AI agent panel beside whatever you are working on, so you can ask questions without leaving the page."
5525
+ tooltipDisplayMentorAI: "Keeps the AI agent panel beside whatever you are working on, so you can ask questions without leaving the page.",
5526
+ tabOverview: "Overview",
5527
+ descOverview: "Your courses, conversations, AI usage and memory, all in one place.",
5528
+ descOverviewPreview: "Courses, conversations, AI usage and memory, all in one place."
5516
5529
  };
5517
5530
  var profileInviteUserContent$3 = {
5518
5531
  inviteUsersTitle: "Invite Users",
@@ -8587,8 +8600,6 @@ var profileLlmUsage$3 = {
8587
8600
  colCost: "Cost",
8588
8601
  byModelTitle: "By model",
8589
8602
  byModelSubtitle: "Share of your spend per model",
8590
- byServiceTitle: "By service",
8591
- byServiceSubtitle: "Where your spend comes from",
8592
8603
  otherRow: "Other",
8593
8604
  unknownModel: "Unknown model",
8594
8605
  unknownService: "Other service",
@@ -8630,6 +8641,82 @@ var profileLlmUsage$3 = {
8630
8641
  tryAgain: "Try again",
8631
8642
  scopeUser: "Usage for {username}"
8632
8643
  };
8644
+ var profileOverviewTab$3 = {
8645
+ scopeSelf: "Your activity across courses and AI agents, at a glance.",
8646
+ scopeUser: "Activity for {username}",
8647
+ refresh: "Refresh overview",
8648
+ unavailable: "Unavailable",
8649
+ kpiEnrolled: "Enrolled courses",
8650
+ kpiEnrolledSub: "{count} in progress",
8651
+ kpiEnrolledSubAll: "All time",
8652
+ kpiCompleted: "Completed courses",
8653
+ kpiCompletedSub: "{percent}% of enrolled",
8654
+ kpiProgress: "Average progress",
8655
+ kpiProgressSub: "Across enrolled courses",
8656
+ kpiTimeSpent: "Time spent",
8657
+ kpiTimeSpentSub: "Learning time, all courses",
8658
+ kpiConversations: "Conversations",
8659
+ kpiConversationsSub: "With AI agents",
8660
+ kpiConversationsLast: "Last one {when}",
8661
+ kpiSpend: "AI spend",
8662
+ kpiSpendSub: "Last 30 days",
8663
+ kpiRequests: "AI requests",
8664
+ kpiRequestsSub: "{tokens} tokens, last 30 days",
8665
+ kpiMemories: "Memories",
8666
+ kpiMemoriesSub: "Saved by the AI",
8667
+ kpiMemoriesSubOn: "Auto-capture on",
8668
+ kpiMemoriesSubOff: "Auto-capture off",
8669
+ recordsLabel: "Records",
8670
+ recordsCredentials: "{count, plural, one {# credential} other {# credentials}}",
8671
+ recordsPrograms: "{count, plural, one {# program} other {# programs}}",
8672
+ recordsPathways: "{count, plural, one {# pathway} other {# pathways}}",
8673
+ learningTitle: "Learning progress",
8674
+ learningSubtitle: "Where each enrolled course stands",
8675
+ learningError: "Course enrollments couldn't be loaded.",
8676
+ learningEmpty: "No course enrollments yet.",
8677
+ learningProgressUnavailable: "Progress details aren't available for this account.",
8678
+ moreCourses: "{count, plural, one {# more course in the gradebook} other {# more courses in the gradebook}}",
8679
+ legendCompleted: "Completed",
8680
+ legendInProgress: "In progress",
8681
+ legendNotStarted: "Not started",
8682
+ ringAria: "{completed} of {total} courses completed",
8683
+ viewProgress: "View progress for {name}",
8684
+ courseProgressAria: "{name}: {percent}% complete",
8685
+ courseCompleted: "Completed",
8686
+ coursePassed: "Passed",
8687
+ courseEnrolledOn: "Enrolled {date}",
8688
+ courseTimeSpent: "{duration} spent",
8689
+ enrollmentActive: "Active",
8690
+ enrollmentInactive: "Inactive",
8691
+ viewGradebook: "View gradebook",
8692
+ viewUsage: "View usage",
8693
+ viewHistory: "View history",
8694
+ viewMemory: "View memory",
8695
+ usageTitle: "AI usage",
8696
+ usageSubtitle: "Daily spend over the last 30 days",
8697
+ usageForbidden: "AI usage isn't available for this account.",
8698
+ usageError: "AI usage couldn't be loaded.",
8699
+ usageEmpty: "No AI usage in the last 30 days.",
8700
+ usageNoSpend: "No spend recorded in the last 30 days.",
8701
+ conversationsTitle: "Recent conversations",
8702
+ conversationsSubtitle: "Your latest exchanges with AI agents",
8703
+ conversationsSubtitlePreview: "Latest exchanges with AI agents",
8704
+ conversationsForbidden: "Conversations aren't available for this account.",
8705
+ conversationsError: "Conversations couldn't be loaded.",
8706
+ conversationsEmpty: "No conversations yet.",
8707
+ conversation: "Conversation",
8708
+ agent: "AI agent",
8709
+ messageCount: "{count, plural, one {# message} other {# messages}}",
8710
+ memoryTitle: "Memory",
8711
+ memorySubtitle: "What the AI remembers about you",
8712
+ memorySubtitlePreview: "What the AI remembers",
8713
+ memoryError: "Memories couldn't be loaded.",
8714
+ memoryEmpty: "No memories saved yet.",
8715
+ memoryAutoCapture: "Auto-capture",
8716
+ memoryUseInResponses: "Used in responses",
8717
+ stateOn: "On",
8718
+ stateOff: "Off"
8719
+ };
8633
8720
  var virtualMachineHostInput$3 = {
8634
8721
  listLabel: "Allowed Hosts",
8635
8722
  removeHost: "Remove {host}",
@@ -8816,6 +8903,7 @@ var en = {
8816
8903
  advancedExternalMapping: advancedExternalMapping$3,
8817
8904
  advancedMemsearchConfig: advancedMemsearchConfig$3,
8818
8905
  advancedPlatformMembership: advancedPlatformMembership$3,
8906
+ advancedSeoDiscoverability: advancedSeoDiscoverability$3,
8819
8907
  advancedProviderConfig: advancedProviderConfig$3,
8820
8908
  advancedRecommendationSystemPrompts: advancedRecommendationSystemPrompts$3,
8821
8909
  advancedSmtp: advancedSmtp$3,
@@ -9090,6 +9178,7 @@ var en = {
9090
9178
  analyticsLlmUsage: analyticsLlmUsage$3,
9091
9179
  analyticsTraces: analyticsTraces$3,
9092
9180
  profileLlmUsage: profileLlmUsage$3,
9181
+ profileOverviewTab: profileOverviewTab$3,
9093
9182
  virtualMachineHostInput: virtualMachineHostInput$3,
9094
9183
  virtualMachineAdminTab: virtualMachineAdminTab$3,
9095
9184
  virtualMachineNetworkPolicies: virtualMachineNetworkPolicies$3,
@@ -9510,6 +9599,16 @@ var advancedPlatformMembership$2 = {
9510
9599
  switchEnabled: "activée",
9511
9600
  switchDisabled: "désactivée"
9512
9601
  };
9602
+ var advancedSeoDiscoverability$2 = {
9603
+ toastUpdateSuccess: "Paramètre de découvrabilité SEO mis à jour avec succès",
9604
+ toastUpdateError: "Échec de la mise à jour du paramètre de découvrabilité SEO",
9605
+ label: "Découvrabilité SEO",
9606
+ infoAriaLabel: "Plus d'informations sur la découvrabilité SEO",
9607
+ infoTooltip: "Rendre les pages publiques de cours, programmes et parcours de cette organisation explorables par les moteurs de recherche et l'IA, et les inclure dans le plan du site.",
9608
+ switchAriaLabel: "Découvrabilité SEO",
9609
+ switchEnabled: "activée",
9610
+ switchDisabled: "désactivée"
9611
+ };
9513
9612
  var advancedProviderConfig$2 = {
9514
9613
  regionAriaLabel: "Configuration du fournisseur",
9515
9614
  sectionTitle: "Configuration du fournisseur",
@@ -13245,7 +13344,10 @@ var profileIndex$2 = {
13245
13344
  groupRecords: "Dossiers",
13246
13345
  descLlmUsagePreview: "Dépenses, jetons et requêtes dans les conversations.",
13247
13346
  sectionFeatures: "Fonctionnalités",
13248
- tooltipDisplayMentorAI: "Garde le panneau de l'agent IA à côté de ce que vous faites, pour poser des questions sans quitter la page."
13347
+ tooltipDisplayMentorAI: "Garde le panneau de l'agent IA à côté de ce que vous faites, pour poser des questions sans quitter la page.",
13348
+ tabOverview: "Vue d'ensemble",
13349
+ descOverview: "Vos cours, conversations, utilisation de l'IA et mémoire, réunis au même endroit.",
13350
+ descOverviewPreview: "Cours, conversations, utilisation de l'IA et mémoire, réunis au même endroit."
13249
13351
  };
13250
13352
  var profileInviteUserContent$2 = {
13251
13353
  inviteUsersTitle: "Inviter des utilisateurs",
@@ -16154,8 +16256,6 @@ var profileLlmUsage$2 = {
16154
16256
  colCost: "Coût",
16155
16257
  byModelTitle: "Par modèle",
16156
16258
  byModelSubtitle: "Part de vos dépenses par modèle",
16157
- byServiceTitle: "Par service",
16158
- byServiceSubtitle: "D'où viennent vos dépenses",
16159
16259
  otherRow: "Autres",
16160
16260
  unknownModel: "Modèle inconnu",
16161
16261
  unknownService: "Autre service",
@@ -16197,6 +16297,82 @@ var profileLlmUsage$2 = {
16197
16297
  tryAgain: "Réessayer",
16198
16298
  scopeUser: "Utilisation de {username}"
16199
16299
  };
16300
+ var profileOverviewTab$2 = {
16301
+ scopeSelf: "Votre activité dans les cours et avec les agents IA, en un coup d'œil.",
16302
+ scopeUser: "Activité de {username}",
16303
+ refresh: "Actualiser la vue d'ensemble",
16304
+ unavailable: "Indisponible",
16305
+ kpiEnrolled: "Cours suivis",
16306
+ kpiEnrolledSub: "{count} en cours",
16307
+ kpiEnrolledSubAll: "Depuis le début",
16308
+ kpiCompleted: "Cours terminés",
16309
+ kpiCompletedSub: "{percent}% des cours suivis",
16310
+ kpiProgress: "Progression moyenne",
16311
+ kpiProgressSub: "Sur l'ensemble des cours suivis",
16312
+ kpiTimeSpent: "Temps passé",
16313
+ kpiTimeSpentSub: "Temps d'apprentissage, tous cours confondus",
16314
+ kpiConversations: "Conversations",
16315
+ kpiConversationsSub: "Avec des agents IA",
16316
+ kpiConversationsLast: "La dernière {when}",
16317
+ kpiSpend: "Dépenses IA",
16318
+ kpiSpendSub: "30 derniers jours",
16319
+ kpiRequests: "Requêtes IA",
16320
+ kpiRequestsSub: "{tokens} jetons, 30 derniers jours",
16321
+ kpiMemories: "Souvenirs",
16322
+ kpiMemoriesSub: "Enregistrés par l'IA",
16323
+ kpiMemoriesSubOn: "Capture automatique activée",
16324
+ kpiMemoriesSubOff: "Capture automatique désactivée",
16325
+ recordsLabel: "Dossiers",
16326
+ recordsCredentials: "{count, plural, one {# certification} other {# certifications}}",
16327
+ recordsPrograms: "{count, plural, one {# programme} other {# programmes}}",
16328
+ recordsPathways: "{count, plural, one {# parcours} other {# parcours}}",
16329
+ learningTitle: "Progression d'apprentissage",
16330
+ learningSubtitle: "Où en est chaque cours suivi",
16331
+ learningError: "Impossible de charger les inscriptions aux cours.",
16332
+ learningEmpty: "Aucune inscription à un cours pour le moment.",
16333
+ learningProgressUnavailable: "Les détails de progression ne sont pas disponibles pour ce compte.",
16334
+ moreCourses: "{count, plural, one {# autre cours dans le carnet de notes} other {# autres cours dans le carnet de notes}}",
16335
+ legendCompleted: "Terminés",
16336
+ legendInProgress: "En cours",
16337
+ legendNotStarted: "Non commencés",
16338
+ ringAria: "{completed} cours terminés sur {total}",
16339
+ viewProgress: "Voir la progression de {name}",
16340
+ courseProgressAria: "{name} : {percent}% terminé",
16341
+ courseCompleted: "Terminé",
16342
+ coursePassed: "Réussi",
16343
+ courseEnrolledOn: "Inscrit le {date}",
16344
+ courseTimeSpent: "{duration} passées",
16345
+ enrollmentActive: "Active",
16346
+ enrollmentInactive: "Inactive",
16347
+ viewGradebook: "Voir le carnet de notes",
16348
+ viewUsage: "Voir l'utilisation",
16349
+ viewHistory: "Voir l'historique",
16350
+ viewMemory: "Voir la mémoire",
16351
+ usageTitle: "Utilisation de l'IA",
16352
+ usageSubtitle: "Dépenses quotidiennes sur les 30 derniers jours",
16353
+ usageForbidden: "L'utilisation de l'IA n'est pas disponible pour ce compte.",
16354
+ usageError: "Impossible de charger l'utilisation de l'IA.",
16355
+ usageEmpty: "Aucune utilisation de l'IA au cours des 30 derniers jours.",
16356
+ usageNoSpend: "Aucune dépense enregistrée au cours des 30 derniers jours.",
16357
+ conversationsTitle: "Conversations récentes",
16358
+ conversationsSubtitle: "Vos derniers échanges avec des agents IA",
16359
+ conversationsSubtitlePreview: "Derniers échanges avec des agents IA",
16360
+ conversationsForbidden: "Les conversations ne sont pas disponibles pour ce compte.",
16361
+ conversationsError: "Impossible de charger les conversations.",
16362
+ conversationsEmpty: "Aucune conversation pour le moment.",
16363
+ conversation: "Conversation",
16364
+ agent: "Agent IA",
16365
+ messageCount: "{count, plural, one {# message} other {# messages}}",
16366
+ memoryTitle: "Mémoire",
16367
+ memorySubtitle: "Ce que l'IA retient de vous",
16368
+ memorySubtitlePreview: "Ce que l'IA retient",
16369
+ memoryError: "Impossible de charger les souvenirs.",
16370
+ memoryEmpty: "Aucun souvenir enregistré pour le moment.",
16371
+ memoryAutoCapture: "Capture automatique",
16372
+ memoryUseInResponses: "Utilisée dans les réponses",
16373
+ stateOn: "Activé",
16374
+ stateOff: "Désactivé"
16375
+ };
16200
16376
  var virtualMachineHostInput$2 = {
16201
16377
  listLabel: "Hôtes autorisés",
16202
16378
  removeHost: "Retirer {host}",
@@ -16383,6 +16559,7 @@ var fr = {
16383
16559
  advancedExternalMapping: advancedExternalMapping$2,
16384
16560
  advancedMemsearchConfig: advancedMemsearchConfig$2,
16385
16561
  advancedPlatformMembership: advancedPlatformMembership$2,
16562
+ advancedSeoDiscoverability: advancedSeoDiscoverability$2,
16386
16563
  advancedProviderConfig: advancedProviderConfig$2,
16387
16564
  advancedRecommendationSystemPrompts: advancedRecommendationSystemPrompts$2,
16388
16565
  advancedSmtp: advancedSmtp$2,
@@ -16657,6 +16834,7 @@ var fr = {
16657
16834
  analyticsLlmUsage: analyticsLlmUsage$2,
16658
16835
  analyticsTraces: analyticsTraces$2,
16659
16836
  profileLlmUsage: profileLlmUsage$2,
16837
+ profileOverviewTab: profileOverviewTab$2,
16660
16838
  virtualMachineHostInput: virtualMachineHostInput$2,
16661
16839
  virtualMachineAdminTab: virtualMachineAdminTab$2,
16662
16840
  virtualMachineNetworkPolicies: virtualMachineNetworkPolicies$2,
@@ -17077,6 +17255,16 @@ var advancedPlatformMembership$1 = {
17077
17255
  switchEnabled: "habilitado",
17078
17256
  switchDisabled: "deshabilitado"
17079
17257
  };
17258
+ var advancedSeoDiscoverability$1 = {
17259
+ toastUpdateSuccess: "Configuración de descubrimiento SEO actualizada correctamente",
17260
+ toastUpdateError: "Error al actualizar la configuración de descubrimiento SEO",
17261
+ label: "Descubrimiento SEO",
17262
+ infoAriaLabel: "Más información sobre el descubrimiento SEO",
17263
+ infoTooltip: "Hacer que las páginas públicas de cursos, programas y rutas de esta organización sean rastreables por los motores de búsqueda y la IA, e incluirlas en el mapa del sitio.",
17264
+ switchAriaLabel: "Descubrimiento SEO",
17265
+ switchEnabled: "habilitado",
17266
+ switchDisabled: "deshabilitado"
17267
+ };
17080
17268
  var advancedProviderConfig$1 = {
17081
17269
  regionAriaLabel: "Configuración del proveedor",
17082
17270
  sectionTitle: "Configuración del proveedor",
@@ -20812,7 +21000,10 @@ var profileIndex$1 = {
20812
21000
  groupRecords: "Registros",
20813
21001
  descLlmUsagePreview: "Gasto, tokens y solicitudes en las conversaciones.",
20814
21002
  sectionFeatures: "Funciones",
20815
- tooltipDisplayMentorAI: "Mantiene el panel del agente de IA junto a lo que estés haciendo, para que puedas preguntar sin salir de la página."
21003
+ tooltipDisplayMentorAI: "Mantiene el panel del agente de IA junto a lo que estés haciendo, para que puedas preguntar sin salir de la página.",
21004
+ tabOverview: "Resumen",
21005
+ descOverview: "Tus cursos, conversaciones, uso de IA y memoria, todo en un solo lugar.",
21006
+ descOverviewPreview: "Cursos, conversaciones, uso de IA y memoria, todo en un solo lugar."
20816
21007
  };
20817
21008
  var profileInviteUserContent$1 = {
20818
21009
  inviteUsersTitle: "Invitar usuarios",
@@ -23721,8 +23912,6 @@ var profileLlmUsage$1 = {
23721
23912
  colCost: "Costo",
23722
23913
  byModelTitle: "Por modelo",
23723
23914
  byModelSubtitle: "Parte de tu gasto por modelo",
23724
- byServiceTitle: "Por servicio",
23725
- byServiceSubtitle: "De dónde proviene tu gasto",
23726
23915
  otherRow: "Otros",
23727
23916
  unknownModel: "Modelo desconocido",
23728
23917
  unknownService: "Otro servicio",
@@ -23764,6 +23953,82 @@ var profileLlmUsage$1 = {
23764
23953
  tryAgain: "Intentar de nuevo",
23765
23954
  scopeUser: "Uso de {username}"
23766
23955
  };
23956
+ var profileOverviewTab$1 = {
23957
+ scopeSelf: "Tu actividad en cursos y agentes de IA, de un vistazo.",
23958
+ scopeUser: "Actividad de {username}",
23959
+ refresh: "Actualizar resumen",
23960
+ unavailable: "No disponible",
23961
+ kpiEnrolled: "Cursos inscritos",
23962
+ kpiEnrolledSub: "{count} en curso",
23963
+ kpiEnrolledSubAll: "Desde siempre",
23964
+ kpiCompleted: "Cursos completados",
23965
+ kpiCompletedSub: "{percent}% de los inscritos",
23966
+ kpiProgress: "Progreso medio",
23967
+ kpiProgressSub: "En todos los cursos inscritos",
23968
+ kpiTimeSpent: "Tiempo dedicado",
23969
+ kpiTimeSpentSub: "Tiempo de aprendizaje, todos los cursos",
23970
+ kpiConversations: "Conversaciones",
23971
+ kpiConversationsSub: "Con agentes de IA",
23972
+ kpiConversationsLast: "La última {when}",
23973
+ kpiSpend: "Gasto en IA",
23974
+ kpiSpendSub: "Últimos 30 días",
23975
+ kpiRequests: "Solicitudes de IA",
23976
+ kpiRequestsSub: "{tokens} tokens, últimos 30 días",
23977
+ kpiMemories: "Memorias",
23978
+ kpiMemoriesSub: "Guardadas por la IA",
23979
+ kpiMemoriesSubOn: "Captura automática activada",
23980
+ kpiMemoriesSubOff: "Captura automática desactivada",
23981
+ recordsLabel: "Registros",
23982
+ recordsCredentials: "{count, plural, one {# credencial} other {# credenciales}}",
23983
+ recordsPrograms: "{count, plural, one {# programa} other {# programas}}",
23984
+ recordsPathways: "{count, plural, one {# itinerario} other {# itinerarios}}",
23985
+ learningTitle: "Progreso de aprendizaje",
23986
+ learningSubtitle: "Estado de cada curso inscrito",
23987
+ learningError: "No se pudieron cargar las inscripciones a cursos.",
23988
+ learningEmpty: "Aún no hay inscripciones a cursos.",
23989
+ learningProgressUnavailable: "Los detalles de progreso no están disponibles para esta cuenta.",
23990
+ moreCourses: "{count, plural, one {# curso más en el libro de calificaciones} other {# cursos más en el libro de calificaciones}}",
23991
+ legendCompleted: "Completados",
23992
+ legendInProgress: "En curso",
23993
+ legendNotStarted: "Sin empezar",
23994
+ ringAria: "{completed} de {total} cursos completados",
23995
+ viewProgress: "Ver el progreso de {name}",
23996
+ courseProgressAria: "{name}: {percent}% completado",
23997
+ courseCompleted: "Completado",
23998
+ coursePassed: "Aprobado",
23999
+ courseEnrolledOn: "Inscrito el {date}",
24000
+ courseTimeSpent: "{duration} dedicados",
24001
+ enrollmentActive: "Activa",
24002
+ enrollmentInactive: "Inactiva",
24003
+ viewGradebook: "Ver calificaciones",
24004
+ viewUsage: "Ver uso",
24005
+ viewHistory: "Ver historial",
24006
+ viewMemory: "Ver memoria",
24007
+ usageTitle: "Uso de IA",
24008
+ usageSubtitle: "Gasto diario en los últimos 30 días",
24009
+ usageForbidden: "El uso de IA no está disponible para esta cuenta.",
24010
+ usageError: "No se pudo cargar el uso de IA.",
24011
+ usageEmpty: "Sin uso de IA en los últimos 30 días.",
24012
+ usageNoSpend: "Sin gasto registrado en los últimos 30 días.",
24013
+ conversationsTitle: "Conversaciones recientes",
24014
+ conversationsSubtitle: "Tus últimos intercambios con agentes de IA",
24015
+ conversationsSubtitlePreview: "Últimos intercambios con agentes de IA",
24016
+ conversationsForbidden: "Las conversaciones no están disponibles para esta cuenta.",
24017
+ conversationsError: "No se pudieron cargar las conversaciones.",
24018
+ conversationsEmpty: "Aún no hay conversaciones.",
24019
+ conversation: "Conversación",
24020
+ agent: "Agente de IA",
24021
+ messageCount: "{count, plural, one {# mensaje} other {# mensajes}}",
24022
+ memoryTitle: "Memoria",
24023
+ memorySubtitle: "Lo que la IA recuerda de ti",
24024
+ memorySubtitlePreview: "Lo que la IA recuerda",
24025
+ memoryError: "No se pudieron cargar las memorias.",
24026
+ memoryEmpty: "Aún no hay memorias guardadas.",
24027
+ memoryAutoCapture: "Captura automática",
24028
+ memoryUseInResponses: "Usada en las respuestas",
24029
+ stateOn: "Activado",
24030
+ stateOff: "Desactivado"
24031
+ };
23767
24032
  var virtualMachineHostInput$1 = {
23768
24033
  listLabel: "Hosts permitidos",
23769
24034
  removeHost: "Quitar {host}",
@@ -23950,6 +24215,7 @@ var es = {
23950
24215
  advancedExternalMapping: advancedExternalMapping$1,
23951
24216
  advancedMemsearchConfig: advancedMemsearchConfig$1,
23952
24217
  advancedPlatformMembership: advancedPlatformMembership$1,
24218
+ advancedSeoDiscoverability: advancedSeoDiscoverability$1,
23953
24219
  advancedProviderConfig: advancedProviderConfig$1,
23954
24220
  advancedRecommendationSystemPrompts: advancedRecommendationSystemPrompts$1,
23955
24221
  advancedSmtp: advancedSmtp$1,
@@ -24224,6 +24490,7 @@ var es = {
24224
24490
  analyticsLlmUsage: analyticsLlmUsage$1,
24225
24491
  analyticsTraces: analyticsTraces$1,
24226
24492
  profileLlmUsage: profileLlmUsage$1,
24493
+ profileOverviewTab: profileOverviewTab$1,
24227
24494
  virtualMachineHostInput: virtualMachineHostInput$1,
24228
24495
  virtualMachineAdminTab: virtualMachineAdminTab$1,
24229
24496
  virtualMachineNetworkPolicies: virtualMachineNetworkPolicies$1,
@@ -24644,6 +24911,16 @@ var advancedPlatformMembership = {
24644
24911
  switchEnabled: "已启用",
24645
24912
  switchDisabled: "已禁用"
24646
24913
  };
24914
+ var advancedSeoDiscoverability = {
24915
+ toastUpdateSuccess: "SEO 可发现性设置已成功更新",
24916
+ toastUpdateError: "更新 SEO 可发现性设置失败",
24917
+ label: "SEO 可发现性",
24918
+ infoAriaLabel: "更多关于 SEO 可发现性的信息",
24919
+ infoTooltip: "使该组织的公开课程、项目和学习路径页面可被搜索引擎和 AI 抓取,并包含在站点地图中。",
24920
+ switchAriaLabel: "SEO 可发现性",
24921
+ switchEnabled: "已启用",
24922
+ switchDisabled: "已禁用"
24923
+ };
24647
24924
  var advancedProviderConfig = {
24648
24925
  regionAriaLabel: "提供商配置",
24649
24926
  sectionTitle: "提供商配置",
@@ -28379,7 +28656,10 @@ var profileIndex = {
28379
28656
  groupRecords: "记录",
28380
28657
  descLlmUsagePreview: "各对话中的花费、令牌数和请求数。",
28381
28658
  sectionFeatures: "功能",
28382
- tooltipDisplayMentorAI: "让 AI 助手面板始终显示在当前页面旁边,无需离开页面即可提问。"
28659
+ tooltipDisplayMentorAI: "让 AI 助手面板始终显示在当前页面旁边,无需离开页面即可提问。",
28660
+ tabOverview: "概览",
28661
+ descOverview: "您的课程、对话、AI 用量和记忆,尽在一处。",
28662
+ descOverviewPreview: "课程、对话、AI 用量和记忆,尽在一处。"
28383
28663
  };
28384
28664
  var profileInviteUserContent = {
28385
28665
  inviteUsersTitle: "邀请用户",
@@ -31288,8 +31568,6 @@ var profileLlmUsage = {
31288
31568
  colCost: "花费",
31289
31569
  byModelTitle: "按模型",
31290
31570
  byModelSubtitle: "各模型占你花费的比例",
31291
- byServiceTitle: "按服务",
31292
- byServiceSubtitle: "你的花费来自哪里",
31293
31571
  otherRow: "其他",
31294
31572
  unknownModel: "未知模型",
31295
31573
  unknownService: "其他服务",
@@ -31331,6 +31609,82 @@ var profileLlmUsage = {
31331
31609
  tryAgain: "重试",
31332
31610
  scopeUser: "{username} 的用量"
31333
31611
  };
31612
+ var profileOverviewTab = {
31613
+ scopeSelf: "一览您在课程和 AI 代理中的活动。",
31614
+ scopeUser: "{username} 的活动",
31615
+ refresh: "刷新概览",
31616
+ unavailable: "不可用",
31617
+ kpiEnrolled: "已注册课程",
31618
+ kpiEnrolledSub: "{count} 门进行中",
31619
+ kpiEnrolledSubAll: "全部时间",
31620
+ kpiCompleted: "已完成课程",
31621
+ kpiCompletedSub: "占已注册课程的 {percent}%",
31622
+ kpiProgress: "平均进度",
31623
+ kpiProgressSub: "所有已注册课程",
31624
+ kpiTimeSpent: "学习时长",
31625
+ kpiTimeSpentSub: "所有课程的学习时间",
31626
+ kpiConversations: "对话",
31627
+ kpiConversationsSub: "与 AI 代理",
31628
+ kpiConversationsLast: "最近一次 {when}",
31629
+ kpiSpend: "AI 花费",
31630
+ kpiSpendSub: "最近 30 天",
31631
+ kpiRequests: "AI 请求",
31632
+ kpiRequestsSub: "{tokens} 个令牌,最近 30 天",
31633
+ kpiMemories: "记忆",
31634
+ kpiMemoriesSub: "由 AI 保存",
31635
+ kpiMemoriesSubOn: "自动捕获已开启",
31636
+ kpiMemoriesSubOff: "自动捕获已关闭",
31637
+ recordsLabel: "记录",
31638
+ recordsCredentials: "{count, plural, other {# 项证书}}",
31639
+ recordsPrograms: "{count, plural, other {# 个项目}}",
31640
+ recordsPathways: "{count, plural, other {# 条路径}}",
31641
+ learningTitle: "学习进度",
31642
+ learningSubtitle: "每门已注册课程的进展",
31643
+ learningError: "无法加载课程注册信息。",
31644
+ learningEmpty: "尚未注册任何课程。",
31645
+ learningProgressUnavailable: "此账户的进度详情不可用。",
31646
+ moreCourses: "{count, plural, other {成绩册中还有 # 门课程}}",
31647
+ legendCompleted: "已完成",
31648
+ legendInProgress: "进行中",
31649
+ legendNotStarted: "未开始",
31650
+ ringAria: "已完成 {total} 门课程中的 {completed} 门",
31651
+ viewProgress: "查看 {name} 的进度",
31652
+ courseProgressAria: "{name}:已完成 {percent}%",
31653
+ courseCompleted: "已完成",
31654
+ coursePassed: "已通过",
31655
+ courseEnrolledOn: "注册于 {date}",
31656
+ courseTimeSpent: "已学习 {duration}",
31657
+ enrollmentActive: "进行中",
31658
+ enrollmentInactive: "未激活",
31659
+ viewGradebook: "查看成绩册",
31660
+ viewUsage: "查看用量",
31661
+ viewHistory: "查看历史",
31662
+ viewMemory: "查看记忆",
31663
+ usageTitle: "AI 用量",
31664
+ usageSubtitle: "最近 30 天的每日花费",
31665
+ usageForbidden: "此账户的 AI 用量不可用。",
31666
+ usageError: "无法加载 AI 用量。",
31667
+ usageEmpty: "最近 30 天没有 AI 用量。",
31668
+ usageNoSpend: "最近 30 天没有记录到花费。",
31669
+ conversationsTitle: "最近对话",
31670
+ conversationsSubtitle: "您与 AI 代理的最新交流",
31671
+ conversationsSubtitlePreview: "与 AI 代理的最新交流",
31672
+ conversationsForbidden: "此账户的对话不可用。",
31673
+ conversationsError: "无法加载对话。",
31674
+ conversationsEmpty: "尚无对话。",
31675
+ conversation: "对话",
31676
+ agent: "AI 代理",
31677
+ messageCount: "{count, plural, other {# 条消息}}",
31678
+ memoryTitle: "记忆",
31679
+ memorySubtitle: "AI 对您的记忆",
31680
+ memorySubtitlePreview: "AI 的记忆",
31681
+ memoryError: "无法加载记忆。",
31682
+ memoryEmpty: "尚未保存任何记忆。",
31683
+ memoryAutoCapture: "自动捕获",
31684
+ memoryUseInResponses: "用于回复",
31685
+ stateOn: "开启",
31686
+ stateOff: "关闭"
31687
+ };
31334
31688
  var virtualMachineHostInput = {
31335
31689
  listLabel: "允许的主机",
31336
31690
  removeHost: "移除 {host}",
@@ -31517,6 +31871,7 @@ var zh = {
31517
31871
  advancedExternalMapping: advancedExternalMapping,
31518
31872
  advancedMemsearchConfig: advancedMemsearchConfig,
31519
31873
  advancedPlatformMembership: advancedPlatformMembership,
31874
+ advancedSeoDiscoverability: advancedSeoDiscoverability,
31520
31875
  advancedProviderConfig: advancedProviderConfig,
31521
31876
  advancedRecommendationSystemPrompts: advancedRecommendationSystemPrompts,
31522
31877
  advancedSmtp: advancedSmtp,
@@ -31791,6 +32146,7 @@ var zh = {
31791
32146
  analyticsLlmUsage: analyticsLlmUsage,
31792
32147
  analyticsTraces: analyticsTraces,
31793
32148
  profileLlmUsage: profileLlmUsage,
32149
+ profileOverviewTab: profileOverviewTab,
31794
32150
  virtualMachineHostInput: virtualMachineHostInput,
31795
32151
  virtualMachineAdminTab: virtualMachineAdminTab,
31796
32152
  virtualMachineNetworkPolicies: virtualMachineNetworkPolicies,
@@ -33923,7 +34279,7 @@ const formatRelativeLocale = {
33923
34279
  other: "P",
33924
34280
  };
33925
34281
 
33926
- const formatRelative = (token, _date, _baseDate, _options) =>
34282
+ const formatRelative$1 = (token, _date, _baseDate, _options) =>
33927
34283
  formatRelativeLocale[token];
33928
34284
 
33929
34285
  /**
@@ -34396,7 +34752,7 @@ const enUS = {
34396
34752
  code: "en-US",
34397
34753
  formatDistance: formatDistance$1,
34398
34754
  formatLong: formatLong,
34399
- formatRelative: formatRelative,
34755
+ formatRelative: formatRelative$1,
34400
34756
  localize: localize,
34401
34757
  match: match,
34402
34758
  options: {
@@ -80240,7 +80596,7 @@ const createLucideIcon = (iconName, iconNode) => {
80240
80596
  */
80241
80597
 
80242
80598
 
80243
- const __iconNode$2z = [
80599
+ const __iconNode$2B = [
80244
80600
  [
80245
80601
  "path",
80246
80602
  {
@@ -80249,7 +80605,7 @@ const __iconNode$2z = [
80249
80605
  }
80250
80606
  ]
80251
80607
  ];
80252
- const Activity = createLucideIcon("activity", __iconNode$2z);
80608
+ const Activity = createLucideIcon("activity", __iconNode$2B);
80253
80609
 
80254
80610
  /**
80255
80611
  * @license lucide-react v0.528.0 - ISC
@@ -80259,12 +80615,12 @@ const Activity = createLucideIcon("activity", __iconNode$2z);
80259
80615
  */
80260
80616
 
80261
80617
 
80262
- const __iconNode$2y = [
80618
+ const __iconNode$2A = [
80263
80619
  ["path", { d: "M17 12H7", key: "16if0g" }],
80264
80620
  ["path", { d: "M19 18H5", key: "18s9l3" }],
80265
80621
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
80266
80622
  ];
80267
- const AlignCenter = createLucideIcon("align-center", __iconNode$2y);
80623
+ const AlignCenter = createLucideIcon("align-center", __iconNode$2A);
80268
80624
 
80269
80625
  /**
80270
80626
  * @license lucide-react v0.528.0 - ISC
@@ -80274,12 +80630,12 @@ const AlignCenter = createLucideIcon("align-center", __iconNode$2y);
80274
80630
  */
80275
80631
 
80276
80632
 
80277
- const __iconNode$2x = [
80633
+ const __iconNode$2z = [
80278
80634
  ["path", { d: "M15 12H3", key: "6jk70r" }],
80279
80635
  ["path", { d: "M17 18H3", key: "1amg6g" }],
80280
80636
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
80281
80637
  ];
80282
- const AlignLeft = createLucideIcon("align-left", __iconNode$2x);
80638
+ const AlignLeft = createLucideIcon("align-left", __iconNode$2z);
80283
80639
 
80284
80640
  /**
80285
80641
  * @license lucide-react v0.528.0 - ISC
@@ -80289,12 +80645,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$2x);
80289
80645
  */
80290
80646
 
80291
80647
 
80292
- const __iconNode$2w = [
80648
+ const __iconNode$2y = [
80293
80649
  ["path", { d: "M21 12H9", key: "dn1m92" }],
80294
80650
  ["path", { d: "M21 18H7", key: "1ygte8" }],
80295
80651
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
80296
80652
  ];
80297
- const AlignRight = createLucideIcon("align-right", __iconNode$2w);
80653
+ const AlignRight = createLucideIcon("align-right", __iconNode$2y);
80298
80654
 
80299
80655
  /**
80300
80656
  * @license lucide-react v0.528.0 - ISC
@@ -80304,12 +80660,12 @@ const AlignRight = createLucideIcon("align-right", __iconNode$2w);
80304
80660
  */
80305
80661
 
80306
80662
 
80307
- const __iconNode$2v = [
80663
+ const __iconNode$2x = [
80308
80664
  ["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
80309
80665
  ["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
80310
80666
  ["path", { d: "M10 12h4", key: "a56b0p" }]
80311
80667
  ];
80312
- const Archive = createLucideIcon("archive", __iconNode$2v);
80668
+ const Archive = createLucideIcon("archive", __iconNode$2x);
80313
80669
 
80314
80670
  /**
80315
80671
  * @license lucide-react v0.528.0 - ISC
@@ -80319,11 +80675,11 @@ const Archive = createLucideIcon("archive", __iconNode$2v);
80319
80675
  */
80320
80676
 
80321
80677
 
80322
- const __iconNode$2u = [
80678
+ const __iconNode$2w = [
80323
80679
  ["path", { d: "M12 5v14", key: "s699le" }],
80324
80680
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
80325
80681
  ];
80326
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$2u);
80682
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2w);
80327
80683
 
80328
80684
  /**
80329
80685
  * @license lucide-react v0.528.0 - ISC
@@ -80333,11 +80689,11 @@ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2u);
80333
80689
  */
80334
80690
 
80335
80691
 
80336
- const __iconNode$2t = [
80692
+ const __iconNode$2v = [
80337
80693
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
80338
80694
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
80339
80695
  ];
80340
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2t);
80696
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2v);
80341
80697
 
80342
80698
  /**
80343
80699
  * @license lucide-react v0.528.0 - ISC
@@ -80347,11 +80703,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2t);
80347
80703
  */
80348
80704
 
80349
80705
 
80350
- const __iconNode$2s = [
80706
+ const __iconNode$2u = [
80351
80707
  ["path", { d: "M5 12h14", key: "1ays0h" }],
80352
80708
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
80353
80709
  ];
80354
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$2s);
80710
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2u);
80355
80711
 
80356
80712
  /**
80357
80713
  * @license lucide-react v0.528.0 - ISC
@@ -80361,13 +80717,13 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2s);
80361
80717
  */
80362
80718
 
80363
80719
 
80364
- const __iconNode$2r = [
80720
+ const __iconNode$2t = [
80365
80721
  ["path", { d: "m21 16-4 4-4-4", key: "f6ql7i" }],
80366
80722
  ["path", { d: "M17 20V4", key: "1ejh1v" }],
80367
80723
  ["path", { d: "m3 8 4-4 4 4", key: "11wl7u" }],
80368
80724
  ["path", { d: "M7 4v16", key: "1glfcx" }]
80369
80725
  ];
80370
- const ArrowUpDown = createLucideIcon("arrow-up-down", __iconNode$2r);
80726
+ const ArrowUpDown = createLucideIcon("arrow-up-down", __iconNode$2t);
80371
80727
 
80372
80728
  /**
80373
80729
  * @license lucide-react v0.528.0 - ISC
@@ -80377,11 +80733,11 @@ const ArrowUpDown = createLucideIcon("arrow-up-down", __iconNode$2r);
80377
80733
  */
80378
80734
 
80379
80735
 
80380
- const __iconNode$2q = [
80736
+ const __iconNode$2s = [
80381
80737
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
80382
80738
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
80383
80739
  ];
80384
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$2q);
80740
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2s);
80385
80741
 
80386
80742
  /**
80387
80743
  * @license lucide-react v0.528.0 - ISC
@@ -80391,7 +80747,7 @@ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2q);
80391
80747
  */
80392
80748
 
80393
80749
 
80394
- const __iconNode$2p = [
80750
+ const __iconNode$2r = [
80395
80751
  [
80396
80752
  "path",
80397
80753
  {
@@ -80401,7 +80757,7 @@ const __iconNode$2p = [
80401
80757
  ],
80402
80758
  ["circle", { cx: "12", cy: "8", r: "6", key: "1vp47v" }]
80403
80759
  ];
80404
- const Award = createLucideIcon("award", __iconNode$2p);
80760
+ const Award = createLucideIcon("award", __iconNode$2r);
80405
80761
 
80406
80762
  /**
80407
80763
  * @license lucide-react v0.528.0 - ISC
@@ -80411,11 +80767,11 @@ const Award = createLucideIcon("award", __iconNode$2p);
80411
80767
  */
80412
80768
 
80413
80769
 
80414
- const __iconNode$2o = [
80770
+ const __iconNode$2q = [
80415
80771
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
80416
80772
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
80417
80773
  ];
80418
- const Ban = createLucideIcon("ban", __iconNode$2o);
80774
+ const Ban = createLucideIcon("ban", __iconNode$2q);
80419
80775
 
80420
80776
  /**
80421
80777
  * @license lucide-react v0.528.0 - ISC
@@ -80425,12 +80781,12 @@ const Ban = createLucideIcon("ban", __iconNode$2o);
80425
80781
  */
80426
80782
 
80427
80783
 
80428
- const __iconNode$2n = [
80784
+ const __iconNode$2p = [
80429
80785
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }],
80430
80786
  ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }],
80431
80787
  ["path", { d: "M6 12h.01M18 12h.01", key: "113zkx" }]
80432
80788
  ];
80433
- const Banknote = createLucideIcon("banknote", __iconNode$2n);
80789
+ const Banknote = createLucideIcon("banknote", __iconNode$2p);
80434
80790
 
80435
80791
  /**
80436
80792
  * @license lucide-react v0.528.0 - ISC
@@ -80440,7 +80796,7 @@ const Banknote = createLucideIcon("banknote", __iconNode$2n);
80440
80796
  */
80441
80797
 
80442
80798
 
80443
- const __iconNode$2m = [
80799
+ const __iconNode$2o = [
80444
80800
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
80445
80801
  ["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
80446
80802
  [
@@ -80452,7 +80808,7 @@ const __iconNode$2m = [
80452
80808
  ],
80453
80809
  ["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
80454
80810
  ];
80455
- const BellRing = createLucideIcon("bell-ring", __iconNode$2m);
80811
+ const BellRing = createLucideIcon("bell-ring", __iconNode$2o);
80456
80812
 
80457
80813
  /**
80458
80814
  * @license lucide-react v0.528.0 - ISC
@@ -80462,7 +80818,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$2m);
80462
80818
  */
80463
80819
 
80464
80820
 
80465
- const __iconNode$2l = [
80821
+ const __iconNode$2n = [
80466
80822
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
80467
80823
  [
80468
80824
  "path",
@@ -80472,7 +80828,7 @@ const __iconNode$2l = [
80472
80828
  }
80473
80829
  ]
80474
80830
  ];
80475
- const Bell = createLucideIcon("bell", __iconNode$2l);
80831
+ const Bell = createLucideIcon("bell", __iconNode$2n);
80476
80832
 
80477
80833
  /**
80478
80834
  * @license lucide-react v0.528.0 - ISC
@@ -80482,13 +80838,13 @@ const Bell = createLucideIcon("bell", __iconNode$2l);
80482
80838
  */
80483
80839
 
80484
80840
 
80485
- const __iconNode$2k = [
80841
+ const __iconNode$2m = [
80486
80842
  [
80487
80843
  "path",
80488
80844
  { d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8", key: "mg9rjx" }
80489
80845
  ]
80490
80846
  ];
80491
- const Bold$1 = createLucideIcon("bold", __iconNode$2k);
80847
+ const Bold$1 = createLucideIcon("bold", __iconNode$2m);
80492
80848
 
80493
80849
  /**
80494
80850
  * @license lucide-react v0.528.0 - ISC
@@ -80498,7 +80854,7 @@ const Bold$1 = createLucideIcon("bold", __iconNode$2k);
80498
80854
  */
80499
80855
 
80500
80856
 
80501
- const __iconNode$2j = [
80857
+ const __iconNode$2l = [
80502
80858
  ["path", { d: "M12 7v14", key: "1akyts" }],
80503
80859
  [
80504
80860
  "path",
@@ -80508,7 +80864,7 @@ const __iconNode$2j = [
80508
80864
  }
80509
80865
  ]
80510
80866
  ];
80511
- const BookOpen = createLucideIcon("book-open", __iconNode$2j);
80867
+ const BookOpen = createLucideIcon("book-open", __iconNode$2l);
80512
80868
 
80513
80869
  /**
80514
80870
  * @license lucide-react v0.528.0 - ISC
@@ -80518,7 +80874,7 @@ const BookOpen = createLucideIcon("book-open", __iconNode$2j);
80518
80874
  */
80519
80875
 
80520
80876
 
80521
- const __iconNode$2i = [
80877
+ const __iconNode$2k = [
80522
80878
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
80523
80879
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
80524
80880
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -80526,7 +80882,7 @@ const __iconNode$2i = [
80526
80882
  ["path", { d: "M15 13v2", key: "1xurst" }],
80527
80883
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
80528
80884
  ];
80529
- const Bot = createLucideIcon("bot", __iconNode$2i);
80885
+ const Bot = createLucideIcon("bot", __iconNode$2k);
80530
80886
 
80531
80887
  /**
80532
80888
  * @license lucide-react v0.528.0 - ISC
@@ -80536,11 +80892,11 @@ const Bot = createLucideIcon("bot", __iconNode$2i);
80536
80892
  */
80537
80893
 
80538
80894
 
80539
- const __iconNode$2h = [
80895
+ const __iconNode$2j = [
80540
80896
  ["path", { d: "M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16", key: "jecpp" }],
80541
80897
  ["rect", { width: "20", height: "14", x: "2", y: "6", rx: "2", key: "i6l2r4" }]
80542
80898
  ];
80543
- const Briefcase = createLucideIcon("briefcase", __iconNode$2h);
80899
+ const Briefcase = createLucideIcon("briefcase", __iconNode$2j);
80544
80900
 
80545
80901
  /**
80546
80902
  * @license lucide-react v0.528.0 - ISC
@@ -80550,7 +80906,7 @@ const Briefcase = createLucideIcon("briefcase", __iconNode$2h);
80550
80906
  */
80551
80907
 
80552
80908
 
80553
- const __iconNode$2g = [
80909
+ const __iconNode$2i = [
80554
80910
  ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
80555
80911
  ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
80556
80912
  ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
@@ -80559,7 +80915,7 @@ const __iconNode$2g = [
80559
80915
  ["path", { d: "M10 14h4", key: "kelpxr" }],
80560
80916
  ["path", { d: "M10 18h4", key: "1ulq68" }]
80561
80917
  ];
80562
- const Building2 = createLucideIcon("building-2", __iconNode$2g);
80918
+ const Building2 = createLucideIcon("building-2", __iconNode$2i);
80563
80919
 
80564
80920
  /**
80565
80921
  * @license lucide-react v0.528.0 - ISC
@@ -80569,13 +80925,13 @@ const Building2 = createLucideIcon("building-2", __iconNode$2g);
80569
80925
  */
80570
80926
 
80571
80927
 
80572
- const __iconNode$2f = [
80928
+ const __iconNode$2h = [
80573
80929
  ["path", { d: "M8 2v4", key: "1cmpym" }],
80574
80930
  ["path", { d: "M16 2v4", key: "4m81vk" }],
80575
80931
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
80576
80932
  ["path", { d: "M3 10h18", key: "8toen8" }]
80577
80933
  ];
80578
- const Calendar$1 = createLucideIcon("calendar", __iconNode$2f);
80934
+ const Calendar$1 = createLucideIcon("calendar", __iconNode$2h);
80579
80935
 
80580
80936
  /**
80581
80937
  * @license lucide-react v0.528.0 - ISC
@@ -80585,7 +80941,7 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$2f);
80585
80941
  */
80586
80942
 
80587
80943
 
80588
- const __iconNode$2e = [
80944
+ const __iconNode$2g = [
80589
80945
  [
80590
80946
  "path",
80591
80947
  {
@@ -80595,7 +80951,7 @@ const __iconNode$2e = [
80595
80951
  ],
80596
80952
  ["circle", { cx: "12", cy: "13", r: "3", key: "1vg3eu" }]
80597
80953
  ];
80598
- const Camera = createLucideIcon("camera", __iconNode$2e);
80954
+ const Camera = createLucideIcon("camera", __iconNode$2g);
80599
80955
 
80600
80956
  /**
80601
80957
  * @license lucide-react v0.528.0 - ISC
@@ -80605,11 +80961,11 @@ const Camera = createLucideIcon("camera", __iconNode$2e);
80605
80961
  */
80606
80962
 
80607
80963
 
80608
- const __iconNode$2d = [
80964
+ const __iconNode$2f = [
80609
80965
  ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
80610
80966
  ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
80611
80967
  ];
80612
- const CheckCheck = createLucideIcon("check-check", __iconNode$2d);
80968
+ const CheckCheck = createLucideIcon("check-check", __iconNode$2f);
80613
80969
 
80614
80970
  /**
80615
80971
  * @license lucide-react v0.528.0 - ISC
@@ -80619,8 +80975,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$2d);
80619
80975
  */
80620
80976
 
80621
80977
 
80622
- const __iconNode$2c = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
80623
- const Check = createLucideIcon("check", __iconNode$2c);
80978
+ const __iconNode$2e = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
80979
+ const Check = createLucideIcon("check", __iconNode$2e);
80624
80980
 
80625
80981
  /**
80626
80982
  * @license lucide-react v0.528.0 - ISC
@@ -80630,8 +80986,8 @@ const Check = createLucideIcon("check", __iconNode$2c);
80630
80986
  */
80631
80987
 
80632
80988
 
80633
- const __iconNode$2b = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
80634
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$2b);
80989
+ const __iconNode$2d = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
80990
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$2d);
80635
80991
 
80636
80992
  /**
80637
80993
  * @license lucide-react v0.528.0 - ISC
@@ -80641,11 +80997,11 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$2b);
80641
80997
  */
80642
80998
 
80643
80999
 
80644
- const __iconNode$2a = [
81000
+ const __iconNode$2c = [
80645
81001
  ["path", { d: "m17 18-6-6 6-6", key: "1yerx2" }],
80646
81002
  ["path", { d: "M7 6v12", key: "1p53r6" }]
80647
81003
  ];
80648
- const ChevronFirst = createLucideIcon("chevron-first", __iconNode$2a);
81004
+ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$2c);
80649
81005
 
80650
81006
  /**
80651
81007
  * @license lucide-react v0.528.0 - ISC
@@ -80655,11 +81011,11 @@ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$2a);
80655
81011
  */
80656
81012
 
80657
81013
 
80658
- const __iconNode$29 = [
81014
+ const __iconNode$2b = [
80659
81015
  ["path", { d: "m7 18 6-6-6-6", key: "lwmzdw" }],
80660
81016
  ["path", { d: "M17 6v12", key: "1o0aio" }]
80661
81017
  ];
80662
- const ChevronLast = createLucideIcon("chevron-last", __iconNode$29);
81018
+ const ChevronLast = createLucideIcon("chevron-last", __iconNode$2b);
80663
81019
 
80664
81020
  /**
80665
81021
  * @license lucide-react v0.528.0 - ISC
@@ -80669,8 +81025,8 @@ const ChevronLast = createLucideIcon("chevron-last", __iconNode$29);
80669
81025
  */
80670
81026
 
80671
81027
 
80672
- const __iconNode$28 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
80673
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$28);
81028
+ const __iconNode$2a = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
81029
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$2a);
80674
81030
 
80675
81031
  /**
80676
81032
  * @license lucide-react v0.528.0 - ISC
@@ -80680,8 +81036,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$28);
80680
81036
  */
80681
81037
 
80682
81038
 
80683
- const __iconNode$27 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
80684
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$27);
81039
+ const __iconNode$29 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
81040
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$29);
80685
81041
 
80686
81042
  /**
80687
81043
  * @license lucide-react v0.528.0 - ISC
@@ -80691,8 +81047,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$27);
80691
81047
  */
80692
81048
 
80693
81049
 
80694
- const __iconNode$26 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
80695
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$26);
81050
+ const __iconNode$28 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
81051
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$28);
80696
81052
 
80697
81053
  /**
80698
81054
  * @license lucide-react v0.528.0 - ISC
@@ -80702,11 +81058,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$26);
80702
81058
  */
80703
81059
 
80704
81060
 
80705
- const __iconNode$25 = [
81061
+ const __iconNode$27 = [
80706
81062
  ["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
80707
81063
  ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
80708
81064
  ];
80709
- const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$25);
81065
+ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$27);
80710
81066
 
80711
81067
  /**
80712
81068
  * @license lucide-react v0.528.0 - ISC
@@ -80716,11 +81072,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$25);
80716
81072
  */
80717
81073
 
80718
81074
 
80719
- const __iconNode$24 = [
81075
+ const __iconNode$26 = [
80720
81076
  ["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
80721
81077
  ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
80722
81078
  ];
80723
- const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$24);
81079
+ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$26);
80724
81080
 
80725
81081
  /**
80726
81082
  * @license lucide-react v0.528.0 - ISC
@@ -80730,11 +81086,11 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$24);
80730
81086
  */
80731
81087
 
80732
81088
 
80733
- const __iconNode$23 = [
81089
+ const __iconNode$25 = [
80734
81090
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
80735
81091
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
80736
81092
  ];
80737
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$23);
81093
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$25);
80738
81094
 
80739
81095
  /**
80740
81096
  * @license lucide-react v0.528.0 - ISC
@@ -80744,12 +81100,12 @@ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$23);
80744
81100
  */
80745
81101
 
80746
81102
 
80747
- const __iconNode$22 = [
81103
+ const __iconNode$24 = [
80748
81104
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
80749
81105
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
80750
81106
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
80751
81107
  ];
80752
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$22);
81108
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$24);
80753
81109
 
80754
81110
  /**
80755
81111
  * @license lucide-react v0.528.0 - ISC
@@ -80759,11 +81115,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$22);
80759
81115
  */
80760
81116
 
80761
81117
 
80762
- const __iconNode$21 = [
81118
+ const __iconNode$23 = [
80763
81119
  ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
80764
81120
  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
80765
81121
  ];
80766
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$21);
81122
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$23);
80767
81123
 
80768
81124
  /**
80769
81125
  * @license lucide-react v0.528.0 - ISC
@@ -80773,11 +81129,11 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$21);
80773
81129
  */
80774
81130
 
80775
81131
 
80776
- const __iconNode$20 = [
81132
+ const __iconNode$22 = [
80777
81133
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
80778
81134
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
80779
81135
  ];
80780
- const CircleCheck = createLucideIcon("circle-check", __iconNode$20);
81136
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$22);
80781
81137
 
80782
81138
  /**
80783
81139
  * @license lucide-react v0.528.0 - ISC
@@ -80787,11 +81143,11 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$20);
80787
81143
  */
80788
81144
 
80789
81145
 
80790
- const __iconNode$1$ = [
81146
+ const __iconNode$21 = [
80791
81147
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
80792
81148
  ["path", { d: "M8 12h8", key: "1wcyev" }]
80793
81149
  ];
80794
- const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1$);
81150
+ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$21);
80795
81151
 
80796
81152
  /**
80797
81153
  * @license lucide-react v0.528.0 - ISC
@@ -80801,11 +81157,11 @@ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1$);
80801
81157
  */
80802
81158
 
80803
81159
 
80804
- const __iconNode$1_ = [
81160
+ const __iconNode$20 = [
80805
81161
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
80806
81162
  ["rect", { x: "9", y: "9", width: "6", height: "6", rx: "1", key: "1ssd4o" }]
80807
81163
  ];
80808
- const CircleStop = createLucideIcon("circle-stop", __iconNode$1_);
81164
+ const CircleStop = createLucideIcon("circle-stop", __iconNode$20);
80809
81165
 
80810
81166
  /**
80811
81167
  * @license lucide-react v0.528.0 - ISC
@@ -80815,12 +81171,12 @@ const CircleStop = createLucideIcon("circle-stop", __iconNode$1_);
80815
81171
  */
80816
81172
 
80817
81173
 
80818
- const __iconNode$1Z = [
81174
+ const __iconNode$1$ = [
80819
81175
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
80820
81176
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
80821
81177
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
80822
81178
  ];
80823
- const CircleX = createLucideIcon("circle-x", __iconNode$1Z);
81179
+ const CircleX = createLucideIcon("circle-x", __iconNode$1$);
80824
81180
 
80825
81181
  /**
80826
81182
  * @license lucide-react v0.528.0 - ISC
@@ -80830,8 +81186,8 @@ const CircleX = createLucideIcon("circle-x", __iconNode$1Z);
80830
81186
  */
80831
81187
 
80832
81188
 
80833
- const __iconNode$1Y = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
80834
- const Circle = createLucideIcon("circle", __iconNode$1Y);
81189
+ const __iconNode$1_ = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
81190
+ const Circle = createLucideIcon("circle", __iconNode$1_);
80835
81191
 
80836
81192
  /**
80837
81193
  * @license lucide-react v0.528.0 - ISC
@@ -80841,7 +81197,7 @@ const Circle = createLucideIcon("circle", __iconNode$1Y);
80841
81197
  */
80842
81198
 
80843
81199
 
80844
- const __iconNode$1X = [
81200
+ const __iconNode$1Z = [
80845
81201
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
80846
81202
  [
80847
81203
  "path",
@@ -80855,7 +81211,7 @@ const __iconNode$1X = [
80855
81211
  ["path", { d: "M8 11h.01", key: "1dfujw" }],
80856
81212
  ["path", { d: "M8 16h.01", key: "18s6g9" }]
80857
81213
  ];
80858
- const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1X);
81214
+ const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1Z);
80859
81215
 
80860
81216
  /**
80861
81217
  * @license lucide-react v0.528.0 - ISC
@@ -80865,11 +81221,11 @@ const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1X);
80865
81221
  */
80866
81222
 
80867
81223
 
80868
- const __iconNode$1W = [
81224
+ const __iconNode$1Y = [
80869
81225
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
80870
81226
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
80871
81227
  ];
80872
- const Clock = createLucideIcon("clock", __iconNode$1W);
81228
+ const Clock = createLucideIcon("clock", __iconNode$1Y);
80873
81229
 
80874
81230
  /**
80875
81231
  * @license lucide-react v0.528.0 - ISC
@@ -80879,12 +81235,12 @@ const Clock = createLucideIcon("clock", __iconNode$1W);
80879
81235
  */
80880
81236
 
80881
81237
 
80882
- const __iconNode$1V = [
81238
+ const __iconNode$1X = [
80883
81239
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
80884
81240
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
80885
81241
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
80886
81242
  ];
80887
- const CodeXml = createLucideIcon("code-xml", __iconNode$1V);
81243
+ const CodeXml = createLucideIcon("code-xml", __iconNode$1X);
80888
81244
 
80889
81245
  /**
80890
81246
  * @license lucide-react v0.528.0 - ISC
@@ -80894,11 +81250,11 @@ const CodeXml = createLucideIcon("code-xml", __iconNode$1V);
80894
81250
  */
80895
81251
 
80896
81252
 
80897
- const __iconNode$1U = [
81253
+ const __iconNode$1W = [
80898
81254
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
80899
81255
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
80900
81256
  ];
80901
- const Code$1 = createLucideIcon("code", __iconNode$1U);
81257
+ const Code$1 = createLucideIcon("code", __iconNode$1W);
80902
81258
 
80903
81259
  /**
80904
81260
  * @license lucide-react v0.528.0 - ISC
@@ -80908,11 +81264,27 @@ const Code$1 = createLucideIcon("code", __iconNode$1U);
80908
81264
  */
80909
81265
 
80910
81266
 
80911
- const __iconNode$1T = [
81267
+ const __iconNode$1V = [
81268
+ ["circle", { cx: "8", cy: "8", r: "6", key: "3yglwk" }],
81269
+ ["path", { d: "M18.09 10.37A6 6 0 1 1 10.34 18", key: "t5s6rm" }],
81270
+ ["path", { d: "M7 6h1v4", key: "1obek4" }],
81271
+ ["path", { d: "m16.71 13.88.7.71-2.82 2.82", key: "1rbuyh" }]
81272
+ ];
81273
+ const Coins = createLucideIcon("coins", __iconNode$1V);
81274
+
81275
+ /**
81276
+ * @license lucide-react v0.528.0 - ISC
81277
+ *
81278
+ * This source code is licensed under the ISC license.
81279
+ * See the LICENSE file in the root directory of this source tree.
81280
+ */
81281
+
81282
+
81283
+ const __iconNode$1U = [
80912
81284
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
80913
81285
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
80914
81286
  ];
80915
- const Copy = createLucideIcon("copy", __iconNode$1T);
81287
+ const Copy = createLucideIcon("copy", __iconNode$1U);
80916
81288
 
80917
81289
  /**
80918
81290
  * @license lucide-react v0.528.0 - ISC
@@ -80922,11 +81294,11 @@ const Copy = createLucideIcon("copy", __iconNode$1T);
80922
81294
  */
80923
81295
 
80924
81296
 
80925
- const __iconNode$1S = [
81297
+ const __iconNode$1T = [
80926
81298
  ["rect", { width: "20", height: "14", x: "2", y: "5", rx: "2", key: "ynyp8z" }],
80927
81299
  ["line", { x1: "2", x2: "22", y1: "10", y2: "10", key: "1b3vmo" }]
80928
81300
  ];
80929
- const CreditCard = createLucideIcon("credit-card", __iconNode$1S);
81301
+ const CreditCard = createLucideIcon("credit-card", __iconNode$1T);
80930
81302
 
80931
81303
  /**
80932
81304
  * @license lucide-react v0.528.0 - ISC
@@ -80936,12 +81308,12 @@ const CreditCard = createLucideIcon("credit-card", __iconNode$1S);
80936
81308
  */
80937
81309
 
80938
81310
 
80939
- const __iconNode$1R = [
81311
+ const __iconNode$1S = [
80940
81312
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
80941
81313
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
80942
81314
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
80943
81315
  ];
80944
- const Database = createLucideIcon("database", __iconNode$1R);
81316
+ const Database = createLucideIcon("database", __iconNode$1S);
80945
81317
 
80946
81318
  /**
80947
81319
  * @license lucide-react v0.528.0 - ISC
@@ -80951,11 +81323,11 @@ const Database = createLucideIcon("database", __iconNode$1R);
80951
81323
  */
80952
81324
 
80953
81325
 
80954
- const __iconNode$1Q = [
81326
+ const __iconNode$1R = [
80955
81327
  ["line", { x1: "12", x2: "12", y1: "2", y2: "22", key: "7eqyqh" }],
80956
81328
  ["path", { d: "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6", key: "1b0p4s" }]
80957
81329
  ];
80958
- const DollarSign = createLucideIcon("dollar-sign", __iconNode$1Q);
81330
+ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1R);
80959
81331
 
80960
81332
  /**
80961
81333
  * @license lucide-react v0.528.0 - ISC
@@ -80965,7 +81337,7 @@ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1Q);
80965
81337
  */
80966
81338
 
80967
81339
 
80968
- const __iconNode$1P = [
81340
+ const __iconNode$1Q = [
80969
81341
  ["path", { d: "M11 20H2", key: "nlcfvz" }],
80970
81342
  [
80971
81343
  "path",
@@ -80978,7 +81350,7 @@ const __iconNode$1P = [
80978
81350
  ["path", { d: "M14 12h.01", key: "1jfl7z" }],
80979
81351
  ["path", { d: "M22 20h-3", key: "vhrsz" }]
80980
81352
  ];
80981
- const DoorOpen = createLucideIcon("door-open", __iconNode$1P);
81353
+ const DoorOpen = createLucideIcon("door-open", __iconNode$1Q);
80982
81354
 
80983
81355
  /**
80984
81356
  * @license lucide-react v0.528.0 - ISC
@@ -80988,12 +81360,12 @@ const DoorOpen = createLucideIcon("door-open", __iconNode$1P);
80988
81360
  */
80989
81361
 
80990
81362
 
80991
- const __iconNode$1O = [
81363
+ const __iconNode$1P = [
80992
81364
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
80993
81365
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
80994
81366
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
80995
81367
  ];
80996
- const Download = createLucideIcon("download", __iconNode$1O);
81368
+ const Download = createLucideIcon("download", __iconNode$1P);
80997
81369
 
80998
81370
  /**
80999
81371
  * @license lucide-react v0.528.0 - ISC
@@ -81003,12 +81375,12 @@ const Download = createLucideIcon("download", __iconNode$1O);
81003
81375
  */
81004
81376
 
81005
81377
 
81006
- const __iconNode$1N = [
81378
+ const __iconNode$1O = [
81007
81379
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
81008
81380
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
81009
81381
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
81010
81382
  ];
81011
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1N);
81383
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1O);
81012
81384
 
81013
81385
  /**
81014
81386
  * @license lucide-react v0.528.0 - ISC
@@ -81018,12 +81390,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1N);
81018
81390
  */
81019
81391
 
81020
81392
 
81021
- const __iconNode$1M = [
81393
+ const __iconNode$1N = [
81022
81394
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
81023
81395
  ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
81024
81396
  ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
81025
81397
  ];
81026
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$1M);
81398
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1N);
81027
81399
 
81028
81400
  /**
81029
81401
  * @license lucide-react v0.528.0 - ISC
@@ -81033,12 +81405,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1M);
81033
81405
  */
81034
81406
 
81035
81407
 
81036
- const __iconNode$1L = [
81408
+ const __iconNode$1M = [
81037
81409
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
81038
81410
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
81039
81411
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
81040
81412
  ];
81041
- const ExternalLink = createLucideIcon("external-link", __iconNode$1L);
81413
+ const ExternalLink = createLucideIcon("external-link", __iconNode$1M);
81042
81414
 
81043
81415
  /**
81044
81416
  * @license lucide-react v0.528.0 - ISC
@@ -81048,7 +81420,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$1L);
81048
81420
  */
81049
81421
 
81050
81422
 
81051
- const __iconNode$1K = [
81423
+ const __iconNode$1L = [
81052
81424
  [
81053
81425
  "path",
81054
81426
  {
@@ -81066,7 +81438,7 @@ const __iconNode$1K = [
81066
81438
  ],
81067
81439
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
81068
81440
  ];
81069
- const EyeOff = createLucideIcon("eye-off", __iconNode$1K);
81441
+ const EyeOff = createLucideIcon("eye-off", __iconNode$1L);
81070
81442
 
81071
81443
  /**
81072
81444
  * @license lucide-react v0.528.0 - ISC
@@ -81076,7 +81448,7 @@ const EyeOff = createLucideIcon("eye-off", __iconNode$1K);
81076
81448
  */
81077
81449
 
81078
81450
 
81079
- const __iconNode$1J = [
81451
+ const __iconNode$1K = [
81080
81452
  [
81081
81453
  "path",
81082
81454
  {
@@ -81086,7 +81458,7 @@ const __iconNode$1J = [
81086
81458
  ],
81087
81459
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
81088
81460
  ];
81089
- const Eye = createLucideIcon("eye", __iconNode$1J);
81461
+ const Eye = createLucideIcon("eye", __iconNode$1K);
81090
81462
 
81091
81463
  /**
81092
81464
  * @license lucide-react v0.528.0 - ISC
@@ -81096,7 +81468,7 @@ const Eye = createLucideIcon("eye", __iconNode$1J);
81096
81468
  */
81097
81469
 
81098
81470
 
81099
- const __iconNode$1I = [
81471
+ const __iconNode$1J = [
81100
81472
  ["path", { d: "M10 12v-1", key: "v7bkov" }],
81101
81473
  ["path", { d: "M10 18v-2", key: "1cjy8d" }],
81102
81474
  ["path", { d: "M10 7V6", key: "dljcrl" }],
@@ -81107,7 +81479,7 @@ const __iconNode$1I = [
81107
81479
  ],
81108
81480
  ["circle", { cx: "10", cy: "20", r: "2", key: "1xzdoj" }]
81109
81481
  ];
81110
- const FileArchive = createLucideIcon("file-archive", __iconNode$1I);
81482
+ const FileArchive = createLucideIcon("file-archive", __iconNode$1J);
81111
81483
 
81112
81484
  /**
81113
81485
  * @license lucide-react v0.528.0 - ISC
@@ -81117,7 +81489,7 @@ const FileArchive = createLucideIcon("file-archive", __iconNode$1I);
81117
81489
  */
81118
81490
 
81119
81491
 
81120
- const __iconNode$1H = [
81492
+ const __iconNode$1I = [
81121
81493
  ["path", { d: "M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3", key: "rslqgf" }],
81122
81494
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81123
81495
  [
@@ -81128,7 +81500,7 @@ const __iconNode$1H = [
81128
81500
  }
81129
81501
  ]
81130
81502
  ];
81131
- const FileAudio = createLucideIcon("file-audio", __iconNode$1H);
81503
+ const FileAudio = createLucideIcon("file-audio", __iconNode$1I);
81132
81504
 
81133
81505
  /**
81134
81506
  * @license lucide-react v0.528.0 - ISC
@@ -81138,13 +81510,13 @@ const FileAudio = createLucideIcon("file-audio", __iconNode$1H);
81138
81510
  */
81139
81511
 
81140
81512
 
81141
- const __iconNode$1G = [
81513
+ const __iconNode$1H = [
81142
81514
  ["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
81143
81515
  ["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }],
81144
81516
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81145
81517
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }]
81146
81518
  ];
81147
- const FileCode = createLucideIcon("file-code", __iconNode$1G);
81519
+ const FileCode = createLucideIcon("file-code", __iconNode$1H);
81148
81520
 
81149
81521
  /**
81150
81522
  * @license lucide-react v0.528.0 - ISC
@@ -81154,13 +81526,13 @@ const FileCode = createLucideIcon("file-code", __iconNode$1G);
81154
81526
  */
81155
81527
 
81156
81528
 
81157
- const __iconNode$1F = [
81529
+ const __iconNode$1G = [
81158
81530
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
81159
81531
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81160
81532
  ["path", { d: "M12 18v-6", key: "17g6i2" }],
81161
81533
  ["path", { d: "m9 15 3 3 3-3", key: "1npd3o" }]
81162
81534
  ];
81163
- const FileDown = createLucideIcon("file-down", __iconNode$1F);
81535
+ const FileDown = createLucideIcon("file-down", __iconNode$1G);
81164
81536
 
81165
81537
  /**
81166
81538
  * @license lucide-react v0.528.0 - ISC
@@ -81170,13 +81542,13 @@ const FileDown = createLucideIcon("file-down", __iconNode$1F);
81170
81542
  */
81171
81543
 
81172
81544
 
81173
- const __iconNode$1E = [
81545
+ const __iconNode$1F = [
81174
81546
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
81175
81547
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81176
81548
  ["circle", { cx: "10", cy: "12", r: "2", key: "737tya" }],
81177
81549
  ["path", { d: "m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22", key: "wt3hpn" }]
81178
81550
  ];
81179
- const FileImage = createLucideIcon("file-image", __iconNode$1E);
81551
+ const FileImage = createLucideIcon("file-image", __iconNode$1F);
81180
81552
 
81181
81553
  /**
81182
81554
  * @license lucide-react v0.528.0 - ISC
@@ -81186,7 +81558,7 @@ const FileImage = createLucideIcon("file-image", __iconNode$1E);
81186
81558
  */
81187
81559
 
81188
81560
 
81189
- const __iconNode$1D = [
81561
+ const __iconNode$1E = [
81190
81562
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81191
81563
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }],
81192
81564
  [
@@ -81197,7 +81569,7 @@ const __iconNode$1D = [
81197
81569
  }
81198
81570
  ]
81199
81571
  ];
81200
- const FilePlay = createLucideIcon("file-play", __iconNode$1D);
81572
+ const FilePlay = createLucideIcon("file-play", __iconNode$1E);
81201
81573
 
81202
81574
  /**
81203
81575
  * @license lucide-react v0.528.0 - ISC
@@ -81207,7 +81579,7 @@ const FilePlay = createLucideIcon("file-play", __iconNode$1D);
81207
81579
  */
81208
81580
 
81209
81581
 
81210
- const __iconNode$1C = [
81582
+ const __iconNode$1D = [
81211
81583
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
81212
81584
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81213
81585
  ["path", { d: "M8 13h2", key: "yr2amv" }],
@@ -81215,7 +81587,7 @@ const __iconNode$1C = [
81215
81587
  ["path", { d: "M8 17h2", key: "2yhykz" }],
81216
81588
  ["path", { d: "M14 17h2", key: "10kma7" }]
81217
81589
  ];
81218
- const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1C);
81590
+ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1D);
81219
81591
 
81220
81592
  /**
81221
81593
  * @license lucide-react v0.528.0 - ISC
@@ -81225,14 +81597,14 @@ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1C);
81225
81597
  */
81226
81598
 
81227
81599
 
81228
- const __iconNode$1B = [
81600
+ const __iconNode$1C = [
81229
81601
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
81230
81602
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
81231
81603
  ["path", { d: "M10 9H8", key: "b1mrlr" }],
81232
81604
  ["path", { d: "M16 13H8", key: "t4e002" }],
81233
81605
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
81234
81606
  ];
81235
- const FileText = createLucideIcon("file-text", __iconNode$1B);
81607
+ const FileText = createLucideIcon("file-text", __iconNode$1C);
81236
81608
 
81237
81609
  /**
81238
81610
  * @license lucide-react v0.528.0 - ISC
@@ -81242,11 +81614,11 @@ const FileText = createLucideIcon("file-text", __iconNode$1B);
81242
81614
  */
81243
81615
 
81244
81616
 
81245
- const __iconNode$1A = [
81617
+ const __iconNode$1B = [
81246
81618
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
81247
81619
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }]
81248
81620
  ];
81249
- const File$1 = createLucideIcon("file", __iconNode$1A);
81621
+ const File$1 = createLucideIcon("file", __iconNode$1B);
81250
81622
 
81251
81623
  /**
81252
81624
  * @license lucide-react v0.528.0 - ISC
@@ -81256,7 +81628,7 @@ const File$1 = createLucideIcon("file", __iconNode$1A);
81256
81628
  */
81257
81629
 
81258
81630
 
81259
- const __iconNode$1z = [
81631
+ const __iconNode$1A = [
81260
81632
  [
81261
81633
  "path",
81262
81634
  {
@@ -81274,7 +81646,7 @@ const __iconNode$1z = [
81274
81646
  ["path", { d: "M3 5a2 2 0 0 0 2 2h3", key: "f2jnh7" }],
81275
81647
  ["path", { d: "M3 3v13a2 2 0 0 0 2 2h3", key: "k8epm1" }]
81276
81648
  ];
81277
- const FolderTree = createLucideIcon("folder-tree", __iconNode$1z);
81649
+ const FolderTree = createLucideIcon("folder-tree", __iconNode$1A);
81278
81650
 
81279
81651
  /**
81280
81652
  * @license lucide-react v0.528.0 - ISC
@@ -81284,11 +81656,11 @@ const FolderTree = createLucideIcon("folder-tree", __iconNode$1z);
81284
81656
  */
81285
81657
 
81286
81658
 
81287
- const __iconNode$1y = [
81659
+ const __iconNode$1z = [
81288
81660
  ["path", { d: "m12 14 4-4", key: "9kzdfg" }],
81289
81661
  ["path", { d: "M3.34 19a10 10 0 1 1 17.32 0", key: "19p75a" }]
81290
81662
  ];
81291
- const Gauge = createLucideIcon("gauge", __iconNode$1y);
81663
+ const Gauge = createLucideIcon("gauge", __iconNode$1z);
81292
81664
 
81293
81665
  /**
81294
81666
  * @license lucide-react v0.528.0 - ISC
@@ -81298,14 +81670,14 @@ const Gauge = createLucideIcon("gauge", __iconNode$1y);
81298
81670
  */
81299
81671
 
81300
81672
 
81301
- const __iconNode$1x = [
81673
+ const __iconNode$1y = [
81302
81674
  ["path", { d: "m14.5 12.5-8 8a2.119 2.119 0 1 1-3-3l8-8", key: "15492f" }],
81303
81675
  ["path", { d: "m16 16 6-6", key: "vzrcl6" }],
81304
81676
  ["path", { d: "m8 8 6-6", key: "18bi4p" }],
81305
81677
  ["path", { d: "m9 7 8 8", key: "5jnvq1" }],
81306
81678
  ["path", { d: "m21 11-8-8", key: "z4y7zo" }]
81307
81679
  ];
81308
- const Gavel = createLucideIcon("gavel", __iconNode$1x);
81680
+ const Gavel = createLucideIcon("gavel", __iconNode$1y);
81309
81681
 
81310
81682
  /**
81311
81683
  * @license lucide-react v0.528.0 - ISC
@@ -81315,13 +81687,13 @@ const Gavel = createLucideIcon("gavel", __iconNode$1x);
81315
81687
  */
81316
81688
 
81317
81689
 
81318
- const __iconNode$1w = [
81690
+ const __iconNode$1x = [
81319
81691
  ["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
81320
81692
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
81321
81693
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
81322
81694
  ["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
81323
81695
  ];
81324
- const GitBranch = createLucideIcon("git-branch", __iconNode$1w);
81696
+ const GitBranch = createLucideIcon("git-branch", __iconNode$1x);
81325
81697
 
81326
81698
  /**
81327
81699
  * @license lucide-react v0.528.0 - ISC
@@ -81331,12 +81703,12 @@ const GitBranch = createLucideIcon("git-branch", __iconNode$1w);
81331
81703
  */
81332
81704
 
81333
81705
 
81334
- const __iconNode$1v = [
81706
+ const __iconNode$1w = [
81335
81707
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
81336
81708
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
81337
81709
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
81338
81710
  ];
81339
- const Globe = createLucideIcon("globe", __iconNode$1v);
81711
+ const Globe = createLucideIcon("globe", __iconNode$1w);
81340
81712
 
81341
81713
  /**
81342
81714
  * @license lucide-react v0.528.0 - ISC
@@ -81346,7 +81718,7 @@ const Globe = createLucideIcon("globe", __iconNode$1v);
81346
81718
  */
81347
81719
 
81348
81720
 
81349
- const __iconNode$1u = [
81721
+ const __iconNode$1v = [
81350
81722
  [
81351
81723
  "path",
81352
81724
  {
@@ -81357,7 +81729,7 @@ const __iconNode$1u = [
81357
81729
  ["path", { d: "M22 10v6", key: "1lu8f3" }],
81358
81730
  ["path", { d: "M6 12.5V16a6 3 0 0 0 12 0v-3.5", key: "1r8lef" }]
81359
81731
  ];
81360
- const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1u);
81732
+ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1v);
81361
81733
 
81362
81734
  /**
81363
81735
  * @license lucide-react v0.528.0 - ISC
@@ -81367,7 +81739,7 @@ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1u);
81367
81739
  */
81368
81740
 
81369
81741
 
81370
- const __iconNode$1t = [
81742
+ const __iconNode$1u = [
81371
81743
  ["path", { d: "M14 18a2 2 0 0 0-4 0", key: "1v8fkw" }],
81372
81744
  [
81373
81745
  "path",
@@ -81380,7 +81752,7 @@ const __iconNode$1t = [
81380
81752
  ["circle", { cx: "17", cy: "18", r: "3", key: "82mm0e" }],
81381
81753
  ["circle", { cx: "7", cy: "18", r: "3", key: "lvkj7j" }]
81382
81754
  ];
81383
- const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1t);
81755
+ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1u);
81384
81756
 
81385
81757
  /**
81386
81758
  * @license lucide-react v0.528.0 - ISC
@@ -81390,13 +81762,13 @@ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1t);
81390
81762
  */
81391
81763
 
81392
81764
 
81393
- const __iconNode$1s = [
81765
+ const __iconNode$1t = [
81394
81766
  ["path", { d: "M4 12h8", key: "17cfdx" }],
81395
81767
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
81396
81768
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
81397
81769
  ["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
81398
81770
  ];
81399
- const Heading1 = createLucideIcon("heading-1", __iconNode$1s);
81771
+ const Heading1 = createLucideIcon("heading-1", __iconNode$1t);
81400
81772
 
81401
81773
  /**
81402
81774
  * @license lucide-react v0.528.0 - ISC
@@ -81406,13 +81778,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$1s);
81406
81778
  */
81407
81779
 
81408
81780
 
81409
- const __iconNode$1r = [
81781
+ const __iconNode$1s = [
81410
81782
  ["path", { d: "M4 12h8", key: "17cfdx" }],
81411
81783
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
81412
81784
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
81413
81785
  ["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
81414
81786
  ];
81415
- const Heading2 = createLucideIcon("heading-2", __iconNode$1r);
81787
+ const Heading2 = createLucideIcon("heading-2", __iconNode$1s);
81416
81788
 
81417
81789
  /**
81418
81790
  * @license lucide-react v0.528.0 - ISC
@@ -81422,14 +81794,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$1r);
81422
81794
  */
81423
81795
 
81424
81796
 
81425
- const __iconNode$1q = [
81797
+ const __iconNode$1r = [
81426
81798
  ["path", { d: "M4 12h8", key: "17cfdx" }],
81427
81799
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
81428
81800
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
81429
81801
  ["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
81430
81802
  ["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
81431
81803
  ];
81432
- const Heading3 = createLucideIcon("heading-3", __iconNode$1q);
81804
+ const Heading3 = createLucideIcon("heading-3", __iconNode$1r);
81433
81805
 
81434
81806
  /**
81435
81807
  * @license lucide-react v0.528.0 - ISC
@@ -81439,12 +81811,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$1q);
81439
81811
  */
81440
81812
 
81441
81813
 
81442
- const __iconNode$1p = [
81814
+ const __iconNode$1q = [
81443
81815
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
81444
81816
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
81445
81817
  ["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
81446
81818
  ];
81447
- const History = createLucideIcon("history", __iconNode$1p);
81819
+ const History = createLucideIcon("history", __iconNode$1q);
81448
81820
 
81449
81821
  /**
81450
81822
  * @license lucide-react v0.528.0 - ISC
@@ -81454,12 +81826,12 @@ const History = createLucideIcon("history", __iconNode$1p);
81454
81826
  */
81455
81827
 
81456
81828
 
81457
- const __iconNode$1o = [
81829
+ const __iconNode$1p = [
81458
81830
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
81459
81831
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
81460
81832
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
81461
81833
  ];
81462
- const Image$3 = createLucideIcon("image", __iconNode$1o);
81834
+ const Image$3 = createLucideIcon("image", __iconNode$1p);
81463
81835
 
81464
81836
  /**
81465
81837
  * @license lucide-react v0.528.0 - ISC
@@ -81469,7 +81841,7 @@ const Image$3 = createLucideIcon("image", __iconNode$1o);
81469
81841
  */
81470
81842
 
81471
81843
 
81472
- const __iconNode$1n = [
81844
+ const __iconNode$1o = [
81473
81845
  ["polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12", key: "o97t9d" }],
81474
81846
  [
81475
81847
  "path",
@@ -81479,7 +81851,7 @@ const __iconNode$1n = [
81479
81851
  }
81480
81852
  ]
81481
81853
  ];
81482
- const Inbox = createLucideIcon("inbox", __iconNode$1n);
81854
+ const Inbox = createLucideIcon("inbox", __iconNode$1o);
81483
81855
 
81484
81856
  /**
81485
81857
  * @license lucide-react v0.528.0 - ISC
@@ -81489,12 +81861,12 @@ const Inbox = createLucideIcon("inbox", __iconNode$1n);
81489
81861
  */
81490
81862
 
81491
81863
 
81492
- const __iconNode$1m = [
81864
+ const __iconNode$1n = [
81493
81865
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
81494
81866
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
81495
81867
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
81496
81868
  ];
81497
- const Info$3 = createLucideIcon("info", __iconNode$1m);
81869
+ const Info$3 = createLucideIcon("info", __iconNode$1n);
81498
81870
 
81499
81871
  /**
81500
81872
  * @license lucide-react v0.528.0 - ISC
@@ -81504,12 +81876,12 @@ const Info$3 = createLucideIcon("info", __iconNode$1m);
81504
81876
  */
81505
81877
 
81506
81878
 
81507
- const __iconNode$1l = [
81879
+ const __iconNode$1m = [
81508
81880
  ["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
81509
81881
  ["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
81510
81882
  ["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
81511
81883
  ];
81512
- const Italic$1 = createLucideIcon("italic", __iconNode$1l);
81884
+ const Italic$1 = createLucideIcon("italic", __iconNode$1m);
81513
81885
 
81514
81886
  /**
81515
81887
  * @license lucide-react v0.528.0 - ISC
@@ -81519,7 +81891,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$1l);
81519
81891
  */
81520
81892
 
81521
81893
 
81522
- const __iconNode$1k = [
81894
+ const __iconNode$1l = [
81523
81895
  [
81524
81896
  "path",
81525
81897
  {
@@ -81529,7 +81901,7 @@ const __iconNode$1k = [
81529
81901
  ],
81530
81902
  ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
81531
81903
  ];
81532
- const KeyRound = createLucideIcon("key-round", __iconNode$1k);
81904
+ const KeyRound = createLucideIcon("key-round", __iconNode$1l);
81533
81905
 
81534
81906
  /**
81535
81907
  * @license lucide-react v0.528.0 - ISC
@@ -81539,7 +81911,7 @@ const KeyRound = createLucideIcon("key-round", __iconNode$1k);
81539
81911
  */
81540
81912
 
81541
81913
 
81542
- const __iconNode$1j = [
81914
+ const __iconNode$1k = [
81543
81915
  ["path", { d: "M10 18v-7", key: "wt116b" }],
81544
81916
  [
81545
81917
  "path",
@@ -81553,7 +81925,7 @@ const __iconNode$1j = [
81553
81925
  ["path", { d: "M3 22h18", key: "8prr45" }],
81554
81926
  ["path", { d: "M6 18v-7", key: "1ivflk" }]
81555
81927
  ];
81556
- const Landmark = createLucideIcon("landmark", __iconNode$1j);
81928
+ const Landmark = createLucideIcon("landmark", __iconNode$1k);
81557
81929
 
81558
81930
  /**
81559
81931
  * @license lucide-react v0.528.0 - ISC
@@ -81563,7 +81935,7 @@ const Landmark = createLucideIcon("landmark", __iconNode$1j);
81563
81935
  */
81564
81936
 
81565
81937
 
81566
- const __iconNode$1i = [
81938
+ const __iconNode$1j = [
81567
81939
  [
81568
81940
  "path",
81569
81941
  {
@@ -81586,7 +81958,23 @@ const __iconNode$1i = [
81586
81958
  }
81587
81959
  ]
81588
81960
  ];
81589
- const Layers = createLucideIcon("layers", __iconNode$1i);
81961
+ const Layers = createLucideIcon("layers", __iconNode$1j);
81962
+
81963
+ /**
81964
+ * @license lucide-react v0.528.0 - ISC
81965
+ *
81966
+ * This source code is licensed under the ISC license.
81967
+ * See the LICENSE file in the root directory of this source tree.
81968
+ */
81969
+
81970
+
81971
+ const __iconNode$1i = [
81972
+ ["rect", { width: "7", height: "9", x: "3", y: "3", rx: "1", key: "10lvy0" }],
81973
+ ["rect", { width: "7", height: "5", x: "14", y: "3", rx: "1", key: "16une8" }],
81974
+ ["rect", { width: "7", height: "9", x: "14", y: "12", rx: "1", key: "1hutg5" }],
81975
+ ["rect", { width: "7", height: "5", x: "3", y: "16", rx: "1", key: "ldoo1y" }]
81976
+ ];
81977
+ const LayoutDashboard = createLucideIcon("layout-dashboard", __iconNode$1i);
81590
81978
 
81591
81979
  /**
81592
81980
  * @license lucide-react v0.528.0 - ISC
@@ -147212,7 +147600,7 @@ const Collapsible = Root$5;
147212
147600
  const CollapsibleTrigger = CollapsibleTrigger$1;
147213
147601
  const CollapsibleContent = CollapsibleContent$1;
147214
147602
 
147215
- const BAR_COLOR$1 = 'var(--color-amber-500, #f59e0b)';
147603
+ const BAR_COLOR$2 = 'var(--color-amber-500, #f59e0b)';
147216
147604
  const ERROR_MESSAGES = {
147217
147605
  forbidden: 'Completion breakdown is not available for this learner.',
147218
147606
  not_enrolled: 'This learner is not enrolled in this course.',
@@ -147229,7 +147617,7 @@ const formatPct = (value) => {
147229
147617
  };
147230
147618
  function CompletionBar({ value, label }) {
147231
147619
  const clamped = Math.min(Math.max(value, 0), 100);
147232
- return (jsx("span", { className: "block h-1.5 w-full rounded-full bg-gray-200", role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": clamped, children: jsx("span", { className: "block h-1.5 rounded-full", style: { width: `${clamped}%`, backgroundColor: BAR_COLOR$1 } }) }));
147620
+ return (jsx("span", { className: "block h-1.5 w-full rounded-full bg-gray-200", role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": clamped, children: jsx("span", { className: "block h-1.5 rounded-full", style: { width: `${clamped}%`, backgroundColor: BAR_COLOR$2 } }) }));
147233
147621
  }
147234
147622
  function SubsectionRow({ block }) {
147235
147623
  return (jsxs("li", { className: "space-y-1 py-2", children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs("span", { className: "flex min-w-0 items-center gap-1.5 text-sm text-gray-700", children: [jsx("span", { className: "truncate", children: block.display_name }), block.special_exam_info ? (jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 rounded-full bg-gray-100 px-2 py-0.5 text-[11px] text-gray-600", children: [jsx(Clock, { className: "h-3 w-3", "aria-hidden": "true" }), block.special_exam_info.short_description] })) : null] }), jsx("span", { className: "shrink-0 text-xs font-medium text-gray-600", children: formatPct(block.completion_percentage) })] }), jsx(CompletionBar, { value: block.completion_percentage, label: `${block.display_name} completion` })] }));
@@ -147275,7 +147663,7 @@ function CourseCompletionBreakdown({ username, courseId, tenantKey, skip = false
147275
147663
  }
147276
147664
 
147277
147665
  // Theme token (the same one bg-amber-500 resolves to), with Tailwind's default as fallback.
147278
- const COMPLETED_COLOR = 'var(--color-amber-500, #f59e0b)';
147666
+ const COMPLETED_COLOR$1 = 'var(--color-amber-500, #f59e0b)';
147279
147667
  const REMAINING_COLOR = '#E5E7EB';
147280
147668
  const formatDate$2 = (value) => {
147281
147669
  if (!value)
@@ -147379,7 +147767,7 @@ function EnrolledUserProgressModal({ open, onOpenChange, username, userName, ema
147379
147767
  ];
147380
147768
  const currentGradePct = fractionToPct((_f = (_e = item === null || item === void 0 ? void 0 : item.edx_progress) === null || _e === void 0 ? void 0 : _e.course_grade) === null || _f === void 0 ? void 0 : _f.percent);
147381
147769
  const passingPct = getPassingPct((_h = (_g = item === null || item === void 0 ? void 0 : item.edx_progress) === null || _g === void 0 ? void 0 : _g.grading_policy) === null || _h === void 0 ? void 0 : _h.grade_range);
147382
- return (jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: jsxs(DialogContent, { className: "max-w-2xl max-h-[85vh] overflow-y-auto", "aria-label": "Enrolled user progress", children: [jsxs(DialogHeader, { children: [jsx(DialogTitle, { children: userName || username || 'Learner progress' }), jsxs(DialogDescription, { children: [email ? `${email} · ` : '', resolvedName || (isProgram ? 'Program progress' : 'Course progress')] })] }), loading ? (jsx("div", { className: "flex items-center justify-center py-12", children: jsx("div", { className: "text-sm text-gray-500", children: "Loading..." }) })) : !item ? (jsx(EmptyStats, { title: "No progress data available" })) : (jsxs("div", { className: "space-y-6", children: [jsxs("div", { className: "relative mx-auto", style: { width: 220, height: 220 }, children: [jsx(ResponsiveContainer, { width: "100%", height: "100%", children: jsx(PieChart, { children: jsxs(Pie, { data: pieData, dataKey: "value", cx: "50%", cy: "50%", innerRadius: 75, outerRadius: 100, startAngle: 90, endAngle: -270, stroke: "none", isAnimationActive: false, children: [jsx(Cell, { fill: COMPLETED_COLOR }), jsx(Cell, { fill: REMAINING_COLOR })] }) }) }), jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center pointer-events-none", children: [jsxs("span", { className: "text-3xl font-bold text-gray-700", children: [percentage, "%"] }), jsx("span", { className: "text-sm text-gray-500", children: "completed" })] })] }), jsxs("div", { className: "divide-y divide-[oklch(0.922_0_0)]", children: [jsx(DetailRow$1, { label: "Status", children: jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${((_j = item.completion) === null || _j === void 0 ? void 0 : _j.passed)
147770
+ return (jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: jsxs(DialogContent, { className: "max-w-2xl max-h-[85vh] overflow-y-auto", "aria-label": "Enrolled user progress", children: [jsxs(DialogHeader, { children: [jsx(DialogTitle, { children: userName || username || 'Learner progress' }), jsxs(DialogDescription, { children: [email ? `${email} · ` : '', resolvedName || (isProgram ? 'Program progress' : 'Course progress')] })] }), loading ? (jsx("div", { className: "flex items-center justify-center py-12", children: jsx("div", { className: "text-sm text-gray-500", children: "Loading..." }) })) : !item ? (jsx(EmptyStats, { title: "No progress data available" })) : (jsxs("div", { className: "space-y-6", children: [jsxs("div", { className: "relative mx-auto", style: { width: 220, height: 220 }, children: [jsx(ResponsiveContainer, { width: "100%", height: "100%", children: jsx(PieChart, { children: jsxs(Pie, { data: pieData, dataKey: "value", cx: "50%", cy: "50%", innerRadius: 75, outerRadius: 100, startAngle: 90, endAngle: -270, stroke: "none", isAnimationActive: false, children: [jsx(Cell, { fill: COMPLETED_COLOR$1 }), jsx(Cell, { fill: REMAINING_COLOR })] }) }) }), jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center pointer-events-none", children: [jsxs("span", { className: "text-3xl font-bold text-gray-700", children: [percentage, "%"] }), jsx("span", { className: "text-sm text-gray-500", children: "completed" })] })] }), jsxs("div", { className: "divide-y divide-[oklch(0.922_0_0)]", children: [jsx(DetailRow$1, { label: "Status", children: jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${((_j = item.completion) === null || _j === void 0 ? void 0 : _j.passed)
147383
147771
  ? 'bg-green-50 text-green-700'
147384
147772
  : 'bg-gray-100 text-gray-600'}`, children: ((_k = item.completion) === null || _k === void 0 ? void 0 : _k.passed) ? 'Passed' : 'Not passed' }) }), jsx(DetailRow$1, { label: "Passed on", children: formatDate$2((_l = item.completion) === null || _l === void 0 ? void 0 : _l.passed_date) }), jsx(DetailRow$1, { label: "Time spent", children: item.time_spent || '—' }), jsx(DetailRow$1, { label: "Enrollment date", children: formatDate$2((_o = (_m = item.enrollment) === null || _m === void 0 ? void 0 : _m.started) !== null && _o !== void 0 ? _o : (_p = item.enrollment) === null || _p === void 0 ? void 0 : _p.created) })] }), !isProgram ? (jsx(CourseCompletionBreakdown, { username: username, courseId: normalizedId, tenantKey: tenantKey, skip: !open })) : null, ((_s = (_r = (_q = item.edx_progress) === null || _q === void 0 ? void 0 : _q.grading_policy) === null || _r === void 0 ? void 0 : _r.assignment_policies) === null || _s === void 0 ? void 0 : _s.length) ? (jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "rounded-lg border p-4", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx("h4", { className: "text-sm font-semibold text-gray-900", children: "Grades" }), jsx("p", { className: "text-xs text-gray-500", children: "This represents the weighted grade against the grade needed to pass this course." }), jsx(GradeBar, { currentPct: currentGradePct, passingPct: passingPct })] }), jsxs("div", { className: "flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-4 py-3", children: [jsx(TriangleAlert, { className: "mt-0.5 h-4 w-4 shrink-0 text-amber-600" }), jsxs("span", { className: "text-sm font-medium text-gray-800", children: ["A weighted grade of ", passingPct, "% is required to pass in this course"] })] }), jsxs("div", { className: "rounded-lg border p-4 space-y-3", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx("h4", { className: "text-sm font-semibold text-gray-900", children: "Grade summary" }), jsx("div", { className: "overflow-x-auto", children: jsxs("table", { className: "w-full border-collapse text-sm", children: [jsx("thead", { children: jsxs("tr", { className: "bg-amber-50 text-[11px] uppercase tracking-wide text-gray-600", children: [jsx("th", { className: "px-3 py-2 text-left font-medium", children: "Assignment type" }), jsx("th", { className: "px-3 py-2 text-right font-medium", children: "Weight" }), jsx("th", { className: "px-3 py-2 text-right font-medium", children: "Grade" }), jsx("th", { className: "px-3 py-2 text-right font-medium", children: "Weighted grade" })] }) }), jsxs("tbody", { children: [gradeSummary === null || gradeSummary === void 0 ? void 0 : gradeSummary.rows.map((row, index) => (jsxs("tr", { className: index % 2 === 0 ? '' : 'bg-gray-50', children: [jsxs("td", { className: "px-3 py-2 text-gray-800", children: [row.type, row.footnote ? (jsx("sup", { className: "ml-0.5 text-amber-500", children: row.footnote })) : null] }), jsxs("td", { className: "px-3 py-2 text-right text-gray-700", children: [row.weightPct, "%"] }), jsxs("td", { className: "px-3 py-2 text-right text-gray-700", children: [row.gradePct, "%"] }), jsxs("td", { className: "px-3 py-2 text-right font-semibold text-amber-600", children: [row.weightedGradePct, "%"] })] }, row.type))), jsxs("tr", { className: "border-l-2 border-amber-400 bg-amber-50", children: [jsx("td", { className: "px-3 py-2 font-medium text-gray-800", colSpan: 3, children: "Current weighted grade summary" }), jsxs("td", { className: "px-3 py-2 text-right font-bold text-amber-600", children: [currentGradePct, "%"] })] })] })] }) }), gradeSummary && gradeSummary.footnotes.length > 0 ? (jsx("div", { className: "space-y-1", children: gradeSummary.footnotes.map((note, index) => (jsxs("p", { className: "text-xs text-gray-500", children: [jsx("sup", { className: "text-amber-500", children: index + 1 }), " ", note] }, note))) })) : null] })] })) : null] }))] }) }));
147385
147773
  }
@@ -147580,10 +147968,10 @@ function GradebookCard({ row, icon: Icon, onClick, }) {
147580
147968
  }
147581
147969
  : undefined, "aria-label": clickable ? t('gradebookGradebookTab.viewProgressAriaLabel', { name: row.name }) : undefined, children: jsx(CardContent, { className: "p-4", children: jsxs("div", { className: "flex items-start justify-between gap-3", children: [jsxs("div", { className: "flex items-start gap-3 min-w-0", children: [jsx("div", { className: "flex-shrink-0 w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center", children: jsx(Icon, { className: "h-5 w-5 text-white", "aria-hidden": "true" }) }), jsxs("div", { className: "min-w-0", children: [jsx("h4", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100 truncate", children: row.name }), row.subtitle && (jsxs("div", { className: "flex items-center gap-1.5 mt-1 text-xs text-gray-400", children: [jsx(Calendar$1, { className: "h-3 w-3" }), row.subtitle] })), row.id && (jsxs("div", { className: "flex items-center gap-1 mt-1 text-xs text-gray-400", children: [jsxs("span", { className: "flex-shrink-0", children: [t('gradebookGradebookTab.idLabel'), ":"] }), jsx("span", { onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), className: "min-w-0 truncate font-mono select-all cursor-text", title: row.id, children: row.id })] }))] })] }), row.badgeLabel && (jsx(Badge, { className: cn('flex-shrink-0', BADGE_TONE[(_a = row.badgeTone) !== null && _a !== void 0 ? _a : 'neutral']), children: row.badgeLabel }))] }) }) }));
147582
147970
  }
147583
- function GradebookList({ org, username, types }) {
147971
+ function GradebookList({ org, username, types, initialType }) {
147584
147972
  var _a, _b, _c;
147585
147973
  const t = useT();
147586
- const [type, setType] = useState(types[0]);
147974
+ const [type, setType] = useState(initialType && types.includes(initialType) ? initialType : types[0]);
147587
147975
  const [searchQuery, setSearchQuery] = useState('');
147588
147976
  const [page, setPage] = useState(1);
147589
147977
  const [selected, setSelected] = useState(null);
@@ -147603,8 +147991,8 @@ function GradebookList({ org, username, types }) {
147603
147991
  setSelected(null);
147604
147992
  }, username: username, email: selected === null || selected === void 0 ? void 0 : selected.email, contentId: (_b = selected === null || selected === void 0 ? void 0 : selected.contentId) !== null && _b !== void 0 ? _b : '', contentName: selected === null || selected === void 0 ? void 0 : selected.contentName, metric: (_c = selected === null || selected === void 0 ? void 0 : selected.metric) !== null && _c !== void 0 ? _c : 'course', tenantKey: org })] }));
147605
147993
  }
147606
- function GradebookTab({ org, username }) {
147607
- return jsx(GradebookList, { org: org, username: username, types: GRADEBOOK_TYPES });
147994
+ function GradebookTab({ org, username, initialType }) {
147995
+ return (jsx(GradebookList, { org: org, username: username, types: GRADEBOOK_TYPES, initialType: initialType }));
147608
147996
  }
147609
147997
  const CREDENTIALS_TYPES = ['credentials'];
147610
147998
  const SKILLS_TYPES = ['skills'];
@@ -240348,7 +240736,7 @@ function sharePercent(value, total) {
240348
240736
  }
240349
240737
 
240350
240738
  /** Single series, so the palette's lead hue; it clears 3:1 on white. */
240351
- const BAR_COLOR = CHART_SERIES_COLORS[0];
240739
+ const BAR_COLOR$1 = CHART_SERIES_COLORS[0];
240352
240740
  const PLOT_HEIGHT = 176;
240353
240741
  const MAX_X_LABELS = 5;
240354
240742
  /**
@@ -240397,7 +240785,7 @@ function SpendChart({ points, granularity, }) {
240397
240785
  // The whole column slot is the hover target, not just the bar.
240398
240786
  className: "flex h-full min-w-0 flex-1 items-end justify-center", onMouseEnter: () => setActive(index), children: jsx("div", { className: "w-full max-w-[24px] rounded-t-[4px] transition-opacity", style: {
240399
240787
  height: point.totalCost > 0 ? `max(${height}%, 2px)` : 0,
240400
- background: BAR_COLOR,
240788
+ background: BAR_COLOR$1,
240401
240789
  opacity: active === null || isActive ? 1 : 0.45,
240402
240790
  } }) }, point.date));
240403
240791
  }) })] }), jsx("div", { className: "relative mt-2 h-4 text-[11px] text-gray-500 dark:text-gray-400", "aria-hidden": "true", children: points.map((point, index) => labelIndexes.has(index) ? (jsx("span", { className: "absolute whitespace-nowrap", style: index === 0
@@ -240410,6 +240798,20 @@ function SpendChart({ points, granularity, }) {
240410
240798
  }, children: formatBucket(point.date, granularity) }, point.date)) : null) })] })] }), jsxs("table", { className: "sr-only", children: [jsx("caption", { children: t('profileLlmUsage.chartTableCaption') }), jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: t('profileLlmUsage.colPeriod') }), jsx("th", { scope: "col", children: t('profileLlmUsage.colCost') })] }) }), jsx("tbody", { children: points.map((point) => (jsxs("tr", { children: [jsx("td", { children: formatBucket(point.date, granularity) }), jsx("td", { children: formatCost$1(point.totalCost) })] }, point.date))) })] })] }));
240411
240799
  }
240412
240800
 
240801
+ /**
240802
+ * Cost share per row as a labelled bar list — the Usage tab's "By model" and
240803
+ * "By service" cards, also reused by the profile Overview.
240804
+ */
240805
+ function RankedBars$1({ rows, total, colorFor, }) {
240806
+ return (jsx("ul", { className: "flex flex-col gap-3", children: rows.map((row) => {
240807
+ const share = sharePercent(row.totalCost, total);
240808
+ return (jsxs("li", { className: "flex flex-col gap-1.5", children: [jsxs("div", { className: "flex items-baseline justify-between gap-3 text-[13px]", children: [jsxs("span", { className: "flex min-w-0 items-center gap-2 font-medium text-gray-900 dark:text-gray-100", children: [jsx("span", { className: "h-2 w-2 flex-shrink-0 rounded-[2px]", style: { background: colorFor(row) }, "aria-hidden": "true" }), jsx("span", { className: "truncate", title: row.label, children: row.label })] }), jsxs("span", { className: "whitespace-nowrap tabular-nums text-gray-700 dark:text-gray-300", children: [formatCost$1(row.totalCost), jsxs("span", { className: "text-gray-500 dark:text-gray-400", children: [" \u00B7 ", share, "%"] })] })] }), jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800", "aria-hidden": "true", children: jsx("div", { className: "h-full rounded-full", style: { width: `${Math.min(100, share)}%`, background: colorFor(row) } }) })] }, row.key));
240809
+ }) }));
240810
+ }
240811
+ function BreakdownSkeleton() {
240812
+ return (jsx("div", { className: "flex flex-col gap-4", children: [0, 1, 2, 3].map((i) => (jsxs("div", { className: "flex flex-col gap-2", children: [jsx(Skeleton, { className: "h-4 w-3/4" }), jsx(Skeleton, { className: "h-1.5 w-full" })] }, i))) }));
240813
+ }
240814
+
240413
240815
  const RANGE_LABEL_KEYS = {
240414
240816
  today: 'rangeToday',
240415
240817
  '7d': 'range7d',
@@ -240429,11 +240831,11 @@ const CHART_SUBTITLE_KEYS = {
240429
240831
  week: 'chartSubtitleWeek',
240430
240832
  month: 'chartSubtitleMonth',
240431
240833
  };
240432
- const BREAKDOWN_ROWS = 5;
240834
+ const BREAKDOWN_ROWS$1 = 5;
240433
240835
  const MODEL_BAR_COLOR = CHART_SERIES_COLORS[0];
240434
- const CARD = 'rounded-xl border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-950';
240836
+ const CARD$1 = 'rounded-xl border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-950';
240435
240837
  function Card({ title, subtitle, aside, children, className, bodyClassName, }) {
240436
- return (jsxs("section", { className: cn(CARD, className), "aria-label": title, children: [jsxs("div", { className: "flex items-start justify-between gap-4 px-5 pt-5", children: [jsxs("div", { className: "min-w-0", children: [jsx("h4", { className: "text-[15px] font-semibold text-gray-900 dark:text-gray-100", children: title }), subtitle && (jsx("p", { className: "mt-0.5 text-[13px] text-gray-500 dark:text-gray-400", children: subtitle }))] }), aside] }), jsx("div", { className: cn('px-5 pb-5 pt-4', bodyClassName), children: children })] }));
240838
+ return (jsxs("section", { className: cn(CARD$1, className), "aria-label": title, children: [jsxs("div", { className: "flex items-start justify-between gap-4 px-5 pt-5", children: [jsxs("div", { className: "min-w-0", children: [jsx("h4", { className: "text-[15px] font-semibold text-gray-900 dark:text-gray-100", children: title }), subtitle && (jsx("p", { className: "mt-0.5 text-[13px] text-gray-500 dark:text-gray-400", children: subtitle }))] }), aside] }), jsx("div", { className: cn('px-5 pb-5 pt-4', bodyClassName), children: children })] }));
240437
240839
  }
240438
240840
  function RangeControl({ value, onChange, }) {
240439
240841
  const t = useT();
@@ -240459,23 +240861,14 @@ function RangeControl({ value, onChange, }) {
240459
240861
  : 'font-medium text-gray-600 hover:text-gray-900 dark:text-gray-300'), children: t(`profileLlmUsage.${RANGE_LABEL_KEYS[range]}`) }, range));
240460
240862
  }) }));
240461
240863
  }
240462
- function StatTile({ label, value, sub, loading, }) {
240463
- return (jsxs("div", { className: cn(CARD, 'flex flex-col gap-2 p-4'), children: [jsx("p", { className: "text-[13px] font-medium text-gray-500 dark:text-gray-400", children: label }), loading ? (jsxs(Fragment$1, { children: [jsx(Skeleton, { className: "h-7 w-24" }), jsx(Skeleton, { className: "h-4 w-20" })] })) : (jsxs(Fragment$1, { children: [jsx("p", { className: "text-[26px] font-semibold leading-tight tracking-tight text-gray-900 dark:text-gray-100", children: value }), jsx("p", { className: "min-h-[1rem] text-xs text-gray-500 tabular-nums dark:text-gray-400", children: sub })] }))] }));
240864
+ function StatTile$1({ label, value, sub, loading, }) {
240865
+ return (jsxs("div", { className: cn(CARD$1, 'flex flex-col gap-2 p-4'), children: [jsx("p", { className: "text-[13px] font-medium text-gray-500 dark:text-gray-400", children: label }), loading ? (jsxs(Fragment$1, { children: [jsx(Skeleton, { className: "h-7 w-24" }), jsx(Skeleton, { className: "h-4 w-20" })] })) : (jsxs(Fragment$1, { children: [jsx("p", { className: "text-[26px] font-semibold leading-tight tracking-tight text-gray-900 dark:text-gray-100", children: value }), jsx("p", { className: "min-h-[1rem] text-xs text-gray-500 tabular-nums dark:text-gray-400", children: sub })] }))] }));
240464
240866
  }
240465
240867
  function StateMessage({ icon, tone = 'neutral', title, body, action, }) {
240466
- return (jsxs("div", { className: cn(CARD, 'flex flex-col items-center gap-3 px-6 py-14 text-center'), role: tone === 'error' ? 'alert' : undefined, children: [jsx("div", { className: cn('flex h-12 w-12 items-center justify-center rounded-xl', tone === 'error'
240868
+ return (jsxs("div", { className: cn(CARD$1, 'flex flex-col items-center gap-3 px-6 py-14 text-center'), role: tone === 'error' ? 'alert' : undefined, children: [jsx("div", { className: cn('flex h-12 w-12 items-center justify-center rounded-xl', tone === 'error'
240467
240869
  ? 'bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-300'
240468
240870
  : 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400'), "aria-hidden": "true", children: icon }), jsx("h4", { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: title }), jsx("p", { className: "max-w-sm text-sm leading-relaxed text-gray-500 dark:text-gray-400", children: body }), action] }));
240469
240871
  }
240470
- function RankedBars$1({ rows, total, colorFor, }) {
240471
- return (jsx("ul", { className: "flex flex-col gap-3", children: rows.map((row) => {
240472
- const share = sharePercent(row.totalCost, total);
240473
- return (jsxs("li", { className: "flex flex-col gap-1.5", children: [jsxs("div", { className: "flex items-baseline justify-between gap-3 text-[13px]", children: [jsxs("span", { className: "flex min-w-0 items-center gap-2 font-medium text-gray-900 dark:text-gray-100", children: [jsx("span", { className: "h-2 w-2 flex-shrink-0 rounded-[2px]", style: { background: colorFor(row) }, "aria-hidden": "true" }), jsx("span", { className: "truncate", title: row.label, children: row.label })] }), jsxs("span", { className: "whitespace-nowrap tabular-nums text-gray-700 dark:text-gray-300", children: [formatCost$1(row.totalCost), jsxs("span", { className: "text-gray-500 dark:text-gray-400", children: [" \u00B7 ", share, "%"] })] })] }), jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800", "aria-hidden": "true", children: jsx("div", { className: "h-full rounded-full", style: { width: `${Math.min(100, share)}%`, background: colorFor(row) } }) })] }, row.key));
240474
- }) }));
240475
- }
240476
- function BreakdownSkeleton() {
240477
- return (jsx("div", { className: "flex flex-col gap-4", children: [0, 1, 2, 3].map((i) => (jsxs("div", { className: "flex flex-col gap-2", children: [jsx(Skeleton, { className: "h-4 w-3/4" }), jsx(Skeleton, { className: "h-1.5 w-full" })] }, i))) }));
240478
- }
240479
240872
  function SectionError() {
240480
240873
  const t = useT();
240481
240874
  return (jsxs("p", { className: "flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400", children: [jsx(CircleAlert, { className: "h-4 w-4 text-red-600", "aria-hidden": "true" }), t('profileLlmUsage.sectionError')] }));
@@ -240522,7 +240915,6 @@ function LlmUsageTab({ org, username, isOwnProfile = true }) {
240522
240915
  const summary = useUserLlmUsageSummary(scope);
240523
240916
  const spend = useUserLlmSpendOverTime({ ...scope, granularity });
240524
240917
  const byModel = useUserLlmCostByModel({ ...scope, limit: 20 });
240525
- const byService = useUserLlmCostByService(scope);
240526
240918
  const activity = useUserLlmRecentActivity({
240527
240919
  ...scope,
240528
240920
  page,
@@ -240538,7 +240930,6 @@ function LlmUsageTab({ org, username, isOwnProfile = true }) {
240538
240930
  summary.refetch();
240539
240931
  spend.refetch();
240540
240932
  byModel.refetch();
240541
- byService.refetch();
240542
240933
  activity.refetch();
240543
240934
  if (openTraceId)
240544
240935
  steps.refetch();
@@ -240549,15 +240940,8 @@ function LlmUsageTab({ org, username, isOwnProfile = true }) {
240549
240940
  label: row.model || t('profileLlmUsage.unknownModel'),
240550
240941
  totalCost: row.totalCost,
240551
240942
  count: row.count,
240552
- })), BREAKDOWN_ROWS, t('profileLlmUsage.otherRow')), [byModel.models, t]);
240553
- const serviceRows = useMemo(() => foldTail(byService.services.map((row, index) => ({
240554
- key: row.service || `unknown-${index}`,
240555
- label: row.service || t('profileLlmUsage.unknownService'),
240556
- totalCost: row.totalCost,
240557
- count: row.count,
240558
- })), BREAKDOWN_ROWS, t('profileLlmUsage.otherRow')), [byService.services, t]);
240943
+ })), BREAKDOWN_ROWS$1, t('profileLlmUsage.otherRow')), [byModel.models, t]);
240559
240944
  const modelTotal = modelRows.reduce((sum, row) => sum + row.totalCost, 0);
240560
- const serviceTotal = serviceRows.reduce((sum, row) => sum + row.totalCost, 0);
240561
240945
  const totals = summary.summary;
240562
240946
  const periodLabel = t(`profileLlmUsage.${PERIOD_LABEL_KEYS[range]}`);
240563
240947
  const next = widerRange(range);
@@ -240602,15 +240986,13 @@ function LlmUsageTab({ org, username, isOwnProfile = true }) {
240602
240986
  }
240603
240987
  else {
240604
240988
  const loadingTotals = summary.isLoading || summary.isIdle;
240605
- body = (jsxs(Fragment$1, { children: [jsxs("div", { className: "grid grid-cols-2 gap-3 xl:grid-cols-4", children: [jsx(StatTile, { label: t('profileLlmUsage.kpiSpend'), value: formatCost$1(totals === null || totals === void 0 ? void 0 : totals.totalCost), sub: periodLabel, loading: loadingTotals }), jsx(StatTile, { label: t('profileLlmUsage.kpiTokens'), value: formatCompact(totals === null || totals === void 0 ? void 0 : totals.totalTokens), sub: totals && totals.count > 0
240989
+ body = (jsxs(Fragment$1, { children: [jsxs("div", { className: "grid grid-cols-2 gap-3 xl:grid-cols-4", children: [jsx(StatTile$1, { label: t('profileLlmUsage.kpiSpend'), value: formatCost$1(totals === null || totals === void 0 ? void 0 : totals.totalCost), sub: periodLabel, loading: loadingTotals }), jsx(StatTile$1, { label: t('profileLlmUsage.kpiTokens'), value: formatCompact(totals === null || totals === void 0 ? void 0 : totals.totalTokens), sub: totals && totals.count > 0
240606
240990
  ? t('profileLlmUsage.kpiTokensSub', {
240607
240991
  value: formatCompact(totals.totalTokens / totals.count),
240608
240992
  })
240609
- : undefined, loading: loadingTotals }), jsx(StatTile, { label: t('profileLlmUsage.kpiRequests'), value: formatInteger(totals === null || totals === void 0 ? void 0 : totals.count), sub: t('profileLlmUsage.kpiRequestsSub'), loading: loadingTotals }), jsx(StatTile, { label: t('profileLlmUsage.kpiAvgCost'), value: totals && totals.count > 0
240993
+ : undefined, loading: loadingTotals }), jsx(StatTile$1, { label: t('profileLlmUsage.kpiRequests'), value: formatInteger(totals === null || totals === void 0 ? void 0 : totals.count), sub: t('profileLlmUsage.kpiRequestsSub'), loading: loadingTotals }), jsx(StatTile$1, { label: t('profileLlmUsage.kpiAvgCost'), value: totals && totals.count > 0
240610
240994
  ? formatCost$1(totals.totalCost / totals.count, { precise: true })
240611
- : '—', sub: t('profileLlmUsage.kpiAvgCostSub'), loading: loadingTotals })] }), jsx(Card, { title: t('profileLlmUsage.chartTitle'), subtitle: t(`profileLlmUsage.${CHART_SUBTITLE_KEYS[granularity]}`), aside: totals && (jsx("span", { className: "text-[15px] font-semibold tabular-nums text-gray-900 dark:text-gray-100", children: formatCost$1(totals.totalCost) })), bodyClassName: "pt-2", children: spend.isLoading || spend.isIdle ? (jsx(Skeleton, { className: "h-[220px] w-full" })) : spend.error ? (jsx(SectionError, {})) : series.length === 0 ? (jsx("p", { className: "py-10 text-center text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.chartNoData') })) : (jsx(SpendChart, { points: series, granularity: granularity })) }), jsxs("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-2", children: [jsx(Card, { title: t('profileLlmUsage.byModelTitle'), subtitle: t('profileLlmUsage.byModelSubtitle'), children: byModel.isLoading || byModel.isIdle ? (jsx(BreakdownSkeleton, {})) : byModel.error ? (jsx(SectionError, {})) : modelRows.length === 0 ? (jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.breakdownEmpty') })) : (jsx(RankedBars$1, { rows: modelRows, total: modelTotal, colorFor: () => MODEL_BAR_COLOR })) }), jsx(Card, { title: t('profileLlmUsage.byServiceTitle'), subtitle: t('profileLlmUsage.byServiceSubtitle'), children: byService.isLoading || byService.isIdle ? (jsx(BreakdownSkeleton, {})) : byService.error ? (jsx(SectionError, {})) : serviceRows.length === 0 ? (jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.breakdownEmpty') })) : (jsx(RankedBars$1, { rows: serviceRows, total: serviceTotal,
240612
- // Colour follows the service, so "chat" is the same hue everywhere.
240613
- colorFor: (row) => (row.isOther ? '#9ca3af' : colorForSeries(row.key)) })) })] }), jsxs("section", { className: cn(CARD, 'overflow-hidden'), "aria-labelledby": "llm-activity-heading", children: [jsxs("div", { className: "border-b border-gray-200 px-5 py-4 dark:border-gray-800", children: [jsx("h4", { id: "llm-activity-heading", className: "text-[15px] font-semibold text-gray-900 dark:text-gray-100", children: t('profileLlmUsage.activityTitle') }), jsx("p", { className: "mt-0.5 text-[13px] text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.activitySubtitle') })] }), activity.isLoading || activity.isIdle ? (jsx("div", { className: "flex flex-col gap-3 p-5", children: [0, 1, 2, 3].map((i) => (jsx(Skeleton, { className: "h-8 w-full" }, i))) })) : activity.error ? (jsx("div", { className: "p-5", children: jsx(SectionError, {}) })) : activity.isEmpty || activity.rows.length === 0 ? (jsx("p", { className: "p-5 text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.activityEmpty') })) : (jsxs(Fragment$1, { children: [jsx("div", { className: "overflow-x-auto", children: jsxs("table", { className: "w-full text-[13px]", children: [jsx("thead", { children: jsxs("tr", { className: "bg-gray-50 text-left text-gray-500 dark:bg-gray-900 dark:text-gray-400", children: [jsx("th", { scope: "col", className: "px-5 py-2.5 font-medium", children: t('profileLlmUsage.colWhen') }), jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: t('profileLlmUsage.colService') }), jsx("th", { scope: "col", className: "hidden px-3 py-2.5 font-medium md:table-cell", children: t('profileLlmUsage.colSession') }), jsx("th", { scope: "col", className: "px-3 py-2.5 text-right font-medium", children: t('profileLlmUsage.colLatency') }), jsx("th", { scope: "col", className: "px-3 py-2.5 text-right font-medium", children: t('profileLlmUsage.colCost') }), jsx("th", { scope: "col", className: "w-12 py-2.5 pl-2 pr-5", children: jsx("span", { className: "sr-only", children: t('profileLlmUsage.colDetails') }) })] }) }), jsx("tbody", { children: activity.rows.map((trace) => {
240995
+ : '—', sub: t('profileLlmUsage.kpiAvgCostSub'), loading: loadingTotals })] }), jsx(Card, { title: t('profileLlmUsage.chartTitle'), subtitle: t(`profileLlmUsage.${CHART_SUBTITLE_KEYS[granularity]}`), aside: totals && (jsx("span", { className: "text-[15px] font-semibold tabular-nums text-gray-900 dark:text-gray-100", children: formatCost$1(totals.totalCost) })), bodyClassName: "pt-2", children: spend.isLoading || spend.isIdle ? (jsx(Skeleton, { className: "h-[220px] w-full" })) : spend.error ? (jsx(SectionError, {})) : series.length === 0 ? (jsx("p", { className: "py-10 text-center text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.chartNoData') })) : (jsx(SpendChart, { points: series, granularity: granularity })) }), jsx(Card, { title: t('profileLlmUsage.byModelTitle'), subtitle: t('profileLlmUsage.byModelSubtitle'), children: byModel.isLoading || byModel.isIdle ? (jsx(BreakdownSkeleton, {})) : byModel.error ? (jsx(SectionError, {})) : modelRows.length === 0 ? (jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.breakdownEmpty') })) : (jsx(RankedBars$1, { rows: modelRows, total: modelTotal, colorFor: () => MODEL_BAR_COLOR })) }), jsxs("section", { className: cn(CARD$1, 'overflow-hidden'), "aria-labelledby": "llm-activity-heading", children: [jsxs("div", { className: "border-b border-gray-200 px-5 py-4 dark:border-gray-800", children: [jsx("h4", { id: "llm-activity-heading", className: "text-[15px] font-semibold text-gray-900 dark:text-gray-100", children: t('profileLlmUsage.activityTitle') }), jsx("p", { className: "mt-0.5 text-[13px] text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.activitySubtitle') })] }), activity.isLoading || activity.isIdle ? (jsx("div", { className: "flex flex-col gap-3 p-5", children: [0, 1, 2, 3].map((i) => (jsx(Skeleton, { className: "h-8 w-full" }, i))) })) : activity.error ? (jsx("div", { className: "p-5", children: jsx(SectionError, {}) })) : activity.isEmpty || activity.rows.length === 0 ? (jsx("p", { className: "p-5 text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.activityEmpty') })) : (jsxs(Fragment$1, { children: [jsx("div", { className: "overflow-x-auto", children: jsxs("table", { className: "w-full text-[13px]", children: [jsx("thead", { children: jsxs("tr", { className: "bg-gray-50 text-left text-gray-500 dark:bg-gray-900 dark:text-gray-400", children: [jsx("th", { scope: "col", className: "px-5 py-2.5 font-medium", children: t('profileLlmUsage.colWhen') }), jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: t('profileLlmUsage.colService') }), jsx("th", { scope: "col", className: "hidden px-3 py-2.5 font-medium md:table-cell", children: t('profileLlmUsage.colSession') }), jsx("th", { scope: "col", className: "px-3 py-2.5 text-right font-medium", children: t('profileLlmUsage.colLatency') }), jsx("th", { scope: "col", className: "px-3 py-2.5 text-right font-medium", children: t('profileLlmUsage.colCost') }), jsx("th", { scope: "col", className: "w-12 py-2.5 pl-2 pr-5", children: jsx("span", { className: "sr-only", children: t('profileLlmUsage.colDetails') }) })] }) }), jsx("tbody", { children: activity.rows.map((trace) => {
240614
240996
  const open = trace.id === openTraceId;
240615
240997
  const when = formatWhen(trace.timestamp);
240616
240998
  const service = trace.name || t('profileLlmUsage.unknownService');
@@ -240632,16 +241014,602 @@ function LlmUsageTab({ org, username, isOwnProfile = true }) {
240632
241014
  setPage((current) => current + 1);
240633
241015
  }, children: [t('profileLlmUsage.next'), jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" })] })] })] }))] }))] })] }));
240634
241016
  }
240635
- const isRefreshing = summary.isFetching ||
240636
- spend.isFetching ||
240637
- byModel.isFetching ||
240638
- byService.isFetching ||
240639
- activity.isFetching;
241017
+ const isRefreshing = summary.isFetching || spend.isFetching || byModel.isFetching || activity.isFetching;
240640
241018
  return (jsxs("div", { className: "flex flex-col gap-5", "data-testid": "llm-usage-tab", children: [jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [jsx(RangeControl, { value: range, onChange: changeRange }), jsxs("div", { className: "flex items-center gap-3", children: [jsxs("span", { className: "inline-flex items-center gap-1.5 text-[13px] text-gray-500 dark:text-gray-400", children: [jsx(Lock, { className: "h-3.5 w-3.5", "aria-hidden": "true" }), isOwnProfile
240641
241019
  ? t('profileLlmUsage.scopeSelf')
240642
241020
  : t('profileLlmUsage.scopeUser', { username })] }), jsx(Button$1, { variant: "outline", size: "icon", className: "h-9 w-9", onClick: refreshAll, disabled: isRefreshing, "aria-label": t('profileLlmUsage.refresh'), title: t('profileLlmUsage.refresh'), children: jsx(RefreshCw, { className: cn('h-4 w-4', isRefreshing && 'animate-spin'), "aria-hidden": "true" }) })] })] }), body] }));
240643
241021
  }
240644
241022
 
241023
+ /** How many of each list the overview shows before pointing at the full tab. */
241024
+ const OVERVIEW_COURSE_LIMIT = 5;
241025
+ const OVERVIEW_CONVERSATION_LIMIT = 5;
241026
+ const OVERVIEW_MEMORY_LIMIT = 3;
241027
+ /** A course's completion as a whole percent clamped to 0–100. */
241028
+ function courseProgressPercent(course) {
241029
+ var _a;
241030
+ const raw = (_a = course.completion) === null || _a === void 0 ? void 0 : _a.completion_percentage;
241031
+ if (raw === undefined || raw === null || !Number.isFinite(raw))
241032
+ return 0;
241033
+ return Math.min(100, Math.max(0, Math.round(raw)));
241034
+ }
241035
+ /**
241036
+ * Done with a course: every block complete, or the course passed on grade —
241037
+ * a learner can pass without opening every page, and that still counts.
241038
+ */
241039
+ function isCourseCompleted(course) {
241040
+ const completion = course.completion;
241041
+ if (!completion)
241042
+ return false;
241043
+ return completion.completed || completion.passed || courseProgressPercent(course) >= 100;
241044
+ }
241045
+ function summarizeLearning(courses) {
241046
+ let completed = 0;
241047
+ let inProgress = 0;
241048
+ let sum = 0;
241049
+ for (const course of courses) {
241050
+ const percent = courseProgressPercent(course);
241051
+ sum += percent;
241052
+ if (isCourseCompleted(course))
241053
+ completed += 1;
241054
+ else if (percent > 0)
241055
+ inProgress += 1;
241056
+ }
241057
+ const total = courses.length;
241058
+ return {
241059
+ total,
241060
+ completed,
241061
+ inProgress,
241062
+ notStarted: total - completed - inProgress,
241063
+ averageProgress: total ? Math.round(sum / total) : 0,
241064
+ };
241065
+ }
241066
+ const timeOf = (value) => {
241067
+ if (!value)
241068
+ return Number.NaN;
241069
+ return new Date(value).getTime();
241070
+ };
241071
+ /** Most recently enrolled first; courses without a usable date sink to the end. */
241072
+ function sortCoursesByRecency(courses) {
241073
+ return [...courses].sort((a, b) => {
241074
+ var _a, _b;
241075
+ const left = timeOf((_a = a.enrollment) === null || _a === void 0 ? void 0 : _a.created);
241076
+ const right = timeOf((_b = b.enrollment) === null || _b === void 0 ? void 0 : _b.created);
241077
+ if (Number.isNaN(left) && Number.isNaN(right))
241078
+ return 0;
241079
+ if (Number.isNaN(left))
241080
+ return 1;
241081
+ if (Number.isNaN(right))
241082
+ return -1;
241083
+ return right - left;
241084
+ });
241085
+ }
241086
+ /**
241087
+ * Furthest along first: completed courses, then in-progress ones by percent,
241088
+ * then those not started — most recent enrollment first within a tie.
241089
+ */
241090
+ function sortCoursesByProgress(courses) {
241091
+ const stage = (course) => isCourseCompleted(course) ? 2 : courseProgressPercent(course) > 0 ? 1 : 0;
241092
+ const byRecency = sortCoursesByRecency(courses);
241093
+ return byRecency.sort((a, b) => {
241094
+ const stageDiff = stage(b) - stage(a);
241095
+ if (stageDiff)
241096
+ return stageDiff;
241097
+ return courseProgressPercent(b) - courseProgressPercent(a);
241098
+ });
241099
+ }
241100
+ /** Seconds as `2h 15m`, `45m`, `<1m`; a missing value is a dash. */
241101
+ function formatDuration(seconds) {
241102
+ if (seconds === null || seconds === undefined || !Number.isFinite(seconds) || seconds < 0) {
241103
+ return '—';
241104
+ }
241105
+ if (seconds === 0)
241106
+ return '0m';
241107
+ if (seconds < 60)
241108
+ return '<1m';
241109
+ const minutes = Math.round(seconds / 60);
241110
+ if (minutes < 60)
241111
+ return `${minutes}m`;
241112
+ const hours = Math.floor(minutes / 60);
241113
+ const rest = minutes % 60;
241114
+ return rest ? `${hours}h ${rest}m` : `${hours}h`;
241115
+ }
241116
+ /** `3 days ago`; empty for a missing or unparseable timestamp. */
241117
+ function formatRelative(iso) {
241118
+ if (!iso)
241119
+ return '';
241120
+ const date = new Date(iso);
241121
+ if (Number.isNaN(date.getTime()))
241122
+ return '';
241123
+ return formatDistanceToNow(date, { addSuffix: true });
241124
+ }
241125
+ function formatShortDate(iso) {
241126
+ if (!iso)
241127
+ return '—';
241128
+ const date = new Date(iso);
241129
+ if (Number.isNaN(date.getTime()))
241130
+ return '—';
241131
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
241132
+ }
241133
+ /** Whole-percent share, guarding an empty denominator. */
241134
+ function percentOf(part, whole) {
241135
+ if (!whole || whole <= 0)
241136
+ return 0;
241137
+ return Math.round((part / whole) * 100);
241138
+ }
241139
+
241140
+ /** The AI figures on the overview are always the last 30 days. */
241141
+ const OVERVIEW_LLM_RANGE = '30d';
241142
+ /** Enough enrollments to count active ones without paging. */
241143
+ const OVERVIEW_ENROLLMENT_PAGE_SIZE = 50;
241144
+ /** Models fetched for the breakdown; the tab folds the tail into "Other". */
241145
+ const OVERVIEW_MODEL_LIMIT = 10;
241146
+ const statusOf$1 = (error) => error && typeof error === 'object' ? error.status : undefined;
241147
+ /**
241148
+ * Everything the Overview tab shows, read through the same endpoints the
241149
+ * individual tabs use so the two never disagree. Each section is requested
241150
+ * only when its tab is on this profile, and every request names the viewed
241151
+ * user, so an admin previewing someone else sees that person's activity.
241152
+ */
241153
+ function useOverviewData(org, username, sections) {
241154
+ const isPreview = useIsProfilePreview(username);
241155
+ const currentUsername = useCurrentUsername();
241156
+ const hasScope = !!org && !!username;
241157
+ // ── Learning ───────────────────────────────────────────────────────────
241158
+ const learningSkip = !sections.learning || !hasScope;
241159
+ const enrolledQ = useGetUserEnrolledCoursesQuery({
241160
+ username,
241161
+ query: { page: 1, page_size: OVERVIEW_ENROLLMENT_PAGE_SIZE, platform_key: org },
241162
+ }, { skip: learningSkip });
241163
+ const learnerQ = useGetLearnerDetailsQuery({ username, platform_key: org, metrics: 'courses,time_spent' }, { skip: learningSkip });
241164
+ const programsQ = useGetUserEnrolledProgramsQuery([{ username, platformKey: org }], { skip: learningSkip });
241165
+ const pathwaysQ = useGetUserCatalogPathwaysQuery({ username, platform_key: org }, { skip: learningSkip });
241166
+ // ── Records: credentials are course records, so they follow the learning cards
241167
+ const credentialsQ = useGetUsersAsAssertionsQuery({ platformKey: org, userId: username, page: 1, pageSize: 1 }, { skip: learningSkip });
241168
+ // ── Conversations ──────────────────────────────────────────────────────
241169
+ const historyQ = useGetUserChatHistoryQuery({ org, userId: username, params: { page: 1, page_size: OVERVIEW_CONVERSATION_LIMIT } }, { skip: !sections.chatHistory || !hasScope });
241170
+ // ── AI usage ───────────────────────────────────────────────────────────
241171
+ const scope = { platformKey: org, username, date_filter: OVERVIEW_LLM_RANGE };
241172
+ const summaryQ = useUserLlmUsageSummary(scope, { skip: !sections.llmUsage });
241173
+ const spendQ = useUserLlmSpendOverTime({ ...scope, granularity: 'day' }, { skip: !sections.llmUsage });
241174
+ const byModelQ = useUserLlmCostByModel({ ...scope, limit: OVERVIEW_MODEL_LIMIT }, { skip: !sections.llmUsage });
241175
+ // ── Memory ─────────────────────────────────────────────────────────────
241176
+ // Addressed the way the Memory tab does it: your own feed by your username;
241177
+ // someone else's with the caller in the path and the viewed user as a param.
241178
+ const memoryParams = { page: 1, page_size: OVERVIEW_MEMORY_LIMIT };
241179
+ const memoriesQ = useGetGlobalMemoriesQuery(isPreview
241180
+ ? { org, userId: currentUsername, params: { ...memoryParams, user_id: username } }
241181
+ : { org, userId: username, params: memoryParams }, { skip: !sections.memory || !hasScope || (isPreview && !currentUsername) });
241182
+ const memorySettingsQ = useGetUserMemorySettingsQuery({ org, userId: username }, { skip: !sections.memory || !hasScope });
241183
+ const learning = useMemo(() => {
241184
+ var _a, _b, _c, _d, _e, _f, _g, _h;
241185
+ const enrolled = (_b = (_a = enrolledQ.data) === null || _a === void 0 ? void 0 : _a.results) !== null && _b !== void 0 ? _b : [];
241186
+ const details = (_c = learnerQ.data) === null || _c === void 0 ? void 0 : _c.data;
241187
+ const courses = sortCoursesByProgress((_d = details === null || details === void 0 ? void 0 : details.courses) !== null && _d !== void 0 ? _d : []);
241188
+ const summary = learnerQ.isError || !details ? null : summarizeLearning(courses);
241189
+ const programs = programsQ.data;
241190
+ const pathways = pathwaysQ.data;
241191
+ return {
241192
+ enabled: sections.learning,
241193
+ isLoading: !learningSkip && (enrolledQ.isLoading || learnerQ.isLoading),
241194
+ isError: enrolledQ.isError,
241195
+ isProgressUnavailable: learnerQ.isError,
241196
+ enrolledCount: (_f = (_e = enrolledQ.data) === null || _e === void 0 ? void 0 : _e.count) !== null && _f !== void 0 ? _f : enrolled.length,
241197
+ enrolled,
241198
+ courses,
241199
+ summary,
241200
+ timeSpentSecs: (_h = (_g = details === null || details === void 0 ? void 0 : details.time_spent) === null || _g === void 0 ? void 0 : _g.total_time_spent_secs) !== null && _h !== void 0 ? _h : null,
241201
+ programsCount: programsQ.isError ? null : programs ? programs.length : null,
241202
+ pathwaysCount: pathwaysQ.isError ? null : pathways ? pathways.length : null,
241203
+ };
241204
+ }, [sections.learning, learningSkip, enrolledQ, learnerQ, programsQ, pathwaysQ]);
241205
+ const records = useMemo(() => {
241206
+ var _a, _b, _c;
241207
+ const assertions = credentialsQ.data;
241208
+ return {
241209
+ isLoading: !learningSkip && credentialsQ.isLoading,
241210
+ credentialsCount: credentialsQ.isError
241211
+ ? null
241212
+ : assertions
241213
+ ? ((_c = (_a = assertions.count) !== null && _a !== void 0 ? _a : (_b = assertions.data) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0)
241214
+ : null,
241215
+ };
241216
+ }, [learningSkip, credentialsQ]);
241217
+ const conversations = useMemo(() => {
241218
+ var _a, _b, _c, _d;
241219
+ return ({
241220
+ enabled: sections.chatHistory,
241221
+ isLoading: sections.chatHistory && historyQ.isLoading,
241222
+ isError: historyQ.isError,
241223
+ isForbidden: statusOf$1(historyQ.error) === 403,
241224
+ count: (_b = (_a = historyQ.data) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0,
241225
+ recent: (_d = (_c = historyQ.data) === null || _c === void 0 ? void 0 : _c.results) !== null && _d !== void 0 ? _d : [],
241226
+ });
241227
+ }, [sections.chatHistory, historyQ]);
241228
+ const usage = useMemo(() => ({
241229
+ enabled: sections.llmUsage,
241230
+ isLoading: summaryQ.isLoading || summaryQ.isIdle,
241231
+ error: summaryQ.error,
241232
+ isEmpty: summaryQ.isEmpty,
241233
+ summary: summaryQ.summary,
241234
+ points: spendQ.points,
241235
+ isSpendLoading: spendQ.isLoading || spendQ.isIdle,
241236
+ spendError: spendQ.error,
241237
+ models: byModelQ.models,
241238
+ isBreakdownLoading: byModelQ.isLoading || byModelQ.isIdle,
241239
+ breakdownError: byModelQ.error,
241240
+ }), [sections.llmUsage, summaryQ, spendQ, byModelQ]);
241241
+ const memory = useMemo(() => {
241242
+ var _a, _b, _c, _d, _e;
241243
+ return ({
241244
+ enabled: sections.memory,
241245
+ isLoading: sections.memory && memoriesQ.isLoading,
241246
+ isError: memoriesQ.isError,
241247
+ count: (_b = (_a = memoriesQ.data) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0,
241248
+ recent: (_d = (_c = memoriesQ.data) === null || _c === void 0 ? void 0 : _c.results) !== null && _d !== void 0 ? _d : [],
241249
+ settings: (_e = memorySettingsQ.data) !== null && _e !== void 0 ? _e : null,
241250
+ });
241251
+ }, [sections.memory, memoriesQ, memorySettingsQ]);
241252
+ const isRefreshing = enrolledQ.isFetching ||
241253
+ learnerQ.isFetching ||
241254
+ historyQ.isFetching ||
241255
+ summaryQ.isFetching ||
241256
+ spendQ.isFetching ||
241257
+ byModelQ.isFetching ||
241258
+ memoriesQ.isFetching;
241259
+ const refetch = () => {
241260
+ if (!learningSkip) {
241261
+ enrolledQ.refetch();
241262
+ learnerQ.refetch();
241263
+ }
241264
+ if (sections.chatHistory && hasScope)
241265
+ historyQ.refetch();
241266
+ if (sections.llmUsage) {
241267
+ summaryQ.refetch();
241268
+ spendQ.refetch();
241269
+ byModelQ.refetch();
241270
+ }
241271
+ if (sections.memory && hasScope)
241272
+ memoriesQ.refetch();
241273
+ };
241274
+ return { learning, records, conversations, usage, memory, isRefreshing, refetch };
241275
+ }
241276
+
241277
+ const CARD = 'rounded-xl border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-950';
241278
+ // One hue, light → dark, for the ordered completion states; bars are the
241279
+ // profile's single-series blue. The "not started" share is the ring's track.
241280
+ const COMPLETED_COLOR = CHART_ORDINAL_RAMP[2];
241281
+ const IN_PROGRESS_COLOR = CHART_ORDINAL_RAMP[0];
241282
+ const BAR_COLOR = CHART_SERIES_COLORS[0];
241283
+ const RING_SIZE = 120;
241284
+ const RING_STROKE = 12;
241285
+ /** Rows kept in the model breakdown before the tail folds into "Other". */
241286
+ const BREAKDOWN_ROWS = 3;
241287
+ // ---------------------------------------------------------------------------
241288
+ // Building blocks
241289
+ // ---------------------------------------------------------------------------
241290
+ function StatTile({ icon: Icon, label, value, sub, loading, }) {
241291
+ return (jsxs("div", { className: cn(CARD, 'flex flex-col gap-2 p-4'), children: [jsxs("p", { className: "flex items-center gap-1.5 text-[13px] font-medium text-gray-500 dark:text-gray-400", children: [jsx(Icon, { className: "h-4 w-4 flex-shrink-0 text-gray-400", "aria-hidden": "true" }), jsx("span", { className: "truncate", children: label })] }), loading ? (jsxs(Fragment$1, { children: [jsx(Skeleton, { className: "h-7 w-24" }), jsx(Skeleton, { className: "h-4 w-20" })] })) : (jsxs(Fragment$1, { children: [jsx("p", { className: "text-[26px] font-semibold leading-tight tracking-tight text-gray-900 tabular-nums dark:text-gray-100", children: value }), jsx("p", { className: "min-h-[1rem] truncate text-xs text-gray-500 tabular-nums dark:text-gray-400", children: sub })] }))] }));
241292
+ }
241293
+ function ViewLink({ label, onClick }) {
241294
+ if (!onClick)
241295
+ return null;
241296
+ return (jsxs(Button$1, { variant: "ghost", size: "sm", onClick: onClick, className: "h-8 gap-1 px-2 text-[13px] font-medium text-blue-600 hover:bg-blue-50 hover:text-blue-700 dark:text-blue-400 dark:hover:bg-blue-950", children: [label, jsx(ArrowRight, { className: "h-3.5 w-3.5", "aria-hidden": "true" })] }));
241297
+ }
241298
+ function SectionCard$1({ title, subtitle, aside, action, children, className, bodyClassName, testId, }) {
241299
+ const headingId = useId$2();
241300
+ return (jsxs("section", { className: cn(CARD, className), "aria-labelledby": headingId, "data-testid": testId, children: [jsxs("div", { className: "flex flex-wrap items-start justify-between gap-x-4 gap-y-2 px-5 pt-5", children: [jsxs("div", { className: "min-w-0", children: [jsx("h4", { id: headingId, className: "text-[15px] font-semibold text-gray-900 dark:text-gray-100", children: title }), subtitle && (jsx("p", { className: "mt-0.5 text-[13px] text-gray-500 dark:text-gray-400", children: subtitle }))] }), (aside || action) && (jsxs("div", { className: "flex items-center gap-3", children: [aside, action] }))] }), jsx("div", { className: cn('px-5 pb-5 pt-4', bodyClassName), children: children })] }));
241301
+ }
241302
+ /** A section's empty or failed state, sized to the card it sits in. */
241303
+ function SectionMessage({ icon: Icon, tone = 'neutral', children, }) {
241304
+ return (jsxs("p", { className: "flex items-center justify-center gap-2 py-8 text-center text-sm text-gray-500 dark:text-gray-400", role: tone === 'error' ? 'alert' : undefined, children: [jsx(Icon, { className: cn('h-4 w-4 flex-shrink-0', tone === 'error' ? 'text-red-600' : 'text-gray-400'), "aria-hidden": "true" }), children] }));
241305
+ }
241306
+ function RecordChip({ icon: Icon, label, onClick, }) {
241307
+ const className = cn('inline-flex h-9 items-center gap-2 rounded-lg border border-gray-200 bg-white px-3 text-[13px] font-medium text-gray-700', 'dark:border-gray-800 dark:bg-gray-950 dark:text-gray-300', onClick &&
241308
+ 'transition-colors hover:bg-gray-50 hover:text-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 dark:hover:bg-gray-900');
241309
+ const body = (jsxs(Fragment$1, { children: [jsx(Icon, { className: "h-4 w-4 flex-shrink-0 text-gray-400", "aria-hidden": "true" }), label, onClick && jsx(ArrowRight, { className: "h-3.5 w-3.5 text-gray-400", "aria-hidden": "true" })] }));
241310
+ return onClick ? (jsx("button", { type: "button", onClick: onClick, className: className, children: body })) : (jsx("span", { className: className, children: body }));
241311
+ }
241312
+ function ProgressBar({ value, label }) {
241313
+ return (jsx("span", { role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": value, className: "block h-1.5 w-full overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800", children: jsx("span", { className: "block h-full rounded-full", style: { width: `${value}%`, background: BAR_COLOR } }) }));
241314
+ }
241315
+ function StatusPill({ on }) {
241316
+ const t = useT();
241317
+ return (jsxs("span", { className: cn('inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[11px] font-semibold', on
241318
+ ? 'bg-green-50 text-green-700 dark:bg-green-950 dark:text-green-300'
241319
+ : 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-300'), children: [jsx("span", { className: cn('h-1.5 w-1.5 rounded-full', on ? 'bg-green-600' : 'bg-gray-400'), "aria-hidden": "true" }), on ? t('profileOverviewTab.stateOn') : t('profileOverviewTab.stateOff')] }));
241320
+ }
241321
+ /**
241322
+ * Completed / in progress / not started as a ring, with the counts beside it
241323
+ * so the shares are never read from colour alone.
241324
+ */
241325
+ function CompletionRing({ summary }) {
241326
+ const t = useT();
241327
+ const radius = (RING_SIZE - RING_STROKE) / 2;
241328
+ const circumference = 2 * Math.PI * radius;
241329
+ const share = (count) => (summary.total ? count / summary.total : 0);
241330
+ const completed = share(summary.completed);
241331
+ const inProgress = share(summary.inProgress);
241332
+ // A 2px breathing space between adjacent fills, only when there are two.
241333
+ const gap = [completed, inProgress, share(summary.notStarted)].filter((s) => s > 0).length > 1 ? 2 : 0;
241334
+ const arc = (fraction, offset, color) => (jsx("circle", { cx: RING_SIZE / 2, cy: RING_SIZE / 2, r: radius, fill: "none", stroke: color, strokeWidth: RING_STROKE, strokeDasharray: `${Math.max(0, fraction * circumference - gap)} ${circumference}`, strokeDashoffset: -(offset * circumference + gap / 2) }));
241335
+ const legend = [
241336
+ {
241337
+ key: 'completed',
241338
+ label: t('profileOverviewTab.legendCompleted'),
241339
+ count: summary.completed,
241340
+ swatch: COMPLETED_COLOR,
241341
+ },
241342
+ {
241343
+ key: 'inProgress',
241344
+ label: t('profileOverviewTab.legendInProgress'),
241345
+ count: summary.inProgress,
241346
+ swatch: IN_PROGRESS_COLOR,
241347
+ },
241348
+ {
241349
+ key: 'notStarted',
241350
+ label: t('profileOverviewTab.legendNotStarted'),
241351
+ count: summary.notStarted,
241352
+ swatch: '',
241353
+ },
241354
+ ];
241355
+ return (jsxs("div", { className: "flex items-center gap-5", "data-testid": "completion-ring", children: [jsxs("div", { className: "relative flex-shrink-0", style: { width: RING_SIZE, height: RING_SIZE }, children: [jsxs("svg", { width: RING_SIZE, height: RING_SIZE, viewBox: `0 0 ${RING_SIZE} ${RING_SIZE}`, role: "img", "aria-label": t('profileOverviewTab.ringAria', {
241356
+ completed: summary.completed,
241357
+ total: summary.total,
241358
+ }), className: "-rotate-90", children: [jsx("circle", { cx: RING_SIZE / 2, cy: RING_SIZE / 2, r: radius, fill: "none", strokeWidth: RING_STROKE, className: "stroke-gray-100 dark:stroke-gray-800" }), inProgress > 0 && arc(inProgress, completed, IN_PROGRESS_COLOR), completed > 0 && arc(completed, 0, COMPLETED_COLOR)] }), jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center", "aria-hidden": "true", children: [jsxs("span", { className: "text-xl font-semibold leading-none tabular-nums text-gray-900 dark:text-gray-100", children: [summary.completed, jsxs("span", { className: "text-sm font-medium text-gray-400", children: ["/", summary.total] })] }), jsx("span", { className: "mt-1 text-[11px] text-gray-500 dark:text-gray-400", children: t('profileOverviewTab.legendCompleted') })] })] }), jsx("ul", { className: "space-y-1.5 text-[13px]", children: legend.map((row) => (jsxs("li", { className: "flex items-center gap-2", children: [jsx("span", { className: cn('h-2.5 w-2.5 flex-shrink-0 rounded-[2px]', !row.swatch && 'bg-gray-200 dark:bg-gray-700'), style: row.swatch ? { background: row.swatch } : undefined, "aria-hidden": "true" }), jsx("span", { className: "text-gray-600 dark:text-gray-300", children: row.label }), jsx("span", { className: "ml-auto pl-3 font-semibold tabular-nums text-gray-900 dark:text-gray-100", children: row.count })] }, row.key))) })] }));
241359
+ }
241360
+ function CourseRow({ course, onOpen }) {
241361
+ var _a, _b, _c;
241362
+ const t = useT();
241363
+ const name = course.name || course.course_id;
241364
+ const percent = courseProgressPercent(course);
241365
+ const completed = isCourseCompleted(course);
241366
+ return (jsx("li", { children: jsxs("button", { type: "button", onClick: onOpen, "aria-label": t('profileOverviewTab.viewProgress', { name }), className: "flex w-full flex-col gap-2 rounded-lg px-3 py-2.5 text-left transition-colors hover:bg-gray-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 dark:hover:bg-gray-900", children: [jsxs("div", { className: "flex w-full items-center justify-between gap-3", children: [jsx("span", { className: "min-w-0 truncate text-sm font-medium text-gray-900 dark:text-gray-100", title: name, children: name }), completed ? (jsxs("span", { className: "inline-flex flex-shrink-0 items-center gap-1 rounded-md bg-blue-50 px-1.5 py-0.5 text-[11px] font-semibold text-blue-700 dark:bg-blue-950 dark:text-blue-300", children: [jsx(CircleCheck, { className: "h-3 w-3", "aria-hidden": "true" }), ((_a = course.completion) === null || _a === void 0 ? void 0 : _a.passed) && !((_b = course.completion) === null || _b === void 0 ? void 0 : _b.completed)
241367
+ ? t('profileOverviewTab.coursePassed')
241368
+ : t('profileOverviewTab.courseCompleted')] })) : (jsxs("span", { className: "flex-shrink-0 text-[13px] tabular-nums text-gray-700 dark:text-gray-300", children: [percent, "%"] }))] }), jsx(ProgressBar, { value: percent, label: t('profileOverviewTab.courseProgressAria', { name, percent }) }), jsxs("div", { className: "flex flex-wrap gap-x-3 gap-y-0.5 text-xs text-gray-500 dark:text-gray-400", children: [jsx("span", { children: t('profileOverviewTab.courseEnrolledOn', {
241369
+ date: formatShortDate((_c = course.enrollment) === null || _c === void 0 ? void 0 : _c.created),
241370
+ }) }), course.time_spent_secs > 0 && (jsx("span", { children: t('profileOverviewTab.courseTimeSpent', {
241371
+ duration: formatDuration(course.time_spent_secs),
241372
+ }) }))] })] }) }));
241373
+ }
241374
+ /** Enrollment-only row, for when per-course progress could not be read. */
241375
+ function EnrollmentRow({ course }) {
241376
+ const t = useT();
241377
+ const name = course.course_name || course.course_id;
241378
+ return (jsxs("li", { className: "flex items-center justify-between gap-3 px-3 py-2.5", children: [jsxs("div", { className: "min-w-0", children: [jsx("p", { className: "truncate text-sm font-medium text-gray-900 dark:text-gray-100", title: name, children: name }), jsx("p", { className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400", children: t('profileOverviewTab.courseEnrolledOn', { date: formatShortDate(course.created) }) })] }), jsx("span", { className: cn('flex-shrink-0 rounded-md px-1.5 py-0.5 text-[11px] font-semibold', course.active
241379
+ ? 'bg-blue-50 text-blue-700 dark:bg-blue-950 dark:text-blue-300'
241380
+ : 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-300'), children: course.active
241381
+ ? t('profileOverviewTab.enrollmentActive')
241382
+ : t('profileOverviewTab.enrollmentInactive') })] }));
241383
+ }
241384
+ function ConversationRow({ session }) {
241385
+ var _a;
241386
+ const t = useT();
241387
+ const title = conversationTitle(session, t('profileOverviewTab.conversation'));
241388
+ const agent = session.mentor_name || t('profileOverviewTab.agent');
241389
+ const turns = (_a = session.message_count_human) !== null && _a !== void 0 ? _a : 0;
241390
+ const labels = useMemo(() => ({
241391
+ positive: t('chatHistoryChatHistoryTab.positive'),
241392
+ neutral: t('chatHistoryChatHistoryTab.neutral'),
241393
+ negative: t('chatHistoryChatHistoryTab.negative'),
241394
+ userSentiment: t('chatHistoryChatHistoryTab.userSentiment'),
241395
+ }), [t]);
241396
+ return (jsxs("li", { className: "flex items-start gap-3 py-3 first:pt-0 last:pb-0", "data-testid": "overview-conversation", children: [jsx("span", { className: "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400", "aria-hidden": "true", children: jsx(Bot, { className: "h-4 w-4" }) }), jsxs("div", { className: "min-w-0 flex-1", children: [jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [jsx("span", { className: "min-w-0 truncate text-sm font-medium text-gray-900 dark:text-gray-100", title: title, children: title }), jsx("span", { className: "flex-shrink-0 text-xs text-gray-500 dark:text-gray-400", children: formatRelative(session.inserted_at) })] }), jsxs("p", { className: "mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400", children: [agent, turns > 0 && ` · ${t('profileOverviewTab.messageCount', { count: turns })}`] }), jsx(ConversationTopics, { topics: session.topics, className: "mt-1.5", leading: jsx(ConversationSentiment, { sentiment: session.sentiment, labels: labels, compact: true }) })] })] }));
241397
+ }
241398
+ function MemoryRow({ memory }) {
241399
+ const t = useT();
241400
+ return (jsxs("li", { className: "flex items-start gap-3 py-3 first:pt-0 last:pb-0", "data-testid": "overview-memory-row", children: [jsx("span", { className: "mt-0.5 flex-shrink-0", children: memory.is_auto_generated ? (jsx(Bot, { className: "h-4 w-4 text-blue-500", "aria-label": t('memoryMemoryTab.autoGeneratedMemoryAriaLabel') })) : (jsx(User, { className: "h-4 w-4 text-gray-400", "aria-label": t('memoryMemoryTab.manuallyAddedMemoryAriaLabel') })) }), jsxs("div", { className: "min-w-0 flex-1", children: [jsx("p", { className: "line-clamp-2 text-sm text-gray-800 dark:text-gray-200", children: memory.content }), jsxs("p", { className: "mt-1 text-xs text-gray-400", children: [formatShortDate(memory.created_at), memory.is_auto_generated && (jsx("span", { className: "ml-2 inline-flex items-center rounded-full bg-blue-50 px-1.5 py-0.5 text-[10px] font-medium text-blue-600", children: t('memoryMemoryTab.autoBadge') }))] })] })] }));
241401
+ }
241402
+ function MemorySettingsList({ settings }) {
241403
+ const t = useT();
241404
+ const rows = [
241405
+ {
241406
+ key: 'capture',
241407
+ label: t('profileOverviewTab.memoryAutoCapture'),
241408
+ on: settings.auto_capture_enabled,
241409
+ },
241410
+ {
241411
+ key: 'responses',
241412
+ label: t('profileOverviewTab.memoryUseInResponses'),
241413
+ on: settings.use_memory_in_responses,
241414
+ },
241415
+ ];
241416
+ return (jsx("ul", { className: "space-y-2", children: rows.map((row) => (jsxs("li", { className: "flex items-center justify-between gap-3 rounded-lg border border-gray-200 px-3 py-2 text-[13px] dark:border-gray-800", children: [jsx("span", { className: "text-gray-700 dark:text-gray-300", children: row.label }), jsx(StatusPill, { on: row.on })] }, row.key))) }));
241417
+ }
241418
+ function ListSkeleton({ rows = 3, height = 'h-12' }) {
241419
+ return (jsx("div", { className: "flex flex-col gap-3", children: Array.from({ length: rows }, (_, i) => (jsx(Skeleton, { className: cn('w-full', height) }, i))) }));
241420
+ }
241421
+ /**
241422
+ * The profile "Overview" tab: a one-screen digest of the user's activity —
241423
+ * course enrollments and progress, conversations with AI agents, AI spend and
241424
+ * what the AI remembers — each card summarising one of the fuller tabs and
241425
+ * linking to it.
241426
+ */
241427
+ function OverviewTab({ org, username, isOwnProfile = true, sections, onNavigate, availableTabs, }) {
241428
+ var _a, _b, _c, _d;
241429
+ const t = useT();
241430
+ const data = useOverviewData(org, username, sections);
241431
+ const { learning, records, conversations, usage, memory } = data;
241432
+ const [selectedCourse, setSelectedCourse] = useState(null);
241433
+ const open = (target) => onNavigate && (!availableTabs || availableTabs.includes(target.tab))
241434
+ ? () => onNavigate(target)
241435
+ : undefined;
241436
+ const unavailable = t('profileOverviewTab.unavailable');
241437
+ const series = useMemo(() => buildSpendSeries(usage.points, OVERVIEW_LLM_RANGE), [usage.points]);
241438
+ const toRanked = (rows, fallback) => foldTail(rows.map((row, index) => ({
241439
+ key: row.label || `unknown-${index}`,
241440
+ label: row.label || fallback,
241441
+ totalCost: row.totalCost,
241442
+ count: row.count,
241443
+ })), BREAKDOWN_ROWS, t('profileLlmUsage.otherRow'));
241444
+ const modelRows = useMemo(() => toRanked(usage.models.map((row) => ({ ...row, label: row.model })), t('profileLlmUsage.unknownModel')),
241445
+ // eslint-disable-next-line react-hooks/exhaustive-deps
241446
+ [usage.models, t]);
241447
+ const sumCost = (rows) => rows.reduce((sum, row) => sum + row.totalCost, 0);
241448
+ // ── Tiles ──────────────────────────────────────────────────────────────
241449
+ const tiles = [];
241450
+ if (learning.enabled) {
241451
+ const summary = learning.summary;
241452
+ tiles.push(jsx(StatTile, { icon: GraduationCap, label: t('profileOverviewTab.kpiEnrolled'), value: learning.isError ? '—' : formatInteger(learning.enrolledCount), sub: learning.isError
241453
+ ? unavailable
241454
+ : summary
241455
+ ? t('profileOverviewTab.kpiEnrolledSub', { count: summary.inProgress })
241456
+ : t('profileOverviewTab.kpiEnrolledSubAll'), loading: learning.isLoading }, "enrolled"), jsx(StatTile, { icon: CircleCheck, label: t('profileOverviewTab.kpiCompleted'), value: summary ? formatInteger(summary.completed) : '—', sub: summary
241457
+ ? t('profileOverviewTab.kpiCompletedSub', {
241458
+ percent: percentOf(summary.completed, summary.total),
241459
+ })
241460
+ : unavailable, loading: learning.isLoading }, "completed"), jsx(StatTile, { icon: TrendingUp, label: t('profileOverviewTab.kpiProgress'), value: summary ? `${summary.averageProgress}%` : '—', sub: summary ? t('profileOverviewTab.kpiProgressSub') : unavailable, loading: learning.isLoading }, "progress"), jsx(StatTile, { icon: Clock, label: t('profileOverviewTab.kpiTimeSpent'), value: learning.isProgressUnavailable ? '—' : formatDuration(learning.timeSpentSecs), sub: learning.isProgressUnavailable ? unavailable : t('profileOverviewTab.kpiTimeSpentSub'), loading: learning.isLoading }, "time"));
241461
+ }
241462
+ if (conversations.enabled) {
241463
+ const last = conversations.recent[0];
241464
+ tiles.push(jsx(StatTile, { icon: MessageSquare, label: t('profileOverviewTab.kpiConversations'), value: conversations.isError ? '—' : formatInteger(conversations.count), sub: conversations.isError
241465
+ ? unavailable
241466
+ : last
241467
+ ? t('profileOverviewTab.kpiConversationsLast', {
241468
+ when: formatRelative(last.inserted_at),
241469
+ })
241470
+ : t('profileOverviewTab.kpiConversationsSub'), loading: conversations.isLoading }, "conversations"));
241471
+ }
241472
+ if (usage.enabled) {
241473
+ const totals = usage.summary;
241474
+ const failed = !!usage.error;
241475
+ tiles.push(jsx(StatTile, { icon: Coins, label: t('profileOverviewTab.kpiSpend'), value: failed ? '—' : formatCost$1((_a = totals === null || totals === void 0 ? void 0 : totals.totalCost) !== null && _a !== void 0 ? _a : 0), sub: failed ? unavailable : t('profileOverviewTab.kpiSpendSub'), loading: usage.isLoading }, "spend"), jsx(StatTile, { icon: Zap, label: t('profileOverviewTab.kpiRequests'), value: failed ? '—' : formatInteger((_b = totals === null || totals === void 0 ? void 0 : totals.count) !== null && _b !== void 0 ? _b : 0), sub: failed
241476
+ ? unavailable
241477
+ : t('profileOverviewTab.kpiRequestsSub', {
241478
+ tokens: formatCompact((_c = totals === null || totals === void 0 ? void 0 : totals.totalTokens) !== null && _c !== void 0 ? _c : 0),
241479
+ }), loading: usage.isLoading }, "requests"));
241480
+ }
241481
+ if (memory.enabled) {
241482
+ tiles.push(jsx(StatTile, { icon: Archive, label: t('profileOverviewTab.kpiMemories'), value: memory.isError ? '—' : formatInteger(memory.count), sub: memory.isError
241483
+ ? unavailable
241484
+ : memory.settings
241485
+ ? memory.settings.auto_capture_enabled
241486
+ ? t('profileOverviewTab.kpiMemoriesSubOn')
241487
+ : t('profileOverviewTab.kpiMemoriesSubOff')
241488
+ : t('profileOverviewTab.kpiMemoriesSub'), loading: memory.isLoading }, "memories"));
241489
+ }
241490
+ // ── Records strip: course records, shown only where there is something ─
241491
+ const chips = [];
241492
+ if (learning.enabled && records.credentialsCount) {
241493
+ chips.push(jsx(RecordChip, { icon: Award, label: t('profileOverviewTab.recordsCredentials', { count: records.credentialsCount }), onClick: open({ tab: 'education', educationSubTab: 'credentials' }) }, "credentials"));
241494
+ }
241495
+ if (learning.enabled && learning.programsCount) {
241496
+ chips.push(jsx(RecordChip, { icon: Layers, label: t('profileOverviewTab.recordsPrograms', { count: learning.programsCount }), onClick: open({ tab: 'gradebook', gradebookType: 'programs' }) }, "programs"));
241497
+ }
241498
+ if (learning.enabled && learning.pathwaysCount) {
241499
+ chips.push(jsx(RecordChip, { icon: Route, label: t('profileOverviewTab.recordsPathways', { count: learning.pathwaysCount }), onClick: open({ tab: 'gradebook', gradebookType: 'pathways' }) }, "pathways"));
241500
+ }
241501
+ // ── Learning section ───────────────────────────────────────────────────
241502
+ let learningBody = null;
241503
+ if (learning.enabled) {
241504
+ const detailed = learning.courses;
241505
+ const shown = detailed.length ? detailed.slice(0, OVERVIEW_COURSE_LIMIT) : [];
241506
+ const fallback = detailed.length ? [] : learning.enrolled.slice(0, OVERVIEW_COURSE_LIMIT);
241507
+ const total = detailed.length ? detailed.length : learning.enrolledCount;
241508
+ const remaining = Math.max(0, total - (shown.length || fallback.length));
241509
+ if (learning.isLoading) {
241510
+ learningBody = (jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[auto_minmax(0,1fr)]", children: [jsx(Skeleton, { className: "h-[120px] w-[260px] rounded-full" }), jsx(ListSkeleton, { rows: 3, height: "h-14" })] }));
241511
+ }
241512
+ else if (learning.isError) {
241513
+ learningBody = (jsx(SectionMessage, { icon: CircleAlert, tone: "error", children: t('profileOverviewTab.learningError') }));
241514
+ }
241515
+ else if (!shown.length && !fallback.length) {
241516
+ learningBody = (jsx(SectionMessage, { icon: GraduationCap, children: t('profileOverviewTab.learningEmpty') }));
241517
+ }
241518
+ else {
241519
+ learningBody = (jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[auto_minmax(0,1fr)]", children: [learning.summary && jsx(CompletionRing, { summary: learning.summary }), jsxs("div", { className: "min-w-0", children: [learning.isProgressUnavailable && (jsxs("p", { className: "mb-2 flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400", children: [jsx(CircleAlert, { className: "h-3.5 w-3.5", "aria-hidden": "true" }), t('profileOverviewTab.learningProgressUnavailable')] })), jsxs("ul", { className: "-mx-3 divide-y divide-gray-100 dark:divide-gray-800", children: [shown.map((course) => (jsx(CourseRow, { course: course, onOpen: () => setSelectedCourse({ id: course.course_id, name: course.name }) }, course.course_id))), fallback.map((course) => (jsx(EnrollmentRow, { course: course }, course.course_id)))] }), remaining > 0 && (jsx("p", { className: "mt-3 text-xs text-gray-500 dark:text-gray-400", children: t('profileOverviewTab.moreCourses', { count: remaining }) }))] })] }));
241520
+ }
241521
+ }
241522
+ // ── AI usage section ───────────────────────────────────────────────────
241523
+ const usageErrorCopy = (error) => error.kind === 'forbidden' || error.kind === 'not_found'
241524
+ ? t('profileOverviewTab.usageForbidden')
241525
+ : t('profileOverviewTab.usageError');
241526
+ let usageBody = null;
241527
+ if (usage.enabled) {
241528
+ if (usage.isLoading) {
241529
+ usageBody = (jsxs("div", { className: "flex flex-1 flex-col gap-5", children: [jsx(Skeleton, { className: "h-[200px] w-full" }), jsx("div", { className: "mt-auto", children: jsx(BreakdownSkeleton, {}) })] }));
241530
+ }
241531
+ else if (usage.error) {
241532
+ usageBody = (jsx(SectionMessage, { icon: CircleAlert, tone: "error", children: usageErrorCopy(usage.error) }));
241533
+ }
241534
+ else if (usage.isEmpty) {
241535
+ usageBody = (jsx(SectionMessage, { icon: Inbox, children: t('profileOverviewTab.usageEmpty') }));
241536
+ }
241537
+ else {
241538
+ let plot;
241539
+ // A message (no spend, failed series) centres in the room the chart
241540
+ // would have taken; the chart itself keeps its natural height.
241541
+ let plotIsMessage = true;
241542
+ if (usage.isSpendLoading) {
241543
+ plot = jsx(Skeleton, { className: "h-[200px] w-full" });
241544
+ }
241545
+ else if (usage.spendError) {
241546
+ plot = (jsx(SectionMessage, { icon: CircleAlert, tone: "error", children: usageErrorCopy(usage.spendError) }));
241547
+ }
241548
+ else if (series.every((point) => point.totalCost === 0)) {
241549
+ // Requests happened but none were billed: a flat chart on a $1 axis
241550
+ // looks broken, so say it instead.
241551
+ plot = jsx(SectionMessage, { icon: Inbox, children: t('profileOverviewTab.usageNoSpend') });
241552
+ }
241553
+ else {
241554
+ plot = jsx(SpendChart, { points: series, granularity: "day" });
241555
+ plotIsMessage = false;
241556
+ }
241557
+ const breakdown = (title, rows, colorFor, testId) => (jsxs("div", { className: "min-w-0", "data-testid": testId, children: [jsx("h5", { className: "mb-3 text-[13px] font-semibold text-gray-700 dark:text-gray-300", children: title }), usage.isBreakdownLoading ? (jsx(BreakdownSkeleton, {})) : usage.breakdownError ? (jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.sectionError') })) : rows.length === 0 ? (jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t('profileLlmUsage.breakdownEmpty') })) : (jsx(RankedBars$1, { rows: rows, total: sumCost(rows), colorFor: colorFor }))] }));
241558
+ // The breakdowns sit at the foot of the card, so when the card
241559
+ // stretches to match its neighbour the space opens between the plot
241560
+ // and the breakdowns rather than piling up under them.
241561
+ usageBody = (jsxs("div", { className: "flex flex-1 flex-col gap-5", children: [jsx("div", { className: cn(plotIsMessage && 'flex flex-1 items-center justify-center'), children: plot }), jsx("div", { className: "mt-auto border-t border-gray-100 pt-4 dark:border-gray-800", children: breakdown(t('profileLlmUsage.byModelTitle'), modelRows, () => BAR_COLOR, 'overview-usage-by-model') })] }));
241562
+ }
241563
+ }
241564
+ // ── Conversations section ──────────────────────────────────────────────
241565
+ let conversationsBody = null;
241566
+ if (conversations.enabled) {
241567
+ if (conversations.isLoading) {
241568
+ conversationsBody = jsx(ListSkeleton, { rows: 3 });
241569
+ }
241570
+ else if (conversations.isError) {
241571
+ conversationsBody = (jsx(SectionMessage, { icon: CircleAlert, tone: "error", children: conversations.isForbidden
241572
+ ? t('profileOverviewTab.conversationsForbidden')
241573
+ : t('profileOverviewTab.conversationsError') }));
241574
+ }
241575
+ else if (conversations.recent.length === 0) {
241576
+ conversationsBody = (jsx(SectionMessage, { icon: MessageSquare, children: t('profileOverviewTab.conversationsEmpty') }));
241577
+ }
241578
+ else {
241579
+ conversationsBody = (jsx("ul", { className: "divide-y divide-gray-100 dark:divide-gray-800", children: conversations.recent.slice(0, OVERVIEW_CONVERSATION_LIMIT).map((session) => (jsx(ConversationRow, { session: session }, session.id))) }));
241580
+ }
241581
+ }
241582
+ // ── Memory section ─────────────────────────────────────────────────────
241583
+ let memoryBody = null;
241584
+ if (memory.enabled) {
241585
+ let list;
241586
+ if (memory.isLoading) {
241587
+ list = jsx(ListSkeleton, { rows: 3 });
241588
+ }
241589
+ else if (memory.isError) {
241590
+ list = (jsx(SectionMessage, { icon: CircleAlert, tone: "error", children: t('profileOverviewTab.memoryError') }));
241591
+ }
241592
+ else if (memory.recent.length === 0) {
241593
+ list = jsx(SectionMessage, { icon: Archive, children: t('profileOverviewTab.memoryEmpty') });
241594
+ }
241595
+ else {
241596
+ list = (jsx("ul", { className: "divide-y divide-gray-100 dark:divide-gray-800", children: memory.recent.slice(0, OVERVIEW_MEMORY_LIMIT).map((item) => (jsx(MemoryRow, { memory: item }, item.id))) }));
241597
+ }
241598
+ memoryBody = memory.settings ? (jsxs("div", { className: "grid grid-cols-1 gap-5 lg:grid-cols-[minmax(0,1fr)_260px]", children: [jsx("div", { className: "min-w-0", children: list }), jsx(MemorySettingsList, { settings: memory.settings })] })) : (list);
241599
+ }
241600
+ const twoUp = usage.enabled && conversations.enabled;
241601
+ return (jsxs("div", { className: "flex flex-col gap-5", "data-testid": "profile-overview-tab", children: [jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [jsx("p", { className: "text-[13px] text-gray-500 dark:text-gray-400", children: isOwnProfile
241602
+ ? t('profileOverviewTab.scopeSelf')
241603
+ : t('profileOverviewTab.scopeUser', { username }) }), jsx(Button$1, { variant: "outline", size: "icon", className: "h-9 w-9", onClick: data.refetch, disabled: data.isRefreshing, "aria-label": t('profileOverviewTab.refresh'), title: t('profileOverviewTab.refresh'), children: jsx(RefreshCw, { className: cn('h-4 w-4', data.isRefreshing && 'animate-spin'), "aria-hidden": "true" }) })] }), tiles.length > 0 && (jsx("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4", "data-testid": "overview-tiles", children: tiles })), ((learning.enabled && records.isLoading) || chips.length > 0) && (jsx("div", { role: "group", "aria-label": t('profileOverviewTab.recordsLabel'), className: "flex flex-wrap gap-2", "data-testid": "overview-records", children: records.isLoading ? (jsxs(Fragment$1, { children: [jsx(Skeleton, { className: "h-9 w-32 rounded-lg" }), jsx(Skeleton, { className: "h-9 w-32 rounded-lg" })] })) : (chips) })), learning.enabled && (jsx(SectionCard$1, { title: t('profileOverviewTab.learningTitle'), subtitle: t('profileOverviewTab.learningSubtitle'), action: jsx(ViewLink, { label: t('profileOverviewTab.viewGradebook'), onClick: open({ tab: 'gradebook', gradebookType: 'courses' }) }), testId: "overview-learning", children: learningBody })), (usage.enabled || conversations.enabled) && (jsxs("div", { className: cn('grid grid-cols-1 gap-5', twoUp && 'xl:grid-cols-2'), children: [usage.enabled && (jsx(SectionCard$1, { title: t('profileOverviewTab.usageTitle'), subtitle: t('profileOverviewTab.usageSubtitle'), aside: usage.summary && !usage.error && !usage.isLoading ? (jsx("span", { className: "text-[15px] font-semibold tabular-nums text-gray-900 dark:text-gray-100", children: formatCost$1(usage.summary.totalCost) })) : null, action: jsx(ViewLink, { label: t('profileOverviewTab.viewUsage'), onClick: open({ tab: 'llmUsage' }) }), className: "flex flex-col", bodyClassName: "flex flex-1 flex-col pt-2", testId: "overview-usage", children: usageBody })), conversations.enabled && (jsx(SectionCard$1, { title: t('profileOverviewTab.conversationsTitle'), subtitle: isOwnProfile
241604
+ ? t('profileOverviewTab.conversationsSubtitle')
241605
+ : t('profileOverviewTab.conversationsSubtitlePreview'), action: jsx(ViewLink, { label: t('profileOverviewTab.viewHistory'), onClick: open({ tab: 'chatHistory' }) }), testId: "overview-conversations", children: conversationsBody }))] })), memory.enabled && (jsx(SectionCard$1, { title: t('profileOverviewTab.memoryTitle'), subtitle: isOwnProfile
241606
+ ? t('profileOverviewTab.memorySubtitle')
241607
+ : t('profileOverviewTab.memorySubtitlePreview'), action: jsx(ViewLink, { label: t('profileOverviewTab.viewMemory'), onClick: open({ tab: 'memory' }) }), testId: "overview-memory", children: memoryBody })), jsx(EnrolledUserProgressModal, { open: !!selectedCourse, onOpenChange: (isOpen) => {
241608
+ if (!isOpen)
241609
+ setSelectedCourse(null);
241610
+ }, username: username, contentId: (_d = selectedCourse === null || selectedCourse === void 0 ? void 0 : selectedCourse.id) !== null && _d !== void 0 ? _d : '', contentName: selectedCourse === null || selectedCourse === void 0 ? void 0 : selectedCourse.name, metric: "course", tenantKey: org })] }));
241611
+ }
241612
+
240645
241613
  const tabId = (id, mobile) => (mobile ? `${id}-tab-mobile` : `${id}-tab`);
240646
241614
  /** Arrow/Home/End handling for the tab variant, with automatic activation. */
240647
241615
  function useTabKeyboard(items, onSelect, mobile) {
@@ -240749,6 +241717,7 @@ function setCoworkEnabled(enabled) {
240749
241717
  }
240750
241718
 
240751
241719
  const TAB_DESC_KEYS = {
241720
+ overview: 'descOverview',
240752
241721
  basic: 'descBasic',
240753
241722
  social: 'descSocial',
240754
241723
  education: 'descEducation',
@@ -240764,6 +241733,7 @@ const TAB_DESC_KEYS = {
240764
241733
  };
240765
241734
  // Neutral variants (no "your") shown when previewing another user's profile.
240766
241735
  const TAB_DESC_PREVIEW_KEYS = {
241736
+ overview: 'descOverviewPreview',
240767
241737
  basic: 'descBasicPreview',
240768
241738
  social: 'descSocialPreview',
240769
241739
  education: 'descEducationPreview',
@@ -240775,10 +241745,12 @@ const TAB_DESC_PREVIEW_KEYS = {
240775
241745
  chatHistory: 'descChatHistoryPreview',
240776
241746
  llmUsage: 'descLlmUsagePreview',
240777
241747
  };
241748
+ // Only these SPAs have courses, so only they get the Overview's learning cards.
241749
+ const COURSE_SPAS = ['lms', 'skills'];
240778
241750
  const LABEL_CLASS = 'text-sm font-medium text-gray-700 dark:text-gray-300';
240779
241751
  const FIELD_CLASS = 'h-10 w-full bg-white border-gray-300 text-sm text-gray-900 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-900 dark:border-gray-700 dark:text-gray-100';
240780
241752
  const PRIMARY_BUTTON_CLASS = 'bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-500 disabled:bg-blue-600/60';
240781
- function Profile({ tenant, username, tenants, onClose, customization = {}, isAdmin = false, targetTab = 'basic', onAccountDeleted, enableMemoryTab = false, showLlmUsageTab = true, localLLMProps, currentSPA = '', }) {
241753
+ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdmin = false, targetTab = 'basic', onAccountDeleted, enableMemoryTab = false, showLlmUsageTab = true, showOverviewTab = true, localLLMProps, currentSPA = '', }) {
240782
241754
  var _a, _b, _c, _d, _e, _f;
240783
241755
  const t = useT();
240784
241756
  const { data: memsearchStatus, isError: isMemsearchStatusError } = useGetMemsearchStatusQuery({ org: tenant, userId: username }, { skip: !enableMemoryTab });
@@ -240806,8 +241778,20 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
240806
241778
  const isLlmUsageVisible = showLlmUsageTab && !isPureWatcher(rbacPermissions, viewerTenant);
240807
241779
  // Add Advanced tab only when in Tauri app (Local Models is provided and available)
240808
241780
  const isAdvancedAvailable = (localLLMProps === null || localLLMProps === void 0 ? void 0 : localLLMProps.isAvailable) === true;
241781
+ const isCourseSpa = COURSE_SPAS.includes(currentSPA.toLowerCase());
240809
241782
  const TABS = [
240810
241783
  { id: 'basic', label: t('profileIndex.tabBasic'), icon: User, group: 'profile' },
241784
+ // The digest of every other tab, right after the landing tab.
241785
+ ...(showOverviewTab
241786
+ ? [
241787
+ {
241788
+ id: 'overview',
241789
+ label: t('profileIndex.tabOverview'),
241790
+ icon: LayoutDashboard,
241791
+ group: 'profile',
241792
+ },
241793
+ ]
241794
+ : []),
240811
241795
  { id: 'social', label: t('profileIndex.tabSocial'), icon: Globe, group: 'profile' },
240812
241796
  ...(isGradebookEnabled
240813
241797
  ? [
@@ -240919,6 +241903,9 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
240919
241903
  items: TABS.filter((tab) => tab.group === group),
240920
241904
  }));
240921
241905
  const [activeTab, setActiveTab] = useState(targetTab);
241906
+ // Content type the Gradebook opens on when the Overview sends the user
241907
+ // there; cleared again whenever a tab is picked from the navigation.
241908
+ const [gradebookType, setGradebookType] = useState();
240922
241909
  const [isHovering, setIsHovering] = useState(false);
240923
241910
  const fileInputRef = useRef(null);
240924
241911
  // Dialog states for education and experience
@@ -240926,6 +241913,20 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
240926
241913
  const [isExperienceDialogOpen, setIsExperienceDialogOpen] = useState(false);
240927
241914
  const [educationSubTab, setEducationSubTab] = useState('education');
240928
241915
  const [experienceSubTab, setExperienceSubTab] = useState('experience');
241916
+ const selectTab = (id) => {
241917
+ setGradebookType(undefined);
241918
+ setActiveTab(id);
241919
+ };
241920
+ // The Overview's links land on the exact sub-view: a Gradebook content
241921
+ // type or an Education sub-tab. A tab this profile lacks is ignored.
241922
+ const openFromOverview = (target) => {
241923
+ if (!TABS.some((tab) => tab.id === target.tab))
241924
+ return;
241925
+ if (target.educationSubTab)
241926
+ setEducationSubTab(target.educationSubTab);
241927
+ setGradebookType(target.gradebookType);
241928
+ setActiveTab(target.tab);
241929
+ };
240929
241930
  const { basicForm, socialForm, isUserMetadataLoading, userMetadata, handleProfileImageUpload, isUploadingProfileImage, userMetadataEdx, isUserMetadataEdxLoading, FACEBOOK_URL_PREFIX, X_URL_PREFIX, LINKEDIN_URL_PREFIX, handleSocialLinkChange, socialValidators, basicValidators, } = useProfile(username, { platformKey: tenant });
240930
241931
  useEffect(() => {
240931
241932
  const firstInput = document.getElementById('fullName');
@@ -241023,7 +242024,7 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
241023
242024
  return (jsxs(Fragment$1, { children: [jsxs("div", { className: "relative mb-0", children: [jsx("div", { className: "pointer-events-none absolute inset-y-0 left-2 flex items-center", "aria-hidden": "true", children: jsx("div", { className: cn('flex h-7 w-7 items-center justify-center rounded-md text-white', badge.className), children: jsx("span", { className: cn('font-bold', badge.textClassName), children: badge.text }) }) }), jsx(Input, { id: id, className: cn(FIELD_CLASS, 'pl-12'), placeholder: placeholder, value: field.state.value, onChange: (e) => handleSocialLinkChange(e.target.value, field.handleChange, prefix), disabled: socialForm.state.isSubmitting || isReadOnly })] }), jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: ((_a = field.state.meta.errors) === null || _a === void 0 ? void 0 : _a.length) ? 'alert' : undefined, "aria-live": "polite", children: field.state.meta.errors })] }));
241024
242025
  },
241025
242026
  })] }));
241026
- return (jsxs(SettingsShell, { sidebarHeader: sidebarHeader, sidebarNav: jsx(SettingsSidebarNav, { groups: navGroups, activeId: activeTab, onSelect: setActiveTab, variant: "tabs", ariaLabel: t('profileIndex.ariaProfileTabs') }), mobileHeader: mobileHeader, mobileNav: jsx(SettingsMobileNav, { groups: navGroups, activeId: activeTab, onSelect: setActiveTab, variant: "tabs", ariaLabel: t('profileIndex.ariaProfileTabsMobile') }),
242027
+ return (jsxs(SettingsShell, { sidebarHeader: sidebarHeader, sidebarNav: jsx(SettingsSidebarNav, { groups: navGroups, activeId: activeTab, onSelect: selectTab, variant: "tabs", ariaLabel: t('profileIndex.ariaProfileTabs') }), mobileHeader: mobileHeader, mobileNav: jsx(SettingsMobileNav, { groups: navGroups, activeId: activeTab, onSelect: selectTab, variant: "tabs", ariaLabel: t('profileIndex.ariaProfileTabsMobile') }),
241027
242028
  // Render the tab's label rather than the id — every label is already
241028
242029
  // cased correctly.
241029
242030
  title: (_f = (_e = TABS.find((tab) => tab.id === activeTab)) === null || _e === void 0 ? void 0 : _e.label) !== null && _f !== void 0 ? _f : activeTab, description: tabDescription(activeTab), panelProps: {
@@ -241035,7 +242036,15 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
241035
242036
  // The education tab will handle refetching
241036
242037
  } }), jsx(ExperienceDialog, { open: isExperienceDialogOpen, onOpenChange: setIsExperienceDialogOpen, experience: undefined, org: tenant, username: username, onComplete: () => {
241037
242038
  // The experience tab will handle refetching
241038
- } }), jsx(ToastProvider, {})] }), children: [activeTab === 'basic' && (jsxs("form", { onSubmit: (formEvent) => {
242039
+ } }), jsx(ToastProvider, {})] }), children: [showOverviewTab && activeTab === 'overview' && (jsx(OverviewTab, { org: tenant, username: username, isOwnProfile: !isReadOnly,
242040
+ // Each card mirrors a tab, so a card only appears where its tab does;
242041
+ // the learning cards also need an SPA that has courses at all.
242042
+ sections: {
242043
+ learning: isCourseSpa,
242044
+ chatHistory: isChatHistoryVisible,
242045
+ llmUsage: isLlmUsageVisible,
242046
+ memory: isMemoryEnabled,
242047
+ }, availableTabs: TABS.map((tab) => tab.id), onNavigate: openFromOverview })), activeTab === 'basic' && (jsxs("form", { onSubmit: (formEvent) => {
241039
242048
  formEvent.preventDefault();
241040
242049
  formEvent.stopPropagation();
241041
242050
  if (isReadOnly)
@@ -241102,7 +242111,9 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
241102
242111
  prefix: X_URL_PREFIX,
241103
242112
  badge: { className: 'bg-black', text: 'X', textClassName: 'text-sm' },
241104
242113
  validator: socialValidators.x,
241105
- })] })), activeTab === 'education' && (jsxs(Tabs, { value: educationSubTab, onValueChange: setEducationSubTab, className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs(TabsList, { children: [jsx(TabsTrigger, { value: "education", children: t('profileIndex.tabEducation') }), jsx(TabsTrigger, { value: "credentials", children: t('gradebookGradebookTab.typeCredentials') }), jsx(TabsTrigger, { value: "skills", children: t('gradebookGradebookTab.typeSkills') })] }), headerAddButton] }), jsx(TabsContent, { value: "education", children: jsx(EducationTab, { org: tenant, username: username }) }), jsx(TabsContent, { value: "credentials", children: jsx(CredentialsList, { org: tenant, username: username }) }), jsx(TabsContent, { value: "skills", children: jsx(SkillsList, { org: tenant, username: username }) })] })), activeTab === 'gradebook' && jsx(GradebookTab, { org: tenant, username: username }), activeTab === 'experience' && (jsxs(Tabs, { value: experienceSubTab, onValueChange: setExperienceSubTab, className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs(TabsList, { children: [jsx(TabsTrigger, { value: "experience", children: t('profileIndex.tabExperience') }), jsx(TabsTrigger, { value: "resume", children: t('profileIndex.tabResume') })] }), headerAddButton] }), jsx(TabsContent, { value: "experience", children: jsx(ExperienceTab, { org: tenant, username: username }) }), jsx(TabsContent, { value: "resume", children: jsx(ResumeTab, { org: tenant, username: username }) })] })), activeTab === 'purchases' && jsx(PurchasesTab, { org: tenant, username: username }), activeTab === 'memory' && jsx(MemoryTab, { org: tenant, username: username }), activeTab === 'privacy' && jsx(ChatPrivacyTab, { org: tenant, username: username }), isChatHistoryVisible && activeTab === 'chatHistory' && (jsx(ChatHistoryTab, { org: tenant, username: username })), isLlmUsageVisible && activeTab === 'llmUsage' && (jsx(LlmUsageTab, { org: tenant, username: username, isOwnProfile: !isReadOnly })), !isReadOnly && activeTab === 'security' && (jsx(Security, { app: currentSPA || '', email: (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email) || '', platformKey: tenant, onAccountDeleted: onAccountDeleted })), activeTab === 'advanced' && localLLMProps && (jsx("div", { className: "space-y-6", children: jsx(LocalModelsContent, { isAvailable: localLLMProps.isAvailable, state: localLLMProps.state, ollamaStatus: localLLMProps.ollamaStatus, systemMemory: localLLMProps.systemMemory, isUsingFoundry: localLLMProps.isUsingFoundry, foundryModels: localLLMProps.foundryModels, selectedFoundryModel: localLLMProps.selectedFoundryModel, foundryStatus: localLLMProps.foundryStatus, onStartDownload: localLLMProps.onStartDownload, onCancelDownload: localLLMProps.onCancelDownload, onInstallOllama: localLLMProps.onInstallOllama, onStopManager: localLLMProps.onStopManager, onInstallFoundry: localLLMProps.onInstallFoundry, onCheckStatus: localLLMProps.onCheckStatus, onResetState: localLLMProps.onResetState, onSelectFoundryModel: localLLMProps.onSelectFoundryModel }) }))] }));
242114
+ })] })), activeTab === 'education' && (jsxs(Tabs, { value: educationSubTab, onValueChange: setEducationSubTab, className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs(TabsList, { children: [jsx(TabsTrigger, { value: "education", children: t('profileIndex.tabEducation') }), jsx(TabsTrigger, { value: "credentials", children: t('gradebookGradebookTab.typeCredentials') }), jsx(TabsTrigger, { value: "skills", children: t('gradebookGradebookTab.typeSkills') })] }), headerAddButton] }), jsx(TabsContent, { value: "education", children: jsx(EducationTab, { org: tenant, username: username }) }), jsx(TabsContent, { value: "credentials", children: jsx(CredentialsList, { org: tenant, username: username }) }), jsx(TabsContent, { value: "skills", children: jsx(SkillsList, { org: tenant, username: username }) })] })), activeTab === 'gradebook' && (jsx(GradebookTab
242115
+ // Remount on a new preselection so the picker starts there.
242116
+ , { org: tenant, username: username, initialType: gradebookType }, gradebookType !== null && gradebookType !== void 0 ? gradebookType : 'courses')), activeTab === 'experience' && (jsxs(Tabs, { value: experienceSubTab, onValueChange: setExperienceSubTab, className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs(TabsList, { children: [jsx(TabsTrigger, { value: "experience", children: t('profileIndex.tabExperience') }), jsx(TabsTrigger, { value: "resume", children: t('profileIndex.tabResume') })] }), headerAddButton] }), jsx(TabsContent, { value: "experience", children: jsx(ExperienceTab, { org: tenant, username: username }) }), jsx(TabsContent, { value: "resume", children: jsx(ResumeTab, { org: tenant, username: username }) })] })), activeTab === 'purchases' && jsx(PurchasesTab, { org: tenant, username: username }), activeTab === 'memory' && jsx(MemoryTab, { org: tenant, username: username }), activeTab === 'privacy' && jsx(ChatPrivacyTab, { org: tenant, username: username }), isChatHistoryVisible && activeTab === 'chatHistory' && (jsx(ChatHistoryTab, { org: tenant, username: username })), isLlmUsageVisible && activeTab === 'llmUsage' && (jsx(LlmUsageTab, { org: tenant, username: username, isOwnProfile: !isReadOnly })), !isReadOnly && activeTab === 'security' && (jsx(Security, { app: currentSPA || '', email: (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email) || '', platformKey: tenant, onAccountDeleted: onAccountDeleted })), activeTab === 'advanced' && localLLMProps && (jsx("div", { className: "space-y-6", children: jsx(LocalModelsContent, { isAvailable: localLLMProps.isAvailable, state: localLLMProps.state, ollamaStatus: localLLMProps.ollamaStatus, systemMemory: localLLMProps.systemMemory, isUsingFoundry: localLLMProps.isUsingFoundry, foundryModels: localLLMProps.foundryModels, selectedFoundryModel: localLLMProps.selectedFoundryModel, foundryStatus: localLLMProps.foundryStatus, onStartDownload: localLLMProps.onStartDownload, onCancelDownload: localLLMProps.onCancelDownload, onInstallOllama: localLLMProps.onInstallOllama, onStopManager: localLLMProps.onStopManager, onInstallFoundry: localLLMProps.onInstallFoundry, onCheckStatus: localLLMProps.onCheckStatus, onResetState: localLLMProps.onResetState, onSelectFoundryModel: localLLMProps.onSelectFoundryModel }) }))] }));
241106
242117
  }
241107
242118
 
241108
242119
  function CSVEditor({ csvData, onSave, onCancel }) {
@@ -249922,6 +250933,38 @@ const PlatformMembershipContent = ({ platformKey, authURL, }) => {
249922
250933
  return (jsxs("div", { className: "flex items-center justify-between rounded-lg border px-6 py-6", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: t('advancedPlatformMembership.publicRegistrationLabel') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('advancedPlatformMembership.infoAriaLabel'), className: "hidden sm:block", children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "rounded-lg bg-gray-700 px-3 py-2 text-sm font-medium whitespace-nowrap text-white shadow-sm transition-opacity duration-300 z-50", children: jsx("p", { children: t('advancedPlatformMembership.infoTooltip') }) })] }) }), (membershipData === null || membershipData === void 0 ? void 0 : membershipData.allow_self_linking) && (jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { onClick: handleCopyToClipboard, "aria-label": t('advancedPlatformMembership.copyAriaLabel'), className: "cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 p-1 rounded transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1", children: jsx(Copy, { className: "h-4 w-4 text-gray-400 hover:text-blue-500" }) }), jsx(TooltipContent, { className: "rounded-lg bg-gray-700 px-3 py-2 text-sm font-medium whitespace-nowrap text-white shadow-sm transition-opacity duration-300 z-50", children: jsx("p", { children: t('advancedPlatformMembership.copyTooltip') }) })] }) }))] }), jsxs("div", { className: "flex items-center gap-2", children: [jsx(Switch, { checked: membershipData === null || membershipData === void 0 ? void 0 : membershipData.allow_self_linking, onCheckedChange: handleToggleMembership, disabled: isUpdating, "aria-label": `${t('advancedPlatformMembership.switchAriaLabel')} ${(membershipData === null || membershipData === void 0 ? void 0 : membershipData.allow_self_linking) ? t('advancedPlatformMembership.switchEnabled') : t('advancedPlatformMembership.switchDisabled')}`, className: "cursor-pointer data-[state=checked]:bg-blue-500" }), isUpdating && (jsx("div", { className: "w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" }))] })] }));
249923
250934
  };
249924
250935
 
250936
+ /**
250937
+ * Toggles the tenant's SEO discoverability (`allow_seo_discoverability`) on the
250938
+ * platform membership config — the same config the public endpoint exposes, so
250939
+ * apps and the sitemap can tell which tenants opted in. Rendered under Public
250940
+ * Registration in the Advanced settings.
250941
+ */
250942
+ const PlatformSeoDiscoverabilityContent = ({ platformKey, }) => {
250943
+ var _a;
250944
+ const t = useT();
250945
+ const [updatePlatformMembership, { isLoading: isUpdating }] = useUpdatePlatformMembershipMutation();
250946
+ const { data: membershipData, isLoading: isLoadingMembership } = useGetPlatformMembershipQuery({
250947
+ platform_key: platformKey,
250948
+ });
250949
+ const handleToggle = async (checked) => {
250950
+ try {
250951
+ await updatePlatformMembership({
250952
+ platform_key: platformKey,
250953
+ allow_seo_discoverability: checked,
250954
+ }).unwrap();
250955
+ toast.success(t('advancedSeoDiscoverability.toastUpdateSuccess'));
250956
+ }
250957
+ catch (error) {
250958
+ console.error(JSON.stringify(error));
250959
+ toast.error(t('advancedSeoDiscoverability.toastUpdateError'));
250960
+ }
250961
+ };
250962
+ if (isLoadingMembership) {
250963
+ return (jsx("div", { className: "rounded-lg border px-6 py-6", style: { borderColor: 'oklch(.922 0 0)' }, children: jsx("div", { className: "animate-pulse", children: jsxs("div", { className: "flex items-center justify-between", children: [jsx("div", { className: "h-4 bg-gray-200 rounded w-1/3" }), jsx("div", { className: "h-6 w-11 bg-gray-200 rounded" })] }) }) }));
250964
+ }
250965
+ return (jsxs("div", { className: "flex items-center justify-between rounded-lg border px-6 py-6", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: t('advancedSeoDiscoverability.label') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('advancedSeoDiscoverability.infoAriaLabel'), className: "hidden sm:block", children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "rounded-lg bg-gray-700 px-3 py-2 text-sm font-medium text-white shadow-sm transition-opacity duration-300 z-50 max-w-xs", children: jsx("p", { children: t('advancedSeoDiscoverability.infoTooltip') }) })] }) })] }), jsxs("div", { className: "flex items-center gap-2", children: [jsx(Switch, { checked: (_a = membershipData === null || membershipData === void 0 ? void 0 : membershipData.allow_seo_discoverability) !== null && _a !== void 0 ? _a : false, onCheckedChange: handleToggle, disabled: isUpdating, "aria-label": `${t('advancedSeoDiscoverability.switchAriaLabel')} ${(membershipData === null || membershipData === void 0 ? void 0 : membershipData.allow_seo_discoverability) ? t('advancedSeoDiscoverability.switchEnabled') : t('advancedSeoDiscoverability.switchDisabled')}`, className: "cursor-pointer data-[state=checked]:bg-blue-500" }), isUpdating && (jsx("div", { className: "w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" }))] })] }));
250966
+ };
250967
+
249925
250968
  /**
249926
250969
  * Paste-tolerant: a copied address brings a scheme, a path and often a `www.`
249927
250970
  * with it, and a typed one may carry capitals. The backend takes only a
@@ -252163,7 +253206,7 @@ function AdvancedTab({ platformKey, username, currentSPA, authURL, currentPlatfo
252163
253206
  await handleToggleSetting(metadataItem.slug, currentValue);
252164
253207
  }, disabled: isUpdatingTenantMetadata, "aria-label": `${metadataItem.label} ${currentValue ? t('advancedAdvanced.enabled') : t('advancedAdvanced.disabled')}`, className: "cursor-pointer data-[state=checked]:bg-blue-500" }), isUpdatingTenantMetadata && (jsx("div", { className: "w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" }))] })) })] }, metadataItem.slug));
252165
253208
  }) })] }, spa)));
252166
- })()), jsx(StartScreenContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(ContentViewWrapper, { currentSPA: currentSPA, spas: ['mentor'], children: jsx(ChatAreaWidth, { chatAreaSize: metadata === null || metadata === void 0 ? void 0 : metadata.chat_area_size, isUpdating: isUpdatingTenantMetadata, onUpdate: handleChatAreaSizeUpdate, onError: handleChatAreaSizeError }) }), jsx(AuthSpaCustomizationContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(AdvancedCssContent, { platformKey: platformKey, currentSPA: currentSPA || '' }), jsx(RecommendationSystemPromptsContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(StudentMentorCreationContent, { platformKey: platformKey }), jsx(ChatPrivacyContent, { platformKey: platformKey, username: username }), jsx(MemsearchConfigContent, { platformKey: platformKey, userId: username }), jsx(PlatformMembershipContent, { platformKey: platformKey, authURL: authURL }), jsx(CustomDomainsContent, { platformKey: platformKey, username: username, currentSPA: currentSPA || '', currentPlatformBaseDomain: currentPlatformBaseDomain || '' }), jsx(SmtpContent, { platformKey: platformKey }), (currentSPA === null || currentSPA === void 0 ? void 0 : currentSPA.includes('skills')) && (jsxs(Fragment$1, { children: [jsx(ProviderConfigContent, { platformKey: platformKey, username: username }), jsx(ExternalMappingContent, { platformKey: platformKey, username: username })] }))] }) }));
253209
+ })()), jsx(StartScreenContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(ContentViewWrapper, { currentSPA: currentSPA, spas: ['mentor'], children: jsx(ChatAreaWidth, { chatAreaSize: metadata === null || metadata === void 0 ? void 0 : metadata.chat_area_size, isUpdating: isUpdatingTenantMetadata, onUpdate: handleChatAreaSizeUpdate, onError: handleChatAreaSizeError }) }), jsx(AuthSpaCustomizationContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(AdvancedCssContent, { platformKey: platformKey, currentSPA: currentSPA || '' }), jsx(RecommendationSystemPromptsContent, { platformKey: platformKey, currentSPA: currentSPA }), jsx(StudentMentorCreationContent, { platformKey: platformKey }), jsx(ChatPrivacyContent, { platformKey: platformKey, username: username }), jsx(MemsearchConfigContent, { platformKey: platformKey, userId: username }), jsx(PlatformMembershipContent, { platformKey: platformKey, authURL: authURL }), jsx(PlatformSeoDiscoverabilityContent, { platformKey: platformKey }), jsx(CustomDomainsContent, { platformKey: platformKey, username: username, currentSPA: currentSPA || '', currentPlatformBaseDomain: currentPlatformBaseDomain || '' }), jsx(SmtpContent, { platformKey: platformKey }), (currentSPA === null || currentSPA === void 0 ? void 0 : currentSPA.includes('skills')) && (jsxs(Fragment$1, { children: [jsx(ProviderConfigContent, { platformKey: platformKey, username: username }), jsx(ExternalMappingContent, { platformKey: platformKey, username: username })] }))] }) }));
252167
253210
  }
252168
253211
 
252169
253212
  function StripeConnect({ platformKey }) {