@iblai/iblai-js 2.2.8 → 2.2.10

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,9 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { useRef, useEffect, useState, useCallback, useLayoutEffect, forwardRef, createElement as createElement$1, createContext, useContext, useMemo, useReducer, useImperativeHandle, isValidElement, Children, PureComponent, cloneElement, Component, useId as useId$2, useDebugValue, lazy, Suspense } from 'react';
3
3
  import { useDispatch, useSelector } from 'react-redux';
4
- import { selectSessionId, selectActiveChatMessages, useCachedSessionId, chatActions, LOCAL_STORAGE_KEYS, TimeTracker, getInitials, useTenantMetadata, WithPermissions, useStripeUpgrade, openExternalUrl, CHAT_AREA_SIZE, isAlphaNumeric32, checkRbacPermission, getTimeAgo, REQUIRED_ACTIONS_FOR_GROUPS, formatRelativeTime as formatRelativeTime$2, ANONYMOUS_USERNAME, combineCSVData, redirectToAuthSpaJoinTenant, redirectToAuthSpa, getAuthSpaJoinUrl, useOS, selectNumberOfActiveChatMessages, useUsername, selectStreaming, isLoggedIn, TOOLS, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, selectRbacPermissions, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, removeFile, chatInputSliceActions, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
4
+ import { selectSessionId, selectActiveChatMessages, useCachedSessionId, chatActions, LOCAL_STORAGE_KEYS, TimeTracker, getInitials, useTenantMetadata, WithPermissions, useStripeUpgrade, openExternalUrl, CHAT_AREA_SIZE, isAlphaNumeric32, checkRbacPermission, getTimeAgo, REQUIRED_ACTIONS_FOR_GROUPS, formatRelativeTime as formatRelativeTime$2, ANONYMOUS_USERNAME, combineCSVData, redirectToAuthSpaJoinTenant, redirectToAuthSpa, getAuthSpaJoinUrl, useOS, selectNumberOfActiveChatMessages, useUsername, selectStreaming, isLoggedIn, TOOLS, hasRemoteAiConfig, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, selectRbacPermissions, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, chatInputSliceActions, removeFile, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
5
5
  import * as dataLayer from '@iblai/data-layer';
6
- import { useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useDeleteGlobalMemoryMutation, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, 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, useDeleteApiKeyMutation, useGetApiKeysQuery, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useUpdateTenantMetadataMutation, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useGetAiSearchMentorsQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, useGetMentorsQuery, useUpdateTemplateMutation, useGetTemplateDetailsQuery, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetFinancialStatsQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useLazyGetDownloadReportFromURLQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, 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, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillsQuery, useGetMentorSkillAssignmentsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useDeleteMentorMemoryMutation, useUpdateMentorMemoryMutation, useCreateMentorMemoryMutation, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorSettingsQuery, useEditMentorMutation, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
6
+ import { useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useDeleteGlobalMemoryMutation, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, 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, useDeleteApiKeyMutation, useGetApiKeysQuery, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useUpdateTenantMetadataMutation, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useGetAiSearchMentorsQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, useGetMentorsQuery, useUpdateTemplateMutation, useGetTemplateDetailsQuery, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetFinancialStatsQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useLazyGetDownloadReportFromURLQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, 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, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillResourcesQuery, useCreateAgentSkillResourceMutation, useUpdateAgentSkillResourceMutation, useUploadAgentSkillResourceAssetMutation, useDeleteAgentSkillResourceMutation, useGetAgentSkillsQuery, useGetMentorSkillAssignmentsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, resolveEffectiveAgentSkills, filterSlashSkills, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useDeleteMentorMemoryMutation, useUpdateMentorMemoryMutation, useCreateMentorMemoryMutation, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorSettingsQuery, useEditMentorMutation, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
7
7
  import { toast } from 'sonner';
8
8
  import { jsx, Fragment as Fragment$1, jsxs } from 'react/jsx-runtime';
9
9
  import * as ReactDOM from 'react-dom';
@@ -427,18 +427,18 @@ const TAURI_COMMANDS = {
427
427
  LOG_STDOUT: 'log_stdout',
428
428
  };
429
429
  // ============================================================================
430
- // System Control (GhostOS)
430
+ // Cowork (GhostOS)
431
431
  // ----------------------------------------------------------------------------
432
- // Contract for the "System Control" manager, which installs and sets up GhostOS
432
+ // Contract for the Cowork manager, which installs and sets up GhostOS
433
433
  // (https://github.com/ghostwright/ghost-os) on-device via the Tauri host. This
434
434
  // mirrors the Local Models (Ollama) contract above: the web layer ships the
435
435
  // presentational card + types, while the Tauri host (e.g. the ghost-os desktop
436
436
  // app) implements the native install/setup/status commands.
437
437
  // ============================================================================
438
- /** GitHub repository the System Control manager installs and sets up. */
438
+ /** GitHub repository the Cowork manager installs and sets up. */
439
439
  const GHOST_OS_REPO_URL = 'https://github.com/ghostwright/ghost-os';
440
440
  /**
441
- * Initial state for the System Control install flow.
441
+ * Initial state for the Cowork install flow.
442
442
  */
443
443
  const initialGhostOsInstallState = {
444
444
  status: 'idle',
@@ -470,7 +470,7 @@ const GHOST_OS_TAURI_COMMANDS = {
470
470
  /**
471
471
  * Tauri command strings exposed by `tauri-plugin-macos-permissions`
472
472
  * (https://github.com/ayangweb/tauri-plugin-macos-permissions). GhostOS needs
473
- * macOS Accessibility permission to control the device, so the System Control
473
+ * macOS Accessibility permission to control the device, so the Cowork
474
474
  * card surfaces it. These are invoked directly via `useTauri().invoke(...)` —
475
475
  * no extra npm dependency. The host must register the plugin in its Tauri app
476
476
  * (`tauri_plugin_macos_permissions::init()`). Each `CHECK_*` returns a boolean;
@@ -55242,11 +55242,10 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1S);
55242
55242
 
55243
55243
 
55244
55244
  const __iconNode$1R = [
55245
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55246
- ["path", { d: "m16 12-4-4-4 4", key: "177agl" }],
55247
- ["path", { d: "M12 16V8", key: "1sbj14" }]
55245
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
55246
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
55248
55247
  ];
55249
- const CircleArrowUp = createLucideIcon("circle-arrow-up", __iconNode$1R);
55248
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1R);
55250
55249
 
55251
55250
  /**
55252
55251
  * @license lucide-react v0.528.0 - ISC
@@ -55257,10 +55256,10 @@ const CircleArrowUp = createLucideIcon("circle-arrow-up", __iconNode$1R);
55257
55256
 
55258
55257
 
55259
55258
  const __iconNode$1Q = [
55260
- ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
55261
- ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
55259
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55260
+ ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
55262
55261
  ];
55263
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1Q);
55262
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$1Q);
55264
55263
 
55265
55264
  /**
55266
55265
  * @license lucide-react v0.528.0 - ISC
@@ -55272,9 +55271,9 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1Q);
55272
55271
 
55273
55272
  const __iconNode$1P = [
55274
55273
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55275
- ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
55274
+ ["path", { d: "M8 12h8", key: "1wcyev" }]
55276
55275
  ];
55277
- const CircleCheck = createLucideIcon("circle-check", __iconNode$1P);
55276
+ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1P);
55278
55277
 
55279
55278
  /**
55280
55279
  * @license lucide-react v0.528.0 - ISC
@@ -55363,24 +55362,11 @@ const Clock = createLucideIcon("clock", __iconNode$1K);
55363
55362
 
55364
55363
 
55365
55364
  const __iconNode$1J = [
55366
- ["path", { d: "M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z", key: "p7xjir" }]
55367
- ];
55368
- const Cloud = createLucideIcon("cloud", __iconNode$1J);
55369
-
55370
- /**
55371
- * @license lucide-react v0.528.0 - ISC
55372
- *
55373
- * This source code is licensed under the ISC license.
55374
- * See the LICENSE file in the root directory of this source tree.
55375
- */
55376
-
55377
-
55378
- const __iconNode$1I = [
55379
55365
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
55380
55366
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
55381
55367
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
55382
55368
  ];
55383
- const CodeXml = createLucideIcon("code-xml", __iconNode$1I);
55369
+ const CodeXml = createLucideIcon("code-xml", __iconNode$1J);
55384
55370
 
55385
55371
  /**
55386
55372
  * @license lucide-react v0.528.0 - ISC
@@ -55390,11 +55376,11 @@ const CodeXml = createLucideIcon("code-xml", __iconNode$1I);
55390
55376
  */
55391
55377
 
55392
55378
 
55393
- const __iconNode$1H = [
55379
+ const __iconNode$1I = [
55394
55380
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
55395
55381
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
55396
55382
  ];
55397
- const Code$1 = createLucideIcon("code", __iconNode$1H);
55383
+ const Code$1 = createLucideIcon("code", __iconNode$1I);
55398
55384
 
55399
55385
  /**
55400
55386
  * @license lucide-react v0.528.0 - ISC
@@ -55404,11 +55390,11 @@ const Code$1 = createLucideIcon("code", __iconNode$1H);
55404
55390
  */
55405
55391
 
55406
55392
 
55407
- const __iconNode$1G = [
55393
+ const __iconNode$1H = [
55408
55394
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
55409
55395
  ["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" }]
55410
55396
  ];
55411
- const Copy = createLucideIcon("copy", __iconNode$1G);
55397
+ const Copy = createLucideIcon("copy", __iconNode$1H);
55412
55398
 
55413
55399
  /**
55414
55400
  * @license lucide-react v0.528.0 - ISC
@@ -55418,11 +55404,11 @@ const Copy = createLucideIcon("copy", __iconNode$1G);
55418
55404
  */
55419
55405
 
55420
55406
 
55421
- const __iconNode$1F = [
55407
+ const __iconNode$1G = [
55422
55408
  ["rect", { width: "20", height: "14", x: "2", y: "5", rx: "2", key: "ynyp8z" }],
55423
55409
  ["line", { x1: "2", x2: "22", y1: "10", y2: "10", key: "1b3vmo" }]
55424
55410
  ];
55425
- const CreditCard = createLucideIcon("credit-card", __iconNode$1F);
55411
+ const CreditCard = createLucideIcon("credit-card", __iconNode$1G);
55426
55412
 
55427
55413
  /**
55428
55414
  * @license lucide-react v0.528.0 - ISC
@@ -55432,12 +55418,12 @@ const CreditCard = createLucideIcon("credit-card", __iconNode$1F);
55432
55418
  */
55433
55419
 
55434
55420
 
55435
- const __iconNode$1E = [
55421
+ const __iconNode$1F = [
55436
55422
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
55437
55423
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
55438
55424
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
55439
55425
  ];
55440
- const Database = createLucideIcon("database", __iconNode$1E);
55426
+ const Database = createLucideIcon("database", __iconNode$1F);
55441
55427
 
55442
55428
  /**
55443
55429
  * @license lucide-react v0.528.0 - ISC
@@ -55447,11 +55433,11 @@ const Database = createLucideIcon("database", __iconNode$1E);
55447
55433
  */
55448
55434
 
55449
55435
 
55450
- const __iconNode$1D = [
55436
+ const __iconNode$1E = [
55451
55437
  ["line", { x1: "12", x2: "12", y1: "2", y2: "22", key: "7eqyqh" }],
55452
55438
  ["path", { d: "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6", key: "1b0p4s" }]
55453
55439
  ];
55454
- const DollarSign = createLucideIcon("dollar-sign", __iconNode$1D);
55440
+ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1E);
55455
55441
 
55456
55442
  /**
55457
55443
  * @license lucide-react v0.528.0 - ISC
@@ -55461,7 +55447,7 @@ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1D);
55461
55447
  */
55462
55448
 
55463
55449
 
55464
- const __iconNode$1C = [
55450
+ const __iconNode$1D = [
55465
55451
  ["path", { d: "M11 20H2", key: "nlcfvz" }],
55466
55452
  [
55467
55453
  "path",
@@ -55474,7 +55460,7 @@ const __iconNode$1C = [
55474
55460
  ["path", { d: "M14 12h.01", key: "1jfl7z" }],
55475
55461
  ["path", { d: "M22 20h-3", key: "vhrsz" }]
55476
55462
  ];
55477
- const DoorOpen = createLucideIcon("door-open", __iconNode$1C);
55463
+ const DoorOpen = createLucideIcon("door-open", __iconNode$1D);
55478
55464
 
55479
55465
  /**
55480
55466
  * @license lucide-react v0.528.0 - ISC
@@ -55484,12 +55470,12 @@ const DoorOpen = createLucideIcon("door-open", __iconNode$1C);
55484
55470
  */
55485
55471
 
55486
55472
 
55487
- const __iconNode$1B = [
55473
+ const __iconNode$1C = [
55488
55474
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
55489
55475
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
55490
55476
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
55491
55477
  ];
55492
- const Download = createLucideIcon("download", __iconNode$1B);
55478
+ const Download = createLucideIcon("download", __iconNode$1C);
55493
55479
 
55494
55480
  /**
55495
55481
  * @license lucide-react v0.528.0 - ISC
@@ -55499,12 +55485,12 @@ const Download = createLucideIcon("download", __iconNode$1B);
55499
55485
  */
55500
55486
 
55501
55487
 
55502
- const __iconNode$1A = [
55488
+ const __iconNode$1B = [
55503
55489
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
55504
55490
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
55505
55491
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
55506
55492
  ];
55507
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1A);
55493
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1B);
55508
55494
 
55509
55495
  /**
55510
55496
  * @license lucide-react v0.528.0 - ISC
@@ -55514,12 +55500,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1A);
55514
55500
  */
55515
55501
 
55516
55502
 
55517
- const __iconNode$1z = [
55503
+ const __iconNode$1A = [
55518
55504
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
55519
55505
  ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
55520
55506
  ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
55521
55507
  ];
55522
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$1z);
55508
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1A);
55523
55509
 
55524
55510
  /**
55525
55511
  * @license lucide-react v0.528.0 - ISC
@@ -55529,12 +55515,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1z);
55529
55515
  */
55530
55516
 
55531
55517
 
55532
- const __iconNode$1y = [
55518
+ const __iconNode$1z = [
55533
55519
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
55534
55520
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
55535
55521
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
55536
55522
  ];
55537
- const ExternalLink = createLucideIcon("external-link", __iconNode$1y);
55523
+ const ExternalLink = createLucideIcon("external-link", __iconNode$1z);
55538
55524
 
55539
55525
  /**
55540
55526
  * @license lucide-react v0.528.0 - ISC
@@ -55544,7 +55530,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$1y);
55544
55530
  */
55545
55531
 
55546
55532
 
55547
- const __iconNode$1x = [
55533
+ const __iconNode$1y = [
55548
55534
  [
55549
55535
  "path",
55550
55536
  {
@@ -55562,7 +55548,7 @@ const __iconNode$1x = [
55562
55548
  ],
55563
55549
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
55564
55550
  ];
55565
- const EyeOff = createLucideIcon("eye-off", __iconNode$1x);
55551
+ const EyeOff = createLucideIcon("eye-off", __iconNode$1y);
55566
55552
 
55567
55553
  /**
55568
55554
  * @license lucide-react v0.528.0 - ISC
@@ -55572,7 +55558,7 @@ const EyeOff = createLucideIcon("eye-off", __iconNode$1x);
55572
55558
  */
55573
55559
 
55574
55560
 
55575
- const __iconNode$1w = [
55561
+ const __iconNode$1x = [
55576
55562
  [
55577
55563
  "path",
55578
55564
  {
@@ -55582,7 +55568,7 @@ const __iconNode$1w = [
55582
55568
  ],
55583
55569
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
55584
55570
  ];
55585
- const Eye = createLucideIcon("eye", __iconNode$1w);
55571
+ const Eye = createLucideIcon("eye", __iconNode$1x);
55586
55572
 
55587
55573
  /**
55588
55574
  * @license lucide-react v0.528.0 - ISC
@@ -55592,7 +55578,7 @@ const Eye = createLucideIcon("eye", __iconNode$1w);
55592
55578
  */
55593
55579
 
55594
55580
 
55595
- const __iconNode$1v = [
55581
+ const __iconNode$1w = [
55596
55582
  ["path", { d: "M10 12v-1", key: "v7bkov" }],
55597
55583
  ["path", { d: "M10 18v-2", key: "1cjy8d" }],
55598
55584
  ["path", { d: "M10 7V6", key: "dljcrl" }],
@@ -55603,7 +55589,7 @@ const __iconNode$1v = [
55603
55589
  ],
55604
55590
  ["circle", { cx: "10", cy: "20", r: "2", key: "1xzdoj" }]
55605
55591
  ];
55606
- const FileArchive = createLucideIcon("file-archive", __iconNode$1v);
55592
+ const FileArchive = createLucideIcon("file-archive", __iconNode$1w);
55607
55593
 
55608
55594
  /**
55609
55595
  * @license lucide-react v0.528.0 - ISC
@@ -55613,7 +55599,7 @@ const FileArchive = createLucideIcon("file-archive", __iconNode$1v);
55613
55599
  */
55614
55600
 
55615
55601
 
55616
- const __iconNode$1u = [
55602
+ const __iconNode$1v = [
55617
55603
  ["path", { d: "M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3", key: "rslqgf" }],
55618
55604
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55619
55605
  [
@@ -55624,7 +55610,7 @@ const __iconNode$1u = [
55624
55610
  }
55625
55611
  ]
55626
55612
  ];
55627
- const FileAudio = createLucideIcon("file-audio", __iconNode$1u);
55613
+ const FileAudio = createLucideIcon("file-audio", __iconNode$1v);
55628
55614
 
55629
55615
  /**
55630
55616
  * @license lucide-react v0.528.0 - ISC
@@ -55634,13 +55620,13 @@ const FileAudio = createLucideIcon("file-audio", __iconNode$1u);
55634
55620
  */
55635
55621
 
55636
55622
 
55637
- const __iconNode$1t = [
55623
+ const __iconNode$1u = [
55638
55624
  ["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
55639
55625
  ["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }],
55640
55626
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55641
55627
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }]
55642
55628
  ];
55643
- const FileCode = createLucideIcon("file-code", __iconNode$1t);
55629
+ const FileCode = createLucideIcon("file-code", __iconNode$1u);
55644
55630
 
55645
55631
  /**
55646
55632
  * @license lucide-react v0.528.0 - ISC
@@ -55650,13 +55636,13 @@ const FileCode = createLucideIcon("file-code", __iconNode$1t);
55650
55636
  */
55651
55637
 
55652
55638
 
55653
- const __iconNode$1s = [
55639
+ const __iconNode$1t = [
55654
55640
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
55655
55641
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55656
55642
  ["path", { d: "M12 18v-6", key: "17g6i2" }],
55657
55643
  ["path", { d: "m9 15 3 3 3-3", key: "1npd3o" }]
55658
55644
  ];
55659
- const FileDown = createLucideIcon("file-down", __iconNode$1s);
55645
+ const FileDown = createLucideIcon("file-down", __iconNode$1t);
55660
55646
 
55661
55647
  /**
55662
55648
  * @license lucide-react v0.528.0 - ISC
@@ -55666,13 +55652,13 @@ const FileDown = createLucideIcon("file-down", __iconNode$1s);
55666
55652
  */
55667
55653
 
55668
55654
 
55669
- const __iconNode$1r = [
55655
+ const __iconNode$1s = [
55670
55656
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
55671
55657
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55672
55658
  ["circle", { cx: "10", cy: "12", r: "2", key: "737tya" }],
55673
55659
  ["path", { d: "m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22", key: "wt3hpn" }]
55674
55660
  ];
55675
- const FileImage = createLucideIcon("file-image", __iconNode$1r);
55661
+ const FileImage = createLucideIcon("file-image", __iconNode$1s);
55676
55662
 
55677
55663
  /**
55678
55664
  * @license lucide-react v0.528.0 - ISC
@@ -55682,7 +55668,7 @@ const FileImage = createLucideIcon("file-image", __iconNode$1r);
55682
55668
  */
55683
55669
 
55684
55670
 
55685
- const __iconNode$1q = [
55671
+ const __iconNode$1r = [
55686
55672
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55687
55673
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }],
55688
55674
  [
@@ -55693,7 +55679,7 @@ const __iconNode$1q = [
55693
55679
  }
55694
55680
  ]
55695
55681
  ];
55696
- const FilePlay = createLucideIcon("file-play", __iconNode$1q);
55682
+ const FilePlay = createLucideIcon("file-play", __iconNode$1r);
55697
55683
 
55698
55684
  /**
55699
55685
  * @license lucide-react v0.528.0 - ISC
@@ -55703,7 +55689,7 @@ const FilePlay = createLucideIcon("file-play", __iconNode$1q);
55703
55689
  */
55704
55690
 
55705
55691
 
55706
- const __iconNode$1p = [
55692
+ const __iconNode$1q = [
55707
55693
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
55708
55694
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55709
55695
  ["path", { d: "M8 13h2", key: "yr2amv" }],
@@ -55711,7 +55697,7 @@ const __iconNode$1p = [
55711
55697
  ["path", { d: "M8 17h2", key: "2yhykz" }],
55712
55698
  ["path", { d: "M14 17h2", key: "10kma7" }]
55713
55699
  ];
55714
- const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1p);
55700
+ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1q);
55715
55701
 
55716
55702
  /**
55717
55703
  * @license lucide-react v0.528.0 - ISC
@@ -55721,14 +55707,14 @@ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1p);
55721
55707
  */
55722
55708
 
55723
55709
 
55724
- const __iconNode$1o = [
55710
+ const __iconNode$1p = [
55725
55711
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
55726
55712
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
55727
55713
  ["path", { d: "M10 9H8", key: "b1mrlr" }],
55728
55714
  ["path", { d: "M16 13H8", key: "t4e002" }],
55729
55715
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
55730
55716
  ];
55731
- const FileText = createLucideIcon("file-text", __iconNode$1o);
55717
+ const FileText = createLucideIcon("file-text", __iconNode$1p);
55732
55718
 
55733
55719
  /**
55734
55720
  * @license lucide-react v0.528.0 - ISC
@@ -55738,11 +55724,11 @@ const FileText = createLucideIcon("file-text", __iconNode$1o);
55738
55724
  */
55739
55725
 
55740
55726
 
55741
- const __iconNode$1n = [
55727
+ const __iconNode$1o = [
55742
55728
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
55743
55729
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }]
55744
55730
  ];
55745
- const File$1 = createLucideIcon("file", __iconNode$1n);
55731
+ const File$1 = createLucideIcon("file", __iconNode$1o);
55746
55732
 
55747
55733
  /**
55748
55734
  * @license lucide-react v0.528.0 - ISC
@@ -55752,7 +55738,7 @@ const File$1 = createLucideIcon("file", __iconNode$1n);
55752
55738
  */
55753
55739
 
55754
55740
 
55755
- const __iconNode$1m = [
55741
+ const __iconNode$1n = [
55756
55742
  [
55757
55743
  "path",
55758
55744
  {
@@ -55770,7 +55756,7 @@ const __iconNode$1m = [
55770
55756
  ["path", { d: "M3 5a2 2 0 0 0 2 2h3", key: "f2jnh7" }],
55771
55757
  ["path", { d: "M3 3v13a2 2 0 0 0 2 2h3", key: "k8epm1" }]
55772
55758
  ];
55773
- const FolderTree = createLucideIcon("folder-tree", __iconNode$1m);
55759
+ const FolderTree = createLucideIcon("folder-tree", __iconNode$1n);
55774
55760
 
55775
55761
  /**
55776
55762
  * @license lucide-react v0.528.0 - ISC
@@ -55780,14 +55766,14 @@ const FolderTree = createLucideIcon("folder-tree", __iconNode$1m);
55780
55766
  */
55781
55767
 
55782
55768
 
55783
- const __iconNode$1l = [
55769
+ const __iconNode$1m = [
55784
55770
  ["path", { d: "m14.5 12.5-8 8a2.119 2.119 0 1 1-3-3l8-8", key: "15492f" }],
55785
55771
  ["path", { d: "m16 16 6-6", key: "vzrcl6" }],
55786
55772
  ["path", { d: "m8 8 6-6", key: "18bi4p" }],
55787
55773
  ["path", { d: "m9 7 8 8", key: "5jnvq1" }],
55788
55774
  ["path", { d: "m21 11-8-8", key: "z4y7zo" }]
55789
55775
  ];
55790
- const Gavel = createLucideIcon("gavel", __iconNode$1l);
55776
+ const Gavel = createLucideIcon("gavel", __iconNode$1m);
55791
55777
 
55792
55778
  /**
55793
55779
  * @license lucide-react v0.528.0 - ISC
@@ -55797,13 +55783,13 @@ const Gavel = createLucideIcon("gavel", __iconNode$1l);
55797
55783
  */
55798
55784
 
55799
55785
 
55800
- const __iconNode$1k = [
55786
+ const __iconNode$1l = [
55801
55787
  ["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
55802
55788
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
55803
55789
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
55804
55790
  ["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
55805
55791
  ];
55806
- const GitBranch = createLucideIcon("git-branch", __iconNode$1k);
55792
+ const GitBranch = createLucideIcon("git-branch", __iconNode$1l);
55807
55793
 
55808
55794
  /**
55809
55795
  * @license lucide-react v0.528.0 - ISC
@@ -55813,12 +55799,12 @@ const GitBranch = createLucideIcon("git-branch", __iconNode$1k);
55813
55799
  */
55814
55800
 
55815
55801
 
55816
- const __iconNode$1j = [
55802
+ const __iconNode$1k = [
55817
55803
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55818
55804
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
55819
55805
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
55820
55806
  ];
55821
- const Globe = createLucideIcon("globe", __iconNode$1j);
55807
+ const Globe = createLucideIcon("globe", __iconNode$1k);
55822
55808
 
55823
55809
  /**
55824
55810
  * @license lucide-react v0.528.0 - ISC
@@ -55828,7 +55814,7 @@ const Globe = createLucideIcon("globe", __iconNode$1j);
55828
55814
  */
55829
55815
 
55830
55816
 
55831
- const __iconNode$1i = [
55817
+ const __iconNode$1j = [
55832
55818
  [
55833
55819
  "path",
55834
55820
  {
@@ -55839,7 +55825,7 @@ const __iconNode$1i = [
55839
55825
  ["path", { d: "M22 10v6", key: "1lu8f3" }],
55840
55826
  ["path", { d: "M6 12.5V16a6 3 0 0 0 12 0v-3.5", key: "1r8lef" }]
55841
55827
  ];
55842
- const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1i);
55828
+ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1j);
55843
55829
 
55844
55830
  /**
55845
55831
  * @license lucide-react v0.528.0 - ISC
@@ -55849,7 +55835,7 @@ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1i);
55849
55835
  */
55850
55836
 
55851
55837
 
55852
- const __iconNode$1h = [
55838
+ const __iconNode$1i = [
55853
55839
  ["path", { d: "M14 18a2 2 0 0 0-4 0", key: "1v8fkw" }],
55854
55840
  [
55855
55841
  "path",
@@ -55862,7 +55848,7 @@ const __iconNode$1h = [
55862
55848
  ["circle", { cx: "17", cy: "18", r: "3", key: "82mm0e" }],
55863
55849
  ["circle", { cx: "7", cy: "18", r: "3", key: "lvkj7j" }]
55864
55850
  ];
55865
- const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1h);
55851
+ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1i);
55866
55852
 
55867
55853
  /**
55868
55854
  * @license lucide-react v0.528.0 - ISC
@@ -55872,13 +55858,13 @@ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1h);
55872
55858
  */
55873
55859
 
55874
55860
 
55875
- const __iconNode$1g = [
55861
+ const __iconNode$1h = [
55876
55862
  ["path", { d: "M4 12h8", key: "17cfdx" }],
55877
55863
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
55878
55864
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
55879
55865
  ["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
55880
55866
  ];
55881
- const Heading1 = createLucideIcon("heading-1", __iconNode$1g);
55867
+ const Heading1 = createLucideIcon("heading-1", __iconNode$1h);
55882
55868
 
55883
55869
  /**
55884
55870
  * @license lucide-react v0.528.0 - ISC
@@ -55888,13 +55874,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$1g);
55888
55874
  */
55889
55875
 
55890
55876
 
55891
- const __iconNode$1f = [
55877
+ const __iconNode$1g = [
55892
55878
  ["path", { d: "M4 12h8", key: "17cfdx" }],
55893
55879
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
55894
55880
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
55895
55881
  ["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
55896
55882
  ];
55897
- const Heading2 = createLucideIcon("heading-2", __iconNode$1f);
55883
+ const Heading2 = createLucideIcon("heading-2", __iconNode$1g);
55898
55884
 
55899
55885
  /**
55900
55886
  * @license lucide-react v0.528.0 - ISC
@@ -55904,14 +55890,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$1f);
55904
55890
  */
55905
55891
 
55906
55892
 
55907
- const __iconNode$1e = [
55893
+ const __iconNode$1f = [
55908
55894
  ["path", { d: "M4 12h8", key: "17cfdx" }],
55909
55895
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
55910
55896
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
55911
55897
  ["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
55912
55898
  ["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
55913
55899
  ];
55914
- const Heading3 = createLucideIcon("heading-3", __iconNode$1e);
55900
+ const Heading3 = createLucideIcon("heading-3", __iconNode$1f);
55915
55901
 
55916
55902
  /**
55917
55903
  * @license lucide-react v0.528.0 - ISC
@@ -55921,12 +55907,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$1e);
55921
55907
  */
55922
55908
 
55923
55909
 
55924
- const __iconNode$1d = [
55910
+ const __iconNode$1e = [
55925
55911
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
55926
55912
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
55927
55913
  ["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
55928
55914
  ];
55929
- const History = createLucideIcon("history", __iconNode$1d);
55915
+ const History = createLucideIcon("history", __iconNode$1e);
55930
55916
 
55931
55917
  /**
55932
55918
  * @license lucide-react v0.528.0 - ISC
@@ -55936,12 +55922,12 @@ const History = createLucideIcon("history", __iconNode$1d);
55936
55922
  */
55937
55923
 
55938
55924
 
55939
- const __iconNode$1c = [
55925
+ const __iconNode$1d = [
55940
55926
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
55941
55927
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
55942
55928
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
55943
55929
  ];
55944
- const Image$3 = createLucideIcon("image", __iconNode$1c);
55930
+ const Image$3 = createLucideIcon("image", __iconNode$1d);
55945
55931
 
55946
55932
  /**
55947
55933
  * @license lucide-react v0.528.0 - ISC
@@ -55951,7 +55937,7 @@ const Image$3 = createLucideIcon("image", __iconNode$1c);
55951
55937
  */
55952
55938
 
55953
55939
 
55954
- const __iconNode$1b = [
55940
+ const __iconNode$1c = [
55955
55941
  ["polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12", key: "o97t9d" }],
55956
55942
  [
55957
55943
  "path",
@@ -55961,7 +55947,7 @@ const __iconNode$1b = [
55961
55947
  }
55962
55948
  ]
55963
55949
  ];
55964
- const Inbox = createLucideIcon("inbox", __iconNode$1b);
55950
+ const Inbox = createLucideIcon("inbox", __iconNode$1c);
55965
55951
 
55966
55952
  /**
55967
55953
  * @license lucide-react v0.528.0 - ISC
@@ -55971,12 +55957,12 @@ const Inbox = createLucideIcon("inbox", __iconNode$1b);
55971
55957
  */
55972
55958
 
55973
55959
 
55974
- const __iconNode$1a = [
55960
+ const __iconNode$1b = [
55975
55961
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55976
55962
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
55977
55963
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
55978
55964
  ];
55979
- const Info$3 = createLucideIcon("info", __iconNode$1a);
55965
+ const Info$3 = createLucideIcon("info", __iconNode$1b);
55980
55966
 
55981
55967
  /**
55982
55968
  * @license lucide-react v0.528.0 - ISC
@@ -55986,12 +55972,12 @@ const Info$3 = createLucideIcon("info", __iconNode$1a);
55986
55972
  */
55987
55973
 
55988
55974
 
55989
- const __iconNode$19 = [
55975
+ const __iconNode$1a = [
55990
55976
  ["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
55991
55977
  ["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
55992
55978
  ["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
55993
55979
  ];
55994
- const Italic$1 = createLucideIcon("italic", __iconNode$19);
55980
+ const Italic$1 = createLucideIcon("italic", __iconNode$1a);
55995
55981
 
55996
55982
  /**
55997
55983
  * @license lucide-react v0.528.0 - ISC
@@ -56001,7 +55987,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$19);
56001
55987
  */
56002
55988
 
56003
55989
 
56004
- const __iconNode$18 = [
55990
+ const __iconNode$19 = [
56005
55991
  [
56006
55992
  "path",
56007
55993
  {
@@ -56011,7 +55997,7 @@ const __iconNode$18 = [
56011
55997
  ],
56012
55998
  ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
56013
55999
  ];
56014
- const KeyRound = createLucideIcon("key-round", __iconNode$18);
56000
+ const KeyRound = createLucideIcon("key-round", __iconNode$19);
56015
56001
 
56016
56002
  /**
56017
56003
  * @license lucide-react v0.528.0 - ISC
@@ -56021,7 +56007,7 @@ const KeyRound = createLucideIcon("key-round", __iconNode$18);
56021
56007
  */
56022
56008
 
56023
56009
 
56024
- const __iconNode$17 = [
56010
+ const __iconNode$18 = [
56025
56011
  ["path", { d: "M10 18v-7", key: "wt116b" }],
56026
56012
  [
56027
56013
  "path",
@@ -56035,7 +56021,7 @@ const __iconNode$17 = [
56035
56021
  ["path", { d: "M3 22h18", key: "8prr45" }],
56036
56022
  ["path", { d: "M6 18v-7", key: "1ivflk" }]
56037
56023
  ];
56038
- const Landmark = createLucideIcon("landmark", __iconNode$17);
56024
+ const Landmark = createLucideIcon("landmark", __iconNode$18);
56039
56025
 
56040
56026
  /**
56041
56027
  * @license lucide-react v0.528.0 - ISC
@@ -56045,7 +56031,7 @@ const Landmark = createLucideIcon("landmark", __iconNode$17);
56045
56031
  */
56046
56032
 
56047
56033
 
56048
- const __iconNode$16 = [
56034
+ const __iconNode$17 = [
56049
56035
  [
56050
56036
  "path",
56051
56037
  {
@@ -56068,7 +56054,7 @@ const __iconNode$16 = [
56068
56054
  }
56069
56055
  ]
56070
56056
  ];
56071
- const Layers = createLucideIcon("layers", __iconNode$16);
56057
+ const Layers = createLucideIcon("layers", __iconNode$17);
56072
56058
 
56073
56059
  /**
56074
56060
  * @license lucide-react v0.528.0 - ISC
@@ -56078,12 +56064,12 @@ const Layers = createLucideIcon("layers", __iconNode$16);
56078
56064
  */
56079
56065
 
56080
56066
 
56081
- const __iconNode$15 = [
56067
+ const __iconNode$16 = [
56082
56068
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
56083
56069
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
56084
56070
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
56085
56071
  ];
56086
- const Link2 = createLucideIcon("link-2", __iconNode$15);
56072
+ const Link2 = createLucideIcon("link-2", __iconNode$16);
56087
56073
 
56088
56074
  /**
56089
56075
  * @license lucide-react v0.528.0 - ISC
@@ -56093,11 +56079,11 @@ const Link2 = createLucideIcon("link-2", __iconNode$15);
56093
56079
  */
56094
56080
 
56095
56081
 
56096
- const __iconNode$14 = [
56082
+ const __iconNode$15 = [
56097
56083
  ["path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71", key: "1cjeqo" }],
56098
56084
  ["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
56099
56085
  ];
56100
- const Link$1 = createLucideIcon("link", __iconNode$14);
56086
+ const Link$1 = createLucideIcon("link", __iconNode$15);
56101
56087
 
56102
56088
  /**
56103
56089
  * @license lucide-react v0.528.0 - ISC
@@ -56107,7 +56093,7 @@ const Link$1 = createLucideIcon("link", __iconNode$14);
56107
56093
  */
56108
56094
 
56109
56095
 
56110
- const __iconNode$13 = [
56096
+ const __iconNode$14 = [
56111
56097
  ["path", { d: "M10 12h11", key: "6m4ad9" }],
56112
56098
  ["path", { d: "M10 18h11", key: "11hvi2" }],
56113
56099
  ["path", { d: "M10 6h11", key: "c7qv1k" }],
@@ -56115,7 +56101,7 @@ const __iconNode$13 = [
56115
56101
  ["path", { d: "M4 6h1v4", key: "cnovpq" }],
56116
56102
  ["path", { d: "M6 18H4c0-1 2-2 2-3s-1-1.5-2-1", key: "m9a95d" }]
56117
56103
  ];
56118
- const ListOrdered = createLucideIcon("list-ordered", __iconNode$13);
56104
+ const ListOrdered = createLucideIcon("list-ordered", __iconNode$14);
56119
56105
 
56120
56106
  /**
56121
56107
  * @license lucide-react v0.528.0 - ISC
@@ -56125,7 +56111,7 @@ const ListOrdered = createLucideIcon("list-ordered", __iconNode$13);
56125
56111
  */
56126
56112
 
56127
56113
 
56128
- const __iconNode$12 = [
56114
+ const __iconNode$13 = [
56129
56115
  ["path", { d: "M3 12h.01", key: "nlz23k" }],
56130
56116
  ["path", { d: "M3 18h.01", key: "1tta3j" }],
56131
56117
  ["path", { d: "M3 6h.01", key: "1rqtza" }],
@@ -56133,7 +56119,7 @@ const __iconNode$12 = [
56133
56119
  ["path", { d: "M8 18h13", key: "1lx6n3" }],
56134
56120
  ["path", { d: "M8 6h13", key: "ik3vkj" }]
56135
56121
  ];
56136
- const List$1 = createLucideIcon("list", __iconNode$12);
56122
+ const List$1 = createLucideIcon("list", __iconNode$13);
56137
56123
 
56138
56124
  /**
56139
56125
  * @license lucide-react v0.528.0 - ISC
@@ -56143,8 +56129,8 @@ const List$1 = createLucideIcon("list", __iconNode$12);
56143
56129
  */
56144
56130
 
56145
56131
 
56146
- const __iconNode$11 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
56147
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$11);
56132
+ const __iconNode$12 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
56133
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$12);
56148
56134
 
56149
56135
  /**
56150
56136
  * @license lucide-react v0.528.0 - ISC
@@ -56154,11 +56140,11 @@ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$11);
56154
56140
  */
56155
56141
 
56156
56142
 
56157
- const __iconNode$10 = [
56143
+ const __iconNode$11 = [
56158
56144
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
56159
56145
  ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
56160
56146
  ];
56161
- const Lock = createLucideIcon("lock", __iconNode$10);
56147
+ const Lock = createLucideIcon("lock", __iconNode$11);
56162
56148
 
56163
56149
  /**
56164
56150
  * @license lucide-react v0.528.0 - ISC
@@ -56168,11 +56154,11 @@ const Lock = createLucideIcon("lock", __iconNode$10);
56168
56154
  */
56169
56155
 
56170
56156
 
56171
- const __iconNode$$ = [
56157
+ const __iconNode$10 = [
56172
56158
  ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
56173
56159
  ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
56174
56160
  ];
56175
- const Mail = createLucideIcon("mail", __iconNode$$);
56161
+ const Mail = createLucideIcon("mail", __iconNode$10);
56176
56162
 
56177
56163
  /**
56178
56164
  * @license lucide-react v0.528.0 - ISC
@@ -56182,10 +56168,10 @@ const Mail = createLucideIcon("mail", __iconNode$$);
56182
56168
  */
56183
56169
 
56184
56170
 
56185
- const __iconNode$_ = [
56171
+ const __iconNode$$ = [
56186
56172
  ["path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z", key: "1lielz" }]
56187
56173
  ];
56188
- const MessageSquare = createLucideIcon("message-square", __iconNode$_);
56174
+ const MessageSquare = createLucideIcon("message-square", __iconNode$$);
56189
56175
 
56190
56176
  /**
56191
56177
  * @license lucide-react v0.528.0 - ISC
@@ -56195,12 +56181,27 @@ const MessageSquare = createLucideIcon("message-square", __iconNode$_);
56195
56181
  */
56196
56182
 
56197
56183
 
56198
- const __iconNode$Z = [
56184
+ const __iconNode$_ = [
56199
56185
  ["path", { d: "M12 19v3", key: "npa21l" }],
56200
56186
  ["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
56201
56187
  ["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
56202
56188
  ];
56203
- const Mic = createLucideIcon("mic", __iconNode$Z);
56189
+ const Mic = createLucideIcon("mic", __iconNode$_);
56190
+
56191
+ /**
56192
+ * @license lucide-react v0.528.0 - ISC
56193
+ *
56194
+ * This source code is licensed under the ISC license.
56195
+ * See the LICENSE file in the root directory of this source tree.
56196
+ */
56197
+
56198
+
56199
+ const __iconNode$Z = [
56200
+ ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
56201
+ ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
56202
+ ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
56203
+ ];
56204
+ const Monitor = createLucideIcon("monitor", __iconNode$Z);
56204
56205
 
56205
56206
  /**
56206
56207
  * @license lucide-react v0.528.0 - ISC
@@ -61024,118 +61025,6 @@ var gradebookGradebookTab$3 = {
61024
61025
  previousPage: "Previous",
61025
61026
  nextPage: "Next"
61026
61027
  };
61027
- var graderTabLabels$3 = {
61028
- header: {
61029
- title: "Grader",
61030
- description: "Set up how your agent grades work against a rubric you define."
61031
- },
61032
- capability: {
61033
- title: "Grading",
61034
- description: "Let your agent grade work. When this is on, the agent scores what people submit against the rubric you set up below and shares the result as feedback — great for essays, projects, and practice exercises.",
61035
- offHint: "Turn it on to write grading instructions and build your rubric. Anything you set up here is kept safe if you later turn it off."
61036
- },
61037
- subTabs: {
61038
- setup: "Grading setup",
61039
- rubric: "Rubric"
61040
- },
61041
- denied: {
61042
- title: "No access to grading settings",
61043
- description: "You don't have permission to view this agent's grading setup. Ask an administrator for access."
61044
- },
61045
- warnings: {
61046
- noConfig: "Grading is on but not set up yet — the agent will fail when asked to grade. Save your grading instructions in Grading setup to finish.",
61047
- noCriteria: "Grading is on but the rubric is empty — the agent will fail when asked to grade. Add at least one criterion in the Rubric tab."
61048
- },
61049
- config: {
61050
- sectionTitle: "Grading setup",
61051
- gradingMode: {
61052
- label: "What gets graded",
61053
- options: {
61054
- submission: "A submission",
61055
- conversation: "The conversation"
61056
- },
61057
- help: {
61058
- submission: "The agent grades a piece of work the person hands in, like an essay or answer.",
61059
- conversation: "The agent grades how the whole conversation went."
61060
- }
61061
- },
61062
- feedbackMode: {
61063
- label: "Feedback shared with the person",
61064
- options: {
61065
- overall: "Overall feedback only",
61066
- perCriteria: "Feedback per criterion",
61067
- both: "Overall + per criterion"
61068
- },
61069
- help: "The overall score is always calculated — this only controls how much detail is shared back."
61070
- },
61071
- instructions: {
61072
- label: "Grading instructions",
61073
- placeholder: "Describe what's being graded and anything the grader should know beyond the rubric. E.g. 'You are grading a 500-word persuasive essay on climate policy written by a high-school student. Be encouraging but honest.'",
61074
- help: "Required. This is the context the agent uses every time it grades."
61075
- },
61076
- saveButton: "Save",
61077
- savingButton: "Saving…"
61078
- },
61079
- criteria: {
61080
- sectionTitle: "Rubric",
61081
- description: "Each row is one thing the agent looks for and how many points it is worth. The overall score is points earned out of the total.",
61082
- needsConfigHint: "Save your grading setup first, then add rubric criteria here.",
61083
- emptyState: "No criteria yet. Add your first one — for example \"Clarity\", 10 points.",
61084
- addButton: "Add criterion",
61085
- columns: {
61086
- name: "Name",
61087
- criteria: "Criteria",
61088
- points: "Points"
61089
- },
61090
- actionsAria: "Actions for {name}",
61091
- edit: "Edit",
61092
- "delete": "Delete",
61093
- totalPoints: "Total possible points: {total}",
61094
- scoreHint: "Overall score = points earned ÷ {total}.",
61095
- lastCriterionHint: "A rubric needs at least one criterion — add another before removing this one.",
61096
- modal: {
61097
- addTitle: "Add criterion",
61098
- editTitle: "Edit criterion",
61099
- name: {
61100
- label: "Name",
61101
- placeholder: "e.g. Clarity",
61102
- required: "Name is required"
61103
- },
61104
- criteria: {
61105
- label: "Criteria",
61106
- placeholder: "e.g. The argument is easy to follow and each paragraph makes one clear point.",
61107
- required: "Criteria is required"
61108
- },
61109
- points: {
61110
- label: "Points",
61111
- placeholder: "10",
61112
- positive: "Points must be a positive number"
61113
- },
61114
- save: "Save",
61115
- saving: "Saving…",
61116
- cancel: "Cancel"
61117
- },
61118
- deleteModal: {
61119
- title: "Delete criterion",
61120
- confirmationPrefix: "Are you sure you want to remove",
61121
- confirmationSuffix: " from the rubric?",
61122
- cancel: "Cancel",
61123
- "delete": "Delete",
61124
- deleting: "Deleting…"
61125
- }
61126
- },
61127
- toasts: {
61128
- toggleOn: "Grading turned on",
61129
- toggleOff: "Grading turned off — your rubric is kept for next time",
61130
- toggleError: "Couldn't update grading",
61131
- configSaved: "Grading setup saved",
61132
- configError: "Couldn't save grading setup",
61133
- criterionAdded: "Criterion added",
61134
- criterionUpdated: "Criterion updated",
61135
- criterionDeleted: "Criterion deleted",
61136
- criterionError: "Couldn't update the rubric"
61137
- }
61138
- };
61139
61028
  var careerExperienceDialog$3 = {
61140
61029
  pleaseSelectACompany: "Please select a company",
61141
61030
  endDateCannotBeBeforeStartDate: "End date cannot be before start date",
@@ -61289,6 +61178,9 @@ var chatInputFormInsideButtons$3 = {
61289
61178
  studyMode: "Study Mode",
61290
61179
  deepResearch: "Deep Research",
61291
61180
  memory: "Memory",
61181
+ cowork: "Cowork",
61182
+ coworkNeedsBackend: "Enable a large local model or sign in to a workspace to use Cowork.",
61183
+ coworkModelTooSmall: "Your local model is too small for Cowork. Pick a model of at least 14GB in Local Models.",
61292
61184
  moreOptions: "More options"
61293
61185
  };
61294
61186
  var chatInputFormMemoryMenu$3 = {
@@ -61446,7 +61338,57 @@ var clawSandboxAgentSkills$3 = {
61446
61338
  fieldVersionPlaceholder: "e.g. 1.0.0",
61447
61339
  fieldDescription: "Description",
61448
61340
  fieldDescriptionPlaceholder: "e.g. Search the web for information",
61449
- fieldInstruction: "Instruction"
61341
+ fieldInstruction: "Instruction",
61342
+ sessionNote: "Skills added or removed here apply to new chat sessions only. Edits to a skill's instructions apply immediately, including in conversations already in progress.",
61343
+ effectiveHeading: "This agent's skills",
61344
+ catalogHeading: "Available skills",
61345
+ noEffectiveSkills: "No skills enabled for this agent yet. Add one from the available skills below.",
61346
+ addToAgent: "Add",
61347
+ addToAgentLabel: "Add {name} to this agent",
61348
+ removeFromAgent: "Remove from agent",
61349
+ skillAdded: "{name} added",
61350
+ skillRemoved: "{name} removed",
61351
+ featuredBadge: "Featured",
61352
+ nativeBadge: "Native",
61353
+ privateBadge: "Only this agent",
61354
+ fieldCategory: "Category",
61355
+ fieldCategoryPlaceholder: "e.g. web, code, data",
61356
+ privateToAgent: "Only this agent",
61357
+ privateToAgentHint: "Private skills are available to this agent only and take precedence over platform skills with the same slug.",
61358
+ instructionHint: "The playbook the agent follows when the skill is used. Edits apply immediately, including in conversations already in progress.",
61359
+ filesHint: "Optional resources the agent can use with this skill. References and scripts are text files; assets are uploaded files.",
61360
+ filesAfterCreateHint: "You can attach resources to this skill after creating it (reopen it with Edit).",
61361
+ noFiles: "No resources attached yet.",
61362
+ loadingFiles: "Loading resources...",
61363
+ fileTypeLabel: "Type",
61364
+ fileTypeReference: "Reference",
61365
+ fileTypeScript: "Script",
61366
+ fileTypeAsset: "Asset",
61367
+ fileNameLabel: "File name",
61368
+ fileNamePlaceholder: "e.g. rubric.md",
61369
+ fileContentLabel: "Content",
61370
+ fileContentPlaceholder: "The file's text content",
61371
+ addFileButton: "Add resource",
61372
+ adding: "Adding...",
61373
+ uploading: "Uploading...",
61374
+ fileAdded: "Resource added",
61375
+ fileUploaded: "Resource uploaded",
61376
+ fileSaved: "Resource saved",
61377
+ fileDeleted: "Resource deleted",
61378
+ failedToSaveFile: "Failed to save resource",
61379
+ failedToUploadFile: "Failed to upload resource",
61380
+ failedToDeleteFile: "Failed to delete resource",
61381
+ detailsTab: "General",
61382
+ filesTab: "Resources",
61383
+ newFile: "New Resource",
61384
+ newFileDialogTitle: "New Resource",
61385
+ editFileDialogTitle: "Edit Resource",
61386
+ deleteFileDialogTitle: "Delete Resource",
61387
+ deleteFileConfirmation: "Are you sure you want to delete {name}? This action cannot be undone.",
61388
+ chooseFile: "Choose file",
61389
+ upload: "Upload",
61390
+ download: "Download",
61391
+ resourcesItemLabel: "resources"
61450
61392
  };
61451
61393
  var clawSandboxHelpers$3 = {
61452
61394
  unknown: "Unknown",
@@ -63711,7 +63653,7 @@ var safetyTabLabels$3 = {
63711
63653
  };
63712
63654
  var screenshareTabLabels$3 = {
63713
63655
  header: {
63714
- title: "Screen Share",
63656
+ title: "Screen",
63715
63657
  description: "How your agent behaves when a user shares their screen during a voice call."
63716
63658
  },
63717
63659
  capability: {
@@ -65350,6 +65292,19 @@ var platformNavbar$3 = {
65350
65292
  placementExamsHeader: "Placement exams",
65351
65293
  placementExamFallback: "Placement exam"
65352
65294
  };
65295
+ var slashSkillPicker$3 = {
65296
+ listLabel: "Agent skills",
65297
+ resultsAnnouncement: "{count} skills available. Use arrow keys to browse and Enter to select.",
65298
+ loading: "Loading..."
65299
+ };
65300
+ var skillsTabLabels$3 = {
65301
+ header: {
65302
+ title: "Skills",
65303
+ description: "Reusable playbooks you can attach to this agent — each one is a set of instructions for a job. In chat, type / to use one."
65304
+ },
65305
+ notBaseAgent: "Skills are only available to Base Agents.",
65306
+ loading: "Loading..."
65307
+ };
65353
65308
  var placementExam$3 = {
65354
65309
  title: "Placement exam",
65355
65310
  back: "Back"
@@ -65646,6 +65601,118 @@ var profileApplicationsQuestionsEditor$3 = {
65646
65601
  collapseSection: "Collapse section",
65647
65602
  expandSection: "Expand section"
65648
65603
  };
65604
+ var graderTabLabels$3 = {
65605
+ header: {
65606
+ title: "Grader",
65607
+ description: "Set up how your agent grades work against a rubric you define."
65608
+ },
65609
+ capability: {
65610
+ title: "Grading",
65611
+ description: "Let your agent grade work. When this is on, the agent scores what people submit against the rubric you set up below and shares the result as feedback — great for essays, projects, and practice exercises.",
65612
+ offHint: "Turn it on to write grading instructions and build your rubric. Anything you set up here is kept safe if you later turn it off."
65613
+ },
65614
+ subTabs: {
65615
+ setup: "Grading setup",
65616
+ rubric: "Rubric"
65617
+ },
65618
+ denied: {
65619
+ title: "No access to grading settings",
65620
+ description: "You don't have permission to view this agent's grading setup. Ask an administrator for access."
65621
+ },
65622
+ warnings: {
65623
+ noConfig: "Grading is on but not set up yet — the agent will fail when asked to grade. Save your grading instructions in Grading setup to finish.",
65624
+ noCriteria: "Grading is on but the rubric is empty — the agent will fail when asked to grade. Add at least one criterion in the Rubric tab."
65625
+ },
65626
+ config: {
65627
+ sectionTitle: "Grading setup",
65628
+ gradingMode: {
65629
+ label: "What gets graded",
65630
+ options: {
65631
+ submission: "A submission",
65632
+ conversation: "The conversation"
65633
+ },
65634
+ help: {
65635
+ submission: "The agent grades a piece of work the person hands in, like an essay or answer.",
65636
+ conversation: "The agent grades how the whole conversation went."
65637
+ }
65638
+ },
65639
+ feedbackMode: {
65640
+ label: "Feedback shared with the person",
65641
+ options: {
65642
+ overall: "Overall feedback only",
65643
+ perCriteria: "Feedback per criterion",
65644
+ both: "Overall + per criterion"
65645
+ },
65646
+ help: "The overall score is always calculated — this only controls how much detail is shared back."
65647
+ },
65648
+ instructions: {
65649
+ label: "Grading instructions",
65650
+ placeholder: "Describe what's being graded and anything the grader should know beyond the rubric. E.g. 'You are grading a 500-word persuasive essay on climate policy written by a high-school student. Be encouraging but honest.'",
65651
+ help: "Required. This is the context the agent uses every time it grades."
65652
+ },
65653
+ saveButton: "Save",
65654
+ savingButton: "Saving…"
65655
+ },
65656
+ criteria: {
65657
+ sectionTitle: "Rubric",
65658
+ description: "Each row is one thing the agent looks for and how many points it is worth. The overall score is points earned out of the total.",
65659
+ needsConfigHint: "Save your grading setup first, then add rubric criteria here.",
65660
+ emptyState: "No criteria yet. Add your first one — for example \"Clarity\", 10 points.",
65661
+ addButton: "Add criterion",
65662
+ columns: {
65663
+ name: "Name",
65664
+ criteria: "Criteria",
65665
+ points: "Points"
65666
+ },
65667
+ actionsAria: "Actions for {name}",
65668
+ edit: "Edit",
65669
+ "delete": "Delete",
65670
+ totalPoints: "Total possible points: {total}",
65671
+ scoreHint: "Overall score = points earned ÷ {total}.",
65672
+ lastCriterionHint: "A rubric needs at least one criterion — add another before removing this one.",
65673
+ modal: {
65674
+ addTitle: "Add criterion",
65675
+ editTitle: "Edit criterion",
65676
+ name: {
65677
+ label: "Name",
65678
+ placeholder: "e.g. Clarity",
65679
+ required: "Name is required"
65680
+ },
65681
+ criteria: {
65682
+ label: "Criteria",
65683
+ placeholder: "e.g. The argument is easy to follow and each paragraph makes one clear point.",
65684
+ required: "Criteria is required"
65685
+ },
65686
+ points: {
65687
+ label: "Points",
65688
+ placeholder: "10",
65689
+ positive: "Points must be a positive number"
65690
+ },
65691
+ save: "Save",
65692
+ saving: "Saving…",
65693
+ cancel: "Cancel"
65694
+ },
65695
+ deleteModal: {
65696
+ title: "Delete criterion",
65697
+ confirmationPrefix: "Are you sure you want to remove",
65698
+ confirmationSuffix: " from the rubric?",
65699
+ cancel: "Cancel",
65700
+ "delete": "Delete",
65701
+ deleting: "Deleting…"
65702
+ }
65703
+ },
65704
+ toasts: {
65705
+ toggleOn: "Grading turned on",
65706
+ toggleOff: "Grading turned off — your rubric is kept for next time",
65707
+ toggleError: "Couldn't update grading",
65708
+ configSaved: "Grading setup saved",
65709
+ configError: "Couldn't save grading setup",
65710
+ criterionAdded: "Criterion added",
65711
+ criterionUpdated: "Criterion updated",
65712
+ criterionDeleted: "Criterion deleted",
65713
+ criterionError: "Couldn't update the rubric"
65714
+ }
65715
+ };
65649
65716
  var en = {
65650
65717
  accessTabAddAccess: accessTabAddAccess$3,
65651
65718
  accessTabLabels: accessTabLabels$3,
@@ -65700,7 +65767,6 @@ var en = {
65700
65767
  careerEducationDialog: careerEducationDialog$3,
65701
65768
  careerEducationTab: careerEducationTab$3,
65702
65769
  gradebookGradebookTab: gradebookGradebookTab$3,
65703
- graderTabLabels: graderTabLabels$3,
65704
65770
  careerExperienceDialog: careerExperienceDialog$3,
65705
65771
  careerExperienceTab: careerExperienceTab$3,
65706
65772
  careerInstitutionDialog: careerInstitutionDialog$3,
@@ -65894,10 +65960,13 @@ var en = {
65894
65960
  benchmarksAddItemsModal: benchmarksAddItemsModal$3,
65895
65961
  platformSidebar: platformSidebar$3,
65896
65962
  platformNavbar: platformNavbar$3,
65963
+ slashSkillPicker: slashSkillPicker$3,
65964
+ skillsTabLabels: skillsTabLabels$3,
65897
65965
  placementExam: placementExam$3,
65898
65966
  applyApplyWizard: applyApplyWizard$3,
65899
65967
  profileApplicationsTab: profileApplicationsTab$3,
65900
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$3
65968
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$3,
65969
+ graderTabLabels: graderTabLabels$3
65901
65970
  };
65902
65971
 
65903
65972
  var accessTabAddAccess$2 = {
@@ -67407,6 +67476,9 @@ var chatInputFormInsideButtons$2 = {
67407
67476
  studyMode: "Mode Étude",
67408
67477
  deepResearch: "Recherche Approfondie",
67409
67478
  memory: "Mémoire",
67479
+ cowork: "Cowork",
67480
+ coworkNeedsBackend: "Activez un grand modèle local ou connectez-vous à un espace de travail pour utiliser Cowork.",
67481
+ coworkModelTooSmall: "Votre modèle local est trop petit pour Cowork. Choisissez un modèle d’au moins 14 Go dans Modèles Locaux.",
67410
67482
  moreOptions: "Plus d'options"
67411
67483
  };
67412
67484
  var chatInputFormMemoryMenu$2 = {
@@ -67564,7 +67636,57 @@ var clawSandboxAgentSkills$2 = {
67564
67636
  fieldVersionPlaceholder: "ex. 1.0.0",
67565
67637
  fieldDescription: "Description",
67566
67638
  fieldDescriptionPlaceholder: "ex. Rechercher des informations sur le web",
67567
- fieldInstruction: "Instruction"
67639
+ fieldInstruction: "Instruction",
67640
+ sessionNote: "Les compétences ajoutées ou supprimées ici ne s'appliquent qu'aux nouvelles sessions de chat. Les modifications des instructions d'une compétence s'appliquent immédiatement, y compris dans les conversations en cours.",
67641
+ effectiveHeading: "Compétences de cet agent",
67642
+ catalogHeading: "Compétences disponibles",
67643
+ noEffectiveSkills: "Cet agent n'a pas encore de compétences activées. Ajoutez-en une depuis les compétences disponibles.",
67644
+ addToAgent: "Ajouter",
67645
+ addToAgentLabel: "Ajouter {name} à cet agent",
67646
+ removeFromAgent: "Retirer de l'agent",
67647
+ skillAdded: "{name} ajoutée",
67648
+ skillRemoved: "{name} retirée",
67649
+ featuredBadge: "En vedette",
67650
+ nativeBadge: "Native",
67651
+ privateBadge: "Cet agent uniquement",
67652
+ fieldCategory: "Catégorie",
67653
+ fieldCategoryPlaceholder: "p. ex. web, code, données",
67654
+ privateToAgent: "Cet agent uniquement",
67655
+ privateToAgentHint: "Les compétences privées ne sont disponibles que pour cet agent et priment sur les compétences de la plateforme portant le même slug.",
67656
+ instructionHint: "Le guide que l'agent suit lorsque la compétence est utilisée. Les modifications s'appliquent immédiatement, y compris dans les conversations en cours.",
67657
+ filesHint: "Ressources facultatives que l'agent peut utiliser avec cette compétence. Les références et les scripts sont des fichiers texte ; les assets sont des fichiers téléversés.",
67658
+ filesAfterCreateHint: "Vous pouvez joindre des ressources à cette compétence après sa création (rouvrez-la avec Modifier).",
67659
+ noFiles: "Aucune ressource jointe pour le moment.",
67660
+ loadingFiles: "Chargement des ressources...",
67661
+ fileTypeLabel: "Type",
67662
+ fileTypeReference: "Référence",
67663
+ fileTypeScript: "Script",
67664
+ fileTypeAsset: "Ressource",
67665
+ fileNameLabel: "Nom du fichier",
67666
+ fileNamePlaceholder: "p. ex. grille.md",
67667
+ fileContentLabel: "Contenu",
67668
+ fileContentPlaceholder: "Le contenu texte du fichier",
67669
+ addFileButton: "Ajouter la ressource",
67670
+ adding: "Ajout...",
67671
+ uploading: "Téléversement...",
67672
+ fileAdded: "Ressource ajoutée",
67673
+ fileUploaded: "Ressource téléversée",
67674
+ fileSaved: "Ressource enregistrée",
67675
+ fileDeleted: "Ressource supprimée",
67676
+ failedToSaveFile: "Impossible d'enregistrer la ressource",
67677
+ failedToUploadFile: "Impossible de téléverser la ressource",
67678
+ failedToDeleteFile: "Impossible de supprimer la ressource",
67679
+ detailsTab: "Général",
67680
+ filesTab: "Ressources",
67681
+ newFile: "Nouvelle ressource",
67682
+ newFileDialogTitle: "Nouvelle ressource",
67683
+ editFileDialogTitle: "Modifier la ressource",
67684
+ deleteFileDialogTitle: "Supprimer la ressource",
67685
+ deleteFileConfirmation: "Voulez-vous vraiment supprimer {name} ? Cette action est irréversible.",
67686
+ chooseFile: "Choisir un fichier",
67687
+ upload: "Téléverser",
67688
+ download: "Télécharger",
67689
+ resourcesItemLabel: "ressources"
67568
67690
  };
67569
67691
  var clawSandboxHelpers$2 = {
67570
67692
  unknown: "Inconnu",
@@ -69829,7 +69951,7 @@ var safetyTabLabels$2 = {
69829
69951
  };
69830
69952
  var screenshareTabLabels$2 = {
69831
69953
  header: {
69832
- title: "Partage d’écran",
69954
+ title: "Écran",
69833
69955
  description: "Comment votre agent se comporte lorsqu’un utilisateur partage son écran pendant un appel vocal."
69834
69956
  },
69835
69957
  capability: {
@@ -71764,6 +71886,19 @@ var profileApplicationsQuestionsEditor$2 = {
71764
71886
  collapseSection: "Réduire la section",
71765
71887
  expandSection: "Développer la section"
71766
71888
  };
71889
+ var slashSkillPicker$2 = {
71890
+ listLabel: "Compétences de l'agent",
71891
+ resultsAnnouncement: "{count} compétences disponibles. Utilisez les flèches pour parcourir et Entrée pour sélectionner.",
71892
+ loading: "Chargement..."
71893
+ };
71894
+ var skillsTabLabels$2 = {
71895
+ header: {
71896
+ title: "Compétences",
71897
+ description: "Des guides réutilisables à attacher à cet agent — chacun est un ensemble d'instructions pour une tâche. Dans le chat, tapez / pour en utiliser un."
71898
+ },
71899
+ notBaseAgent: "Les compétences ne sont disponibles que pour les agents de base.",
71900
+ loading: "Chargement..."
71901
+ };
71767
71902
  var fr = {
71768
71903
  accessTabAddAccess: accessTabAddAccess$2,
71769
71904
  accessTabLabels: accessTabLabels$2,
@@ -72015,7 +72150,9 @@ var fr = {
72015
72150
  placementExam: placementExam$2,
72016
72151
  applyApplyWizard: applyApplyWizard$2,
72017
72152
  profileApplicationsTab: profileApplicationsTab$2,
72018
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$2
72153
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$2,
72154
+ slashSkillPicker: slashSkillPicker$2,
72155
+ skillsTabLabels: skillsTabLabels$2
72019
72156
  };
72020
72157
 
72021
72158
  var accessTabAddAccess$1 = {
@@ -73525,6 +73662,9 @@ var chatInputFormInsideButtons$1 = {
73525
73662
  studyMode: "Modo Estudio",
73526
73663
  deepResearch: "Investigación Profunda",
73527
73664
  memory: "Memoria",
73665
+ cowork: "Cowork",
73666
+ coworkNeedsBackend: "Activa un modelo local grande o inicia sesión en un espacio de trabajo para usar Cowork.",
73667
+ coworkModelTooSmall: "Tu modelo local es demasiado pequeño para Cowork. Elige un modelo de al menos 14 GB en Modelos Locales.",
73528
73668
  moreOptions: "Más opciones"
73529
73669
  };
73530
73670
  var chatInputFormMemoryMenu$1 = {
@@ -73682,7 +73822,57 @@ var clawSandboxAgentSkills$1 = {
73682
73822
  fieldVersionPlaceholder: "ej. 1.0.0",
73683
73823
  fieldDescription: "Descripción",
73684
73824
  fieldDescriptionPlaceholder: "ej. Buscar información en la web",
73685
- fieldInstruction: "Instrucción"
73825
+ fieldInstruction: "Instrucción",
73826
+ sessionNote: "Las habilidades añadidas o eliminadas aquí solo se aplican a las nuevas sesiones de chat. Los cambios en las instrucciones de una habilidad se aplican de inmediato, incluso en conversaciones en curso.",
73827
+ effectiveHeading: "Habilidades de este agente",
73828
+ catalogHeading: "Habilidades disponibles",
73829
+ noEffectiveSkills: "Este agente aún no tiene habilidades habilitadas. Añade una desde las habilidades disponibles.",
73830
+ addToAgent: "Añadir",
73831
+ addToAgentLabel: "Añadir {name} a este agente",
73832
+ removeFromAgent: "Quitar del agente",
73833
+ skillAdded: "{name} añadida",
73834
+ skillRemoved: "{name} eliminada",
73835
+ featuredBadge: "Destacada",
73836
+ nativeBadge: "Nativa",
73837
+ privateBadge: "Solo este agente",
73838
+ fieldCategory: "Categoría",
73839
+ fieldCategoryPlaceholder: "p. ej. web, código, datos",
73840
+ privateToAgent: "Solo este agente",
73841
+ privateToAgentHint: "Las habilidades privadas solo están disponibles para este agente y tienen prioridad sobre las habilidades de la plataforma con el mismo slug.",
73842
+ instructionHint: "La guía que sigue el agente cuando se usa la habilidad. Los cambios se aplican de inmediato, incluso en conversaciones en curso.",
73843
+ filesHint: "Recursos opcionales que el agente puede usar con esta habilidad. Las referencias y los scripts son archivos de texto; los assets son archivos subidos.",
73844
+ filesAfterCreateHint: "Puedes adjuntar recursos a esta habilidad después de crearla (vuelve a abrirla con Editar).",
73845
+ noFiles: "Aún no hay recursos adjuntos.",
73846
+ loadingFiles: "Cargando recursos...",
73847
+ fileTypeLabel: "Tipo",
73848
+ fileTypeReference: "Referencia",
73849
+ fileTypeScript: "Script",
73850
+ fileTypeAsset: "Recurso",
73851
+ fileNameLabel: "Nombre del archivo",
73852
+ fileNamePlaceholder: "p. ej. rubrica.md",
73853
+ fileContentLabel: "Contenido",
73854
+ fileContentPlaceholder: "El contenido de texto del archivo",
73855
+ addFileButton: "Añadir recurso",
73856
+ adding: "Añadiendo...",
73857
+ uploading: "Subiendo...",
73858
+ fileAdded: "Recurso añadido",
73859
+ fileUploaded: "Recurso subido",
73860
+ fileSaved: "Recurso guardado",
73861
+ fileDeleted: "Recurso eliminado",
73862
+ failedToSaveFile: "No se pudo guardar el recurso",
73863
+ failedToUploadFile: "No se pudo subir el recurso",
73864
+ failedToDeleteFile: "No se pudo eliminar el recurso",
73865
+ detailsTab: "General",
73866
+ filesTab: "Recursos",
73867
+ newFile: "Nuevo recurso",
73868
+ newFileDialogTitle: "Nuevo recurso",
73869
+ editFileDialogTitle: "Editar recurso",
73870
+ deleteFileDialogTitle: "Eliminar recurso",
73871
+ deleteFileConfirmation: "¿Seguro que quieres eliminar {name}? Esta acción no se puede deshacer.",
73872
+ chooseFile: "Elegir archivo",
73873
+ upload: "Subir",
73874
+ download: "Descargar",
73875
+ resourcesItemLabel: "recursos"
73686
73876
  };
73687
73877
  var clawSandboxHelpers$1 = {
73688
73878
  unknown: "Desconocido",
@@ -75947,7 +76137,7 @@ var safetyTabLabels$1 = {
75947
76137
  };
75948
76138
  var screenshareTabLabels$1 = {
75949
76139
  header: {
75950
- title: "Pantalla compartida",
76140
+ title: "Pantalla",
75951
76141
  description: "Cómo se comporta tu agente cuando un usuario comparte su pantalla durante una llamada de voz."
75952
76142
  },
75953
76143
  capability: {
@@ -77882,6 +78072,19 @@ var profileApplicationsQuestionsEditor$1 = {
77882
78072
  collapseSection: "Contraer sección",
77883
78073
  expandSection: "Expandir sección"
77884
78074
  };
78075
+ var slashSkillPicker$1 = {
78076
+ listLabel: "Habilidades del agente",
78077
+ resultsAnnouncement: "{count} habilidades disponibles. Usa las flechas para navegar y Enter para seleccionar.",
78078
+ loading: "Cargando..."
78079
+ };
78080
+ var skillsTabLabels$1 = {
78081
+ header: {
78082
+ title: "Habilidades",
78083
+ description: "Guías reutilizables que puedes adjuntar a este agente: cada una es un conjunto de instrucciones para una tarea. En el chat, escribe / para usar una."
78084
+ },
78085
+ notBaseAgent: "Las habilidades solo están disponibles para los agentes base.",
78086
+ loading: "Cargando..."
78087
+ };
77885
78088
  var es = {
77886
78089
  accessTabAddAccess: accessTabAddAccess$1,
77887
78090
  accessTabLabels: accessTabLabels$1,
@@ -78133,7 +78336,9 @@ var es = {
78133
78336
  placementExam: placementExam$1,
78134
78337
  applyApplyWizard: applyApplyWizard$1,
78135
78338
  profileApplicationsTab: profileApplicationsTab$1,
78136
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$1
78339
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$1,
78340
+ slashSkillPicker: slashSkillPicker$1,
78341
+ skillsTabLabels: skillsTabLabels$1
78137
78342
  };
78138
78343
 
78139
78344
  var accessTabAddAccess = {
@@ -79643,6 +79848,9 @@ var chatInputFormInsideButtons = {
79643
79848
  studyMode: "学习模式",
79644
79849
  deepResearch: "深度研究",
79645
79850
  memory: "记忆",
79851
+ cowork: "Cowork",
79852
+ coworkNeedsBackend: "启用大型本地模型或登录工作区即可使用 Cowork。",
79853
+ coworkModelTooSmall: "您的本地模型太小,无法用于 Cowork。请在“本地模型”中选择至少 14GB 的模型。",
79646
79854
  moreOptions: "更多选项"
79647
79855
  };
79648
79856
  var chatInputFormMemoryMenu = {
@@ -79800,7 +80008,57 @@ var clawSandboxAgentSkills = {
79800
80008
  fieldVersionPlaceholder: "例如:1.0.0",
79801
80009
  fieldDescription: "描述",
79802
80010
  fieldDescriptionPlaceholder: "例如:在网络上搜索信息",
79803
- fieldInstruction: "指令"
80011
+ fieldInstruction: "指令",
80012
+ sessionNote: "在此添加或移除的技能仅对新的聊天会话生效。技能指令的修改会立即生效,包括正在进行的对话。",
80013
+ effectiveHeading: "此智能体的技能",
80014
+ catalogHeading: "可用技能",
80015
+ noEffectiveSkills: "此智能体尚未启用任何技能。请从下方的可用技能中添加。",
80016
+ addToAgent: "添加",
80017
+ addToAgentLabel: "将 {name} 添加到此智能体",
80018
+ removeFromAgent: "从智能体中移除",
80019
+ skillAdded: "已添加 {name}",
80020
+ skillRemoved: "已移除 {name}",
80021
+ featuredBadge: "精选",
80022
+ nativeBadge: "原生",
80023
+ privateBadge: "仅此智能体",
80024
+ fieldCategory: "分类",
80025
+ fieldCategoryPlaceholder: "例如 web、代码、数据",
80026
+ privateToAgent: "仅此智能体",
80027
+ privateToAgentHint: "私有技能仅对此智能体可用,并优先于具有相同 slug 的平台技能。",
80028
+ instructionHint: "使用该技能时智能体遵循的操作指南。修改会立即生效,包括正在进行的对话。",
80029
+ filesHint: "智能体在使用此技能时可参考的可选资源。参考资料和脚本是文本文件;资产是上传的文件。",
80030
+ filesAfterCreateHint: "创建技能后即可附加资源(通过“编辑”重新打开)。",
80031
+ noFiles: "尚未附加任何资源。",
80032
+ loadingFiles: "正在加载资源...",
80033
+ fileTypeLabel: "类型",
80034
+ fileTypeReference: "参考资料",
80035
+ fileTypeScript: "脚本",
80036
+ fileTypeAsset: "资源",
80037
+ fileNameLabel: "文件名",
80038
+ fileNamePlaceholder: "例如 rubric.md",
80039
+ fileContentLabel: "内容",
80040
+ fileContentPlaceholder: "文件的文本内容",
80041
+ addFileButton: "添加资源",
80042
+ adding: "添加中...",
80043
+ uploading: "上传中...",
80044
+ fileAdded: "资源已添加",
80045
+ fileUploaded: "资源已上传",
80046
+ fileSaved: "资源已保存",
80047
+ fileDeleted: "资源已删除",
80048
+ failedToSaveFile: "保存资源失败",
80049
+ failedToUploadFile: "上传资源失败",
80050
+ failedToDeleteFile: "删除资源失败",
80051
+ detailsTab: "常规",
80052
+ filesTab: "资源",
80053
+ newFile: "新建资源",
80054
+ newFileDialogTitle: "新建资源",
80055
+ editFileDialogTitle: "编辑资源",
80056
+ deleteFileDialogTitle: "删除资源",
80057
+ deleteFileConfirmation: "确定要删除 {name} 吗?此操作无法撤销。",
80058
+ chooseFile: "选择文件",
80059
+ upload: "上传",
80060
+ download: "下载",
80061
+ resourcesItemLabel: "资源"
79804
80062
  };
79805
80063
  var clawSandboxHelpers = {
79806
80064
  unknown: "未知",
@@ -82065,7 +82323,7 @@ var safetyTabLabels = {
82065
82323
  };
82066
82324
  var screenshareTabLabels = {
82067
82325
  header: {
82068
- title: "屏幕共享",
82326
+ title: "屏幕",
82069
82327
  description: "当用户在语音通话中共享屏幕时,您的智能体的表现方式。"
82070
82328
  },
82071
82329
  capability: {
@@ -84000,6 +84258,19 @@ var profileApplicationsQuestionsEditor = {
84000
84258
  collapseSection: "折叠板块",
84001
84259
  expandSection: "展开板块"
84002
84260
  };
84261
+ var slashSkillPicker = {
84262
+ listLabel: "智能体技能",
84263
+ resultsAnnouncement: "{count} 个技能可用。使用方向键浏览,按 Enter 选择。",
84264
+ loading: "加载中..."
84265
+ };
84266
+ var skillsTabLabels = {
84267
+ header: {
84268
+ title: "技能",
84269
+ description: "可附加到此智能体的可复用操作指南——每个技能都是完成一项任务的指令集。在聊天中输入 / 即可使用。"
84270
+ },
84271
+ notBaseAgent: "技能仅适用于基础智能体。",
84272
+ loading: "加载中..."
84273
+ };
84003
84274
  var zh = {
84004
84275
  accessTabAddAccess: accessTabAddAccess,
84005
84276
  accessTabLabels: accessTabLabels,
@@ -84251,7 +84522,9 @@ var zh = {
84251
84522
  placementExam: placementExam,
84252
84523
  applyApplyWizard: applyApplyWizard,
84253
84524
  profileApplicationsTab: profileApplicationsTab,
84254
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor
84525
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor,
84526
+ slashSkillPicker: slashSkillPicker,
84527
+ skillsTabLabels: skillsTabLabels
84255
84528
  };
84256
84529
 
84257
84530
  /**
@@ -90417,173 +90690,6 @@ var Indicator$2 = ProgressIndicator;
90417
90690
  const Progress = React.forwardRef(({ className, value, ...props }, ref) => (jsx(Root$7, { ref: ref, className: cn('bg-secondary relative h-4 w-full overflow-hidden rounded-full', className), ...props, children: jsx(Indicator$2, { className: "bg-primary h-full w-full flex-1 transition-all", style: { transform: `translateX(-${100 - (value || 0)}%)` } }) })));
90418
90691
  Progress.displayName = Root$7.displayName;
90419
90692
 
90420
- var SLOTTABLE_IDENTIFIER = Symbol("radix.slottable");
90421
- // @__NO_SIDE_EFFECTS__
90422
- function createSlottable(ownerName) {
90423
- const Slottable2 = ({ children }) => {
90424
- return /* @__PURE__ */ jsx(Fragment$1, { children });
90425
- };
90426
- Slottable2.displayName = `${ownerName}.Slottable`;
90427
- Slottable2.__radixId = SLOTTABLE_IDENTIFIER;
90428
- return Slottable2;
90429
- }
90430
-
90431
- var ROOT_NAME = "AlertDialog";
90432
- var [createAlertDialogContext] = createContextScope$1(ROOT_NAME, [
90433
- createDialogScope
90434
- ]);
90435
- var useDialogScope = createDialogScope();
90436
- var AlertDialog$1 = (props) => {
90437
- const { __scopeAlertDialog, ...alertDialogProps } = props;
90438
- const dialogScope = useDialogScope(__scopeAlertDialog);
90439
- return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...dialogScope, ...alertDialogProps, modal: true });
90440
- };
90441
- AlertDialog$1.displayName = ROOT_NAME;
90442
- var TRIGGER_NAME$3 = "AlertDialogTrigger";
90443
- var AlertDialogTrigger = React.forwardRef(
90444
- (props, forwardedRef) => {
90445
- const { __scopeAlertDialog, ...triggerProps } = props;
90446
- const dialogScope = useDialogScope(__scopeAlertDialog);
90447
- return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { ...dialogScope, ...triggerProps, ref: forwardedRef });
90448
- }
90449
- );
90450
- AlertDialogTrigger.displayName = TRIGGER_NAME$3;
90451
- var PORTAL_NAME$3 = "AlertDialogPortal";
90452
- var AlertDialogPortal$1 = (props) => {
90453
- const { __scopeAlertDialog, ...portalProps } = props;
90454
- const dialogScope = useDialogScope(__scopeAlertDialog);
90455
- return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { ...dialogScope, ...portalProps });
90456
- };
90457
- AlertDialogPortal$1.displayName = PORTAL_NAME$3;
90458
- var OVERLAY_NAME = "AlertDialogOverlay";
90459
- var AlertDialogOverlay$1 = React.forwardRef(
90460
- (props, forwardedRef) => {
90461
- const { __scopeAlertDialog, ...overlayProps } = props;
90462
- const dialogScope = useDialogScope(__scopeAlertDialog);
90463
- return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { ...dialogScope, ...overlayProps, ref: forwardedRef });
90464
- }
90465
- );
90466
- AlertDialogOverlay$1.displayName = OVERLAY_NAME;
90467
- var CONTENT_NAME$4 = "AlertDialogContent";
90468
- var [AlertDialogContentProvider, useAlertDialogContentContext] = createAlertDialogContext(CONTENT_NAME$4);
90469
- var Slottable = createSlottable("AlertDialogContent");
90470
- var AlertDialogContent$1 = React.forwardRef(
90471
- (props, forwardedRef) => {
90472
- const { __scopeAlertDialog, children, ...contentProps } = props;
90473
- const dialogScope = useDialogScope(__scopeAlertDialog);
90474
- const contentRef = React.useRef(null);
90475
- const composedRefs = useComposedRefs$1(forwardedRef, contentRef);
90476
- const cancelRef = React.useRef(null);
90477
- return /* @__PURE__ */ jsx(
90478
- DialogPrimitive.WarningProvider,
90479
- {
90480
- contentName: CONTENT_NAME$4,
90481
- titleName: TITLE_NAME,
90482
- docsSlug: "alert-dialog",
90483
- children: /* @__PURE__ */ jsx(AlertDialogContentProvider, { scope: __scopeAlertDialog, cancelRef, children: /* @__PURE__ */ jsxs(
90484
- DialogPrimitive.Content,
90485
- {
90486
- role: "alertdialog",
90487
- ...dialogScope,
90488
- ...contentProps,
90489
- ref: composedRefs,
90490
- onOpenAutoFocus: composeEventHandlers$2(contentProps.onOpenAutoFocus, (event) => {
90491
- event.preventDefault();
90492
- cancelRef.current?.focus({ preventScroll: true });
90493
- }),
90494
- onPointerDownOutside: (event) => event.preventDefault(),
90495
- onInteractOutside: (event) => event.preventDefault(),
90496
- children: [
90497
- /* @__PURE__ */ jsx(Slottable, { children }),
90498
- /* @__PURE__ */ jsx(DescriptionWarning, { contentRef })
90499
- ]
90500
- }
90501
- ) })
90502
- }
90503
- );
90504
- }
90505
- );
90506
- AlertDialogContent$1.displayName = CONTENT_NAME$4;
90507
- var TITLE_NAME = "AlertDialogTitle";
90508
- var AlertDialogTitle$1 = React.forwardRef(
90509
- (props, forwardedRef) => {
90510
- const { __scopeAlertDialog, ...titleProps } = props;
90511
- const dialogScope = useDialogScope(__scopeAlertDialog);
90512
- return /* @__PURE__ */ jsx(DialogPrimitive.Title, { ...dialogScope, ...titleProps, ref: forwardedRef });
90513
- }
90514
- );
90515
- AlertDialogTitle$1.displayName = TITLE_NAME;
90516
- var DESCRIPTION_NAME = "AlertDialogDescription";
90517
- var AlertDialogDescription$1 = React.forwardRef((props, forwardedRef) => {
90518
- const { __scopeAlertDialog, ...descriptionProps } = props;
90519
- const dialogScope = useDialogScope(__scopeAlertDialog);
90520
- return /* @__PURE__ */ jsx(DialogPrimitive.Description, { ...dialogScope, ...descriptionProps, ref: forwardedRef });
90521
- });
90522
- AlertDialogDescription$1.displayName = DESCRIPTION_NAME;
90523
- var ACTION_NAME = "AlertDialogAction";
90524
- var AlertDialogAction$1 = React.forwardRef(
90525
- (props, forwardedRef) => {
90526
- const { __scopeAlertDialog, ...actionProps } = props;
90527
- const dialogScope = useDialogScope(__scopeAlertDialog);
90528
- return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...actionProps, ref: forwardedRef });
90529
- }
90530
- );
90531
- AlertDialogAction$1.displayName = ACTION_NAME;
90532
- var CANCEL_NAME = "AlertDialogCancel";
90533
- var AlertDialogCancel$1 = React.forwardRef(
90534
- (props, forwardedRef) => {
90535
- const { __scopeAlertDialog, ...cancelProps } = props;
90536
- const { cancelRef } = useAlertDialogContentContext(CANCEL_NAME, __scopeAlertDialog);
90537
- const dialogScope = useDialogScope(__scopeAlertDialog);
90538
- const ref = useComposedRefs$1(forwardedRef, cancelRef);
90539
- return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...cancelProps, ref });
90540
- }
90541
- );
90542
- AlertDialogCancel$1.displayName = CANCEL_NAME;
90543
- var DescriptionWarning = ({ contentRef }) => {
90544
- const MESSAGE = `\`${CONTENT_NAME$4}\` requires a description for the component to be accessible for screen reader users.
90545
-
90546
- You can add a description to the \`${CONTENT_NAME$4}\` by passing a \`${DESCRIPTION_NAME}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
90547
-
90548
- Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${CONTENT_NAME$4}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
90549
-
90550
- For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;
90551
- React.useEffect(() => {
90552
- const hasDescription = document.getElementById(
90553
- contentRef.current?.getAttribute("aria-describedby")
90554
- );
90555
- if (!hasDescription) console.warn(MESSAGE);
90556
- }, [MESSAGE, contentRef]);
90557
- return null;
90558
- };
90559
- var Root2$3 = AlertDialog$1;
90560
- var Portal2$1 = AlertDialogPortal$1;
90561
- var Overlay2 = AlertDialogOverlay$1;
90562
- var Content2$3 = AlertDialogContent$1;
90563
- var Action = AlertDialogAction$1;
90564
- var Cancel = AlertDialogCancel$1;
90565
- var Title2 = AlertDialogTitle$1;
90566
- var Description2 = AlertDialogDescription$1;
90567
-
90568
- const AlertDialog = Root2$3;
90569
- const AlertDialogPortal = Portal2$1;
90570
- const AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => (jsx(Overlay2, { className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80', className), ...props, ref: ref })));
90571
- AlertDialogOverlay.displayName = Overlay2.displayName;
90572
- const AlertDialogContent = React.forwardRef(({ className, ...props }, ref) => (jsxs(AlertDialogPortal, { children: [jsx(AlertDialogOverlay, {}), jsx(Content2$3, { ref: ref, className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg', className), ...props })] })));
90573
- AlertDialogContent.displayName = Content2$3.displayName;
90574
- const AlertDialogHeader = ({ className, ...props }) => (jsx("div", { className: cn('flex flex-col space-y-2 text-center sm:text-left', className), ...props }));
90575
- AlertDialogHeader.displayName = 'AlertDialogHeader';
90576
- const AlertDialogFooter = ({ className, ...props }) => (jsx("div", { className: cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
90577
- AlertDialogFooter.displayName = 'AlertDialogFooter';
90578
- const AlertDialogTitle = React.forwardRef(({ className, ...props }, ref) => (jsx(Title2, { ref: ref, className: cn('text-lg font-semibold', className), ...props })));
90579
- AlertDialogTitle.displayName = Title2.displayName;
90580
- const AlertDialogDescription = React.forwardRef(({ className, ...props }, ref) => (jsx(Description2, { ref: ref, className: cn('text-muted-foreground text-sm', className), ...props })));
90581
- AlertDialogDescription.displayName = Description2.displayName;
90582
- const AlertDialogAction = React.forwardRef(({ className, ...props }, ref) => (jsx(Action, { ref: ref, className: cn(buttonVariants(), className), ...props })));
90583
- AlertDialogAction.displayName = Action.displayName;
90584
- const AlertDialogCancel = React.forwardRef(({ className, ...props }, ref) => (jsx(Cancel, { ref: ref, className: cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className), ...props })));
90585
- AlertDialogCancel.displayName = Cancel.displayName;
90586
-
90587
90693
  const LOCAL_LLM_ENABLED_KEY = 'ibl_local_llm_enabled';
90588
90694
  const LOCAL_LLM_MODEL_KEY = 'ibl_local_llm_model';
90589
90695
  const LOCAL_LLM_TOOL_SUPPORT_KEY = 'ibl_local_llm_tool_support';
@@ -90619,8 +90725,8 @@ const LOCAL_MODELS = [
90619
90725
  },
90620
90726
  { name: 'Granite 4.1', provider: 'IBM', id: 'granite4.1:8b', size: '5.3 GB', tool_support: true },
90621
90727
  { name: 'GPT-OSS 20B', provider: 'OpenAI', id: 'gpt-oss:20b', size: '14 GB', tool_support: true },
90622
- // Larger models. Sizes use "GB" so they parse for the System Control size gate
90623
- // (only models above the configured gate can use System Control).
90728
+ // Larger models. Sizes use "GB" so they parse for the Cowork size gate
90729
+ // (only models above the configured gate can use Cowork).
90624
90730
  {
90625
90731
  name: 'Qwen 3.6',
90626
90732
  provider: 'Alibaba',
@@ -90644,34 +90750,6 @@ const LOCAL_MODELS = [
90644
90750
  tool_support: true,
90645
90751
  },
90646
90752
  ];
90647
- /** The model wired to the existing single-model download flow (default selection). */
90648
- const PRIMARY_MODEL_ID = 'phi4-mini:latest';
90649
- /**
90650
- * Whether a catalog model id (e.g. "llama3.2", "phi3:mini") is present among the
90651
- * installed Ollama tags reported by the backend (e.g. "llama3.2:latest"). Matches
90652
- * an exact tag or the same base model with any tag suffix, so a model pulled as
90653
- * `<id>:latest` still counts as installed.
90654
- */
90655
- function isModelInstalled(modelId, installedTags) {
90656
- if (!installedTags)
90657
- return false;
90658
- return installedTags.some((tag) => tag === modelId || tag.startsWith(`${modelId}:`));
90659
- }
90660
- /**
90661
- * Whether a model id is an Ollama cloud-hosted model — either the plain ":cloud"
90662
- * tag (e.g. "glm-5.2:cloud") or a sized cloud tag (e.g. "gemma4:31b-cloud").
90663
- * Cloud models run on Ollama's servers, so they are available by default — never
90664
- * downloaded, no local memory required, always "ready".
90665
- */
90666
- function isCloudModelId(modelId) {
90667
- return modelId.endsWith(':cloud') || (modelId.includes(':') && modelId.endsWith('-cloud'));
90668
- }
90669
- /**
90670
- * Fraction of the machine's memory above which a model is treated as "too large"
90671
- * and a confirmation is required before downloading. TESTING VALUE — set low (1%)
90672
- * so the warning is easy to trigger; raise toward real capacity (e.g. 0.8) later.
90673
- */
90674
- const MODEL_SIZE_WARN_FRACTION = 0.01;
90675
90753
  /** Multipliers for the size units used in the catalog (binary / 1024-based). */
90676
90754
  const SIZE_UNIT_BYTES = {
90677
90755
  B: 1,
@@ -90693,54 +90771,19 @@ function parseModelSizeBytes(size) {
90693
90771
  return null;
90694
90772
  return value * ((_a = SIZE_UNIT_BYTES[match[2].toUpperCase()]) !== null && _a !== void 0 ? _a : 1);
90695
90773
  }
90696
- /** Format a byte count as a short, human-readable size (e.g. "16.0 GB"). */
90697
- function formatBytes(bytes) {
90698
- if (bytes <= 0)
90699
- return '0 GB';
90700
- const gb = bytes / 1024 ** 3;
90701
- if (gb >= 1)
90702
- return `${gb.toFixed(1)} GB`;
90703
- return `${Math.round(bytes / 1024 ** 2)} MB`;
90704
- }
90705
- /**
90706
- * The memory a model can use on this machine: the larger of system RAM and GPU
90707
- * VRAM (a model runs in one or the other). Returns 0 when memory is unknown.
90708
- */
90709
- function usableMemoryBytes(systemMemory) {
90710
- if (!systemMemory)
90711
- return 0;
90712
- return Math.max(systemMemory.ram_total, systemMemory.vram_total);
90713
- }
90714
- /**
90715
- * Whether `model` is large enough relative to this machine's memory to warrant a
90716
- * "might not run" confirmation. False when memory or the model size is unknown,
90717
- * so the download simply proceeds rather than warning on incomplete data.
90718
- */
90719
- function modelExceedsCapacity(model, systemMemory) {
90720
- const capacity = usableMemoryBytes(systemMemory);
90721
- const modelBytes = parseModelSizeBytes(model.size);
90722
- if (modelBytes == null)
90723
- return false;
90724
- // Unknown memory (capacity 0) → don't warn; the download simply proceeds
90725
- // rather than blocking on incomplete data.
90726
- if (capacity <= 0)
90727
- return false;
90728
- return modelBytes > capacity * MODEL_SIZE_WARN_FRACTION;
90729
- }
90730
90774
  /**
90731
- * Default minimum model size (GB) that can use the System Control Manager
90775
+ * Default minimum model size (GB) that can use the Cowork
90732
90776
  * (GhostOS MCP/tools). Smaller models don't support tools/MCP well, so the
90733
- * manager is gated to models above this size. Per-app overridable via the
90734
- * System Control card's `requiredSizeGb` prop (see SystemControlTabProps).
90777
+ * manager is gated to models above this size.
90735
90778
  */
90736
- const DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB = 12;
90779
+ const DEFAULT_COWORK_REQUIRED_SIZE_GB = 12;
90737
90780
  /**
90738
90781
  * Whether the given model (by Ollama id) is large enough to use the System
90739
90782
  * Control Manager — i.e. its catalog size exceeds `gb` (default
90740
- * {@link DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB}). Unknown ids or unparseable
90783
+ * {@link DEFAULT_COWORK_REQUIRED_SIZE_GB}). Unknown ids or unparseable
90741
90784
  * sizes return false (gated off).
90742
90785
  */
90743
- function modelSupportsSystemControl(modelId, gb = DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB) {
90786
+ function modelSupportsCowork(modelId, gb = DEFAULT_COWORK_REQUIRED_SIZE_GB) {
90744
90787
  if (!modelId)
90745
90788
  return false;
90746
90789
  const model = LOCAL_MODELS.find((m) => m.id === modelId);
@@ -90752,12 +90795,12 @@ function modelSupportsSystemControl(modelId, gb = DEFAULT_SYSTEM_CONTROL_REQUIRE
90752
90795
  return bytes > gb * 1024 ** 3;
90753
90796
  }
90754
90797
  /**
90755
- * The smallest catalog model that can use the System Control Manager (size
90798
+ * The smallest catalog model that can use the Cowork (size
90756
90799
  * exceeds `gb`), or null if none qualify. Used by the "Upgrade" action to pick
90757
90800
  * the lightest capable model. Ties / unparseable sizes sort last.
90758
90801
  */
90759
- function smallestSystemControlModel(gb = DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB) {
90760
- const usable = LOCAL_MODELS.filter((m) => modelSupportsSystemControl(m.id, gb));
90802
+ function smallestCoworkModel(gb = DEFAULT_COWORK_REQUIRED_SIZE_GB) {
90803
+ const usable = LOCAL_MODELS.filter((m) => modelSupportsCowork(m.id, gb));
90761
90804
  if (usable.length === 0)
90762
90805
  return null;
90763
90806
  return usable.reduce((smallest, m) => {
@@ -90818,41 +90861,21 @@ function setLocalLLMToolSupport(toolSupport) {
90818
90861
  return;
90819
90862
  localStorage.setItem(LOCAL_LLM_TOOL_SUPPORT_KEY, String(toolSupport));
90820
90863
  }
90821
- function LocalLLMTab({ isAvailable, state, ollamaStatus, systemMemory, isUsingFoundry = false, foundryModels = [], selectedFoundryModel = null, foundryStatus, onStartDownload, onCancelDownload, onInstallOllama, onStopManager, onInstallFoundry, onCheckStatus, onResetState, onSelectFoundryModel, }) {
90822
- var _a, _b, _c, _d, _e, _f, _g;
90864
+ function LocalLLMTab({ isAvailable, state, ollamaStatus, isUsingFoundry = false, foundryModels = [], selectedFoundryModel = null, foundryStatus, onInstallOllama, onStopManager, onInstallFoundry, onCheckStatus, onSelectFoundryModel, }) {
90865
+ var _a, _b, _c, _d, _e;
90823
90866
  const t = useT();
90824
- // Direct Tauri access so the model-size check can read system memory fresh at
90825
- // download-click time (the threaded `systemMemory` prop is only a fast path).
90826
- const { invoke } = useTauri();
90827
90867
  const isDownloading = state.status === 'downloading';
90828
90868
  const isManagerInstalling = state.managerInstalling || (ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installing);
90829
90869
  // User preference state - independent of whether model is installed
90830
90870
  const [isEnabled, setIsEnabled] = useState(() => isLocalLLMEnabled());
90831
- // Which model the shared download flow currently targets. Prefer the model
90832
- // recorded in the persisted download state, so the correct row shows progress
90833
- // even after the dialog is closed and reopened mid-download; fall back to a
90834
- // local value for immediate feedback the instant a Download button is clicked.
90835
- const [localActiveModelId, setLocalActiveModelId] = useState(PRIMARY_MODEL_ID);
90836
- const activeModelId = state.status === 'downloading' && state.activeModel ? state.activeModel : localActiveModelId;
90837
- // Which model the user has chosen to chat with (exclusive selection).
90838
- const [selectedModelId, setSelectedModelId] = useState(() => getLocalLLMModel() || PRIMARY_MODEL_ID);
90839
- // A model the user asked to download that is large relative to this machine's
90840
- // memory. Set when we need the user to confirm a "might not run" warning before
90841
- // starting the download; null when no confirmation is pending.
90842
- const [pendingModel, setPendingModel] = useState(null);
90843
90871
  // "Enable Local Models" === run the model manager (Ollama). The toggle is a
90844
90872
  // user preference that is always operable: turning it on installs (if needed)
90845
- // and starts the manager; turning it off stops it. The card + model table are
90846
- // shown whenever the toggle is on (or mid-install), independent of install
90847
- // state, so the user always gets feedback for their choice.
90873
+ // and starts the manager; turning it off stops it. Only the manager status
90874
+ // card is shown here (whenever the toggle is on or mid-install) the per-model
90875
+ // list lives in Agent settings LLM tab, where local models are picked and
90876
+ // downloaded alongside cloud models.
90848
90877
  const managerRunning = (ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.running) === true;
90849
90878
  const localModelsEnabled = isEnabled || isManagerInstalling;
90850
- // A model can be chosen for chat only once it is downloaded/ready. The backend
90851
- // reports every installed model tag, so any downloaded model qualifies.
90852
- const selectedModelReady = isCloudModelId(selectedModelId) ||
90853
- isModelInstalled(selectedModelId, ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installed_models) ||
90854
- (selectedModelId === PRIMARY_MODEL_ID &&
90855
- (state.status === 'completed' || (ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.model_installed) === true));
90856
90879
  // Track previous model installation state to detect when it first becomes installed
90857
90880
  const [, setWasModelInstalled] = useState(() => {
90858
90881
  return (ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.model_installed) === true;
@@ -90966,62 +90989,6 @@ function LocalLLMTab({ isAvailable, state, ollamaStatus, systemMemory, isUsingFo
90966
90989
  onStopManager === null || onStopManager === void 0 ? void 0 : onStopManager();
90967
90990
  }
90968
90991
  };
90969
- const startDownloadNow = (modelId) => {
90970
- setLocalActiveModelId(modelId);
90971
- onStartDownload(modelId);
90972
- };
90973
- const handleDownloadModel = async (modelId) => {
90974
- // Always read system memory FIRST — this is the call that hits the backend
90975
- // `get_system_memory`. Doing it before the catalog lookup guarantees it runs
90976
- // on every Download click (falling back to the value fetched on mount).
90977
- const model = LOCAL_MODELS.find((m) => modelId.startsWith(m.id));
90978
- if (!model) {
90979
- await invoke(TAURI_COMMANDS.LOG_STDOUT, {
90980
- s: `[Local Models] -> Download: bad download request, model ${model}`,
90981
- });
90982
- console.log(`[Local Models] -> Download: bad download request, model ${model}`);
90983
- return;
90984
- }
90985
- let mem = null;
90986
- try {
90987
- mem = await invoke(TAURI_COMMANDS.GET_SYSTEM_MEMORY);
90988
- }
90989
- catch (e) {
90990
- await invoke(TAURI_COMMANDS.LOG_STDOUT, {
90991
- s: `[Local Models] -> Download: couldn't detect system memory ${modelId} ${e}`,
90992
- });
90993
- console.log(`[Local Models] -> Download: couldn't detect system memory {e}`);
90994
- return;
90995
- }
90996
- const exceeds = modelExceedsCapacity(model, mem);
90997
- console.warn('[Local Models] -> Download: download click', {
90998
- modelId,
90999
- systemMemory: mem,
91000
- capacityBytes: usableMemoryBytes(mem),
91001
- modelBytes: parseModelSizeBytes(model.size),
91002
- thresholdBytes: usableMemoryBytes(mem) * MODEL_SIZE_WARN_FRACTION,
91003
- exceeds,
91004
- });
91005
- if (exceeds) {
91006
- setPendingModel(model);
91007
- return;
91008
- }
91009
- startDownloadNow(modelId);
91010
- };
91011
- const confirmPendingDownload = () => {
91012
- if (pendingModel) {
91013
- startDownloadNow(pendingModel.id);
91014
- }
91015
- setPendingModel(null);
91016
- };
91017
- const handleSelectModel = (modelId) => {
91018
- var _a, _b;
91019
- setSelectedModelId(modelId);
91020
- setLocalLLMModel(modelId);
91021
- // Persist the model's tool-calling support so the host can route chat to the
91022
- // MCP/tool proxy (:8000) vs plain Ollama (:11434).
91023
- setLocalLLMToolSupport((_b = (_a = LOCAL_MODELS.find((m) => m.id === modelId)) === null || _a === void 0 ? void 0 : _a.tool_support) !== null && _b !== void 0 ? _b : false);
91024
- };
91025
90992
  // For Ollama the switch reflects the user's toggle preference (always
91026
90993
  // operable, so it can be turned off). Foundry additionally requires a
91027
90994
  // downloaded model to be considered "on".
@@ -91035,54 +91002,16 @@ function LocalLLMTab({ isAvailable, state, ollamaStatus, systemMemory, isUsingFo
91035
91002
  const switchDisabled = isUsingFoundry
91036
91003
  ? !hasDownloadedFoundryModel || isDownloading || state.status === 'checking'
91037
91004
  : isDownloading || isManagerInstalling || state.status === 'checking';
91038
- return (jsxs("div", { className: "space-y-6", children: [jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between rounded-lg border px-6 py-4", 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('localLlmLocalLlmTab.enableLocalLlm') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('localLlmLocalLlmTab.moreInfoAriaLabel'), 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 max-w-xs text-white shadow-sm transition-opacity duration-300 z-50", children: jsxs("div", { className: "space-y-2", children: [jsx("p", { children: t('localLlmLocalLlmTab.tooltipWorkOffline') }), (foundryStatus === null || foundryStatus === void 0 ? void 0 : foundryStatus.is_supported) && (jsx("p", { className: "text-xs text-gray-300", children: t('localLlmLocalLlmTab.tooltipFoundrySupported') }))] }) })] }) })] }), jsxs("div", { className: "flex items-center gap-2", children: [isManagerInstalling && !isUsingFoundry && (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500", "aria-label": t('localLlmLocalLlmTab.startingModelManagerAriaLabel') })), jsx(Switch, { checked: switchChecked, onCheckedChange: handleToggle, disabled: switchDisabled, "aria-label": t('localLlmLocalLlmTab.switchAriaLabel', {
91039
- state: switchChecked
91040
- ? t('localLlmLocalLlmTab.switchStateEnabled')
91041
- : t('localLlmLocalLlmTab.switchStateDisabled'),
91042
- }), className: "cursor-pointer data-[state=checked]:bg-blue-500" })] })] }), shouldShowFoundryInstall ? (jsx("div", { className: "rounded-lg border px-6 py-4 bg-blue-50/30 dark:bg-blue-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "flex items-start gap-3", children: jsxs("div", { className: "flex items-center gap-2 flex-shrink-0 mt-0.5", children: [jsx(Star$1, { className: "h-5 w-5 text-blue-600 fill-blue-600" }), jsx("span", { className: "px-2 py-0.5 text-xs font-semibold bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300 rounded-full", children: t('localLlmLocalLlmTab.preferredBadge') })] }) }), jsxs("div", { className: "flex items-start gap-3", children: [jsx(Info$3, { className: "h-5 w-5 text-blue-500 flex-shrink-0 mt-0.5" }), jsxs("div", { className: "flex-1", children: [jsx("h3", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.settingUpOfflineAi') }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: t('localLlmLocalLlmTab.foundryInstallDescription') })] })] }), state.status === 'downloading' || state.status === 'checking' ? (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: state.message || t('localLlmLocalLlmTab.preparingDownload') })] }), state.progress > 0 && jsx(Progress, { value: state.progress, className: "h-2" })] })) : state.status === 'error' ? (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2 text-red-600 dark:text-red-400", children: [jsx(CircleX, { className: "h-4 w-4" }), jsx("span", { className: "text-sm", children: state.error || t('localLlmLocalLlmTab.downloadFailed') })] }), jsx("div", { className: "flex gap-2", children: jsxs(Button$1, { onClick: onInstallFoundry, size: "sm", variant: "outline", children: [jsx(RefreshCw, { className: "h-4 w-4 mr-2" }), t('localLlmLocalLlmTab.tryAgain')] }) })] })) : (jsx("div", { className: "space-y-2", children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: t('localLlmLocalLlmTab.startingDownload') })] }) })), jsxs("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: [jsx("p", { className: "font-medium mb-1", children: t('localLlmLocalLlmTab.downloadSize') }), jsx("p", { children: t('localLlmLocalLlmTab.oneTimeSetup') })] })] }) })) : /* Requirements Table - Hidden when using Foundry Local */ !isUsingFoundry ? (jsxs(Fragment$1, { children: [(foundryStatus === null || foundryStatus === void 0 ? void 0 : foundryStatus.is_supported) && (jsx("div", { className: "rounded-lg border px-4 py-3 bg-blue-50/20 dark:bg-blue-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "flex items-start gap-2", children: [jsx(Info$3, { className: "h-4 w-4 text-blue-600 flex-shrink-0 mt-0.5" }), jsxs("div", { className: "text-xs text-gray-600 dark:text-gray-400", children: [jsx("span", { className: "font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.noteLabel') }), ' ', t('localLlmLocalLlmTab.foundryAlternativeNote')] })] }) })), localModelsEnabled && (jsxs("div", { className: "rounded-lg border px-6 py-4", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx(Server, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" }), jsxs("div", { children: [jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.modelManagerName') }), jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: t('localLlmLocalLlmTab.modelManagerDescription') })] })] }), jsx("div", { className: "flex items-center gap-2", children: managerRunning ? (jsxs(Fragment$1, { children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300 rounded-full", children: [jsx(CircleCheckBig, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.running')] }), jsx(Button$1, { onClick: onCheckStatus, variant: "ghost", size: "sm", "aria-label": t('localLlmLocalLlmTab.refreshManagerStatusAriaLabel'), children: jsx(RefreshCw, { className: "h-4 w-4" }) })] })) : (jsxs(Fragment$1, { children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 rounded-full", children: [jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), t('localLlmLocalLlmTab.starting')] }), jsx(Button$1, { onClick: onCheckStatus, variant: "ghost", size: "sm", "aria-label": t('localLlmLocalLlmTab.refreshManagerStatusAriaLabel'), children: jsx(RefreshCw, { className: "h-4 w-4" }) })] })) })] }), isManagerInstalling && (jsx("div", { className: "mt-3 w-full max-w-[240px]", children: jsx(Progress, { value: state.managerInstallProgress || 0, className: "h-1.5" }) }))] })), localModelsEnabled && (jsxs("div", { className: "rounded-lg border overflow-hidden", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("table", { className: "w-full", children: [jsx("thead", { children: jsxs("tr", { className: "bg-gray-50 dark:bg-gray-800/50", children: [jsx("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider w-12", children: t('localLlmLocalLlmTab.tableHeaderUse') }), jsx("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: t('localLlmLocalLlmTab.tableHeaderModel') }), jsx("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: t('localLlmLocalLlmTab.tableHeaderStatus') }), jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: t('localLlmLocalLlmTab.tableHeaderAction') })] }) }), jsx("tbody", { className: "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-800", children: LOCAL_MODELS.map((model) => {
91043
- const isPrimary = model.id === PRIMARY_MODEL_ID;
91044
- const isActive = activeModelId === model.id;
91045
- // Cloud-hosted models are always available — they run on
91046
- // Ollama's cloud, so there's nothing to download.
91047
- const isCloud = isCloudModelId(model.id);
91048
- // A model is ready once Ollama reports its tag as installed.
91049
- // Fall back to (a) this row's own download having just
91050
- // completed — so it flips to "Ready" before the status
91051
- // refresh lands — and (b) the primary-model status flag.
91052
- // Cloud models are ready by default.
91053
- const isInstalled = isCloud ||
91054
- isModelInstalled(model.id, ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installed_models) ||
91055
- (isActive && state.status === 'completed') ||
91056
- (isPrimary && (ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.model_installed) === true);
91057
- // An installed model must never render a download/cancel
91058
- // state — guards against a stale persisted "downloading"
91059
- // status making an already-ready model look like it's
91060
- // still downloading (and wrongly cancellable) on reopen.
91061
- const rowDownloading = isActive && isDownloading && !isInstalled;
91062
- const rowChecking = isActive && state.status === 'checking';
91063
- const rowError = isActive && state.status === 'error';
91064
- const rowCancelled = isActive && state.status === 'cancelled';
91065
- const canDownload = !!(ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installed) &&
91066
- !isInstalled &&
91067
- !rowDownloading &&
91068
- !rowChecking;
91069
- const isSelected = selectedModelId === model.id;
91070
- return (jsxs("tr", { className: isSelected ? 'bg-blue-50/40 dark:bg-blue-950/20' : undefined, children: [jsx("td", { className: "px-6 py-4", children: jsx("input", { type: "radio", name: "local-llm-model", checked: isSelected, disabled: !isInstalled, onChange: () => handleSelectModel(model.id), "aria-label": t('localLlmLocalLlmTab.useModelForChatAriaLabel', {
91071
- name: model.name,
91072
- }), title: isInstalled
91073
- ? undefined
91074
- : t('localLlmLocalLlmTab.downloadToChatTitle'), className: isInstalled
91075
- ? 'h-4 w-4 cursor-pointer accent-blue-500'
91076
- : 'h-4 w-4 cursor-not-allowed opacity-40' }) }), jsxs("td", { className: "px-6 py-4 whitespace-nowrap", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: model.name }), jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500", children: model.size })] }), jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: model.provider })] }), jsx("td", { className: "px-6 py-4", children: jsx("div", { className: "space-y-2", children: isCloud ? (jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300 rounded-full", children: [jsx(Cloud, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.cloud')] })) : rowDownloading ? (jsxs("div", { className: "space-y-2", children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 rounded-full", children: [jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), Math.round(state.progress), "%"] }), jsx("div", { className: "w-full max-w-[200px]", children: jsx(Progress, { value: state.progress, className: "h-1.5" }) })] })) : rowChecking ? (jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300 rounded-full", children: [jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), t('localLlmLocalLlmTab.checking')] })) : isInstalled ? (jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300 rounded-full", children: [jsx(CircleCheckBig, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.ready')] })) : rowError ? (jsxs("div", { className: "space-y-1", children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300 rounded-full", children: [jsx(CircleX, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.error')] }), state.error && (jsx("p", { className: "text-xs text-red-600 dark:text-red-400 max-w-[200px]", children: state.error }))] })) : rowCancelled ? (jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300 rounded-full", children: [jsx(X$1, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.cancelled')] })) : (jsx("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300 rounded-full", children: t('localLlmLocalLlmTab.notDownloaded') })) }) }), jsx("td", { className: "px-6 py-4 text-right", children: jsxs("div", { className: "flex items-center justify-end gap-2", children: [rowDownloading && (jsxs(Button$1, { onClick: onCancelDownload, variant: "outline", size: "sm", children: [jsx(X$1, { className: "h-4 w-4 mr-2" }), t('localLlmLocalLlmTab.cancel')] })), canDownload && (jsxs(Button$1, { onClick: () => handleDownloadModel(model.id), size: "sm", variant: "outline", children: [jsx(Download, { className: "h-4 w-4 mr-2" }), t('localLlmLocalLlmTab.download')] })), rowError && (jsx(Button$1, { onClick: onResetState, variant: "ghost", size: "sm", children: t('localLlmLocalLlmTab.reset') })), isInstalled && !isCloud && (jsx(Button$1, { onClick: onCheckStatus, variant: "ghost", size: "sm", children: jsx(RefreshCw, { className: "h-4 w-4" }) }))] }) })] }, model.id));
91077
- }) })] }), jsx("div", { className: "px-6 py-3 border-t text-xs text-gray-500 dark:text-gray-400", style: { borderColor: 'oklch(.922 0 0)' }, children: selectedModelReady ? (jsxs(Fragment$1, { children: [t('localLlmLocalLlmTab.chattingWith'), ' ', jsx("span", { className: "font-medium text-gray-900 dark:text-gray-100", children: (_c = (_b = LOCAL_MODELS.find((m) => m.id === selectedModelId)) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : selectedModelId })] })) : (jsx(Fragment$1, { children: t('localLlmLocalLlmTab.noModelSelectedHint') })) })] }))] })) : (jsx("div", { className: "rounded-lg border px-6 py-4 bg-green-50/30 dark:bg-green-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "flex items-center justify-between", children: jsxs("div", { className: "flex items-center gap-3", children: [jsx(CircleCheckBig, { className: "h-8 w-8 text-green-500 flex-shrink-0" }), jsxs("div", { className: "flex-1", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("h3", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.offlineAiReady') }), jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300 rounded-full", children: [jsx(Star$1, { className: "h-3 w-3 fill-blue-700 dark:fill-blue-300" }), t('localLlmLocalLlmTab.preferredBadge')] })] }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: t('localLlmLocalLlmTab.foundryReadyDescription') })] })] }) }), foundryModels.length > 0 && (jsxs("div", { className: "space-y-2", children: [jsx("label", { className: "text-xs font-medium text-gray-700 dark:text-gray-300", children: t('localLlmLocalLlmTab.selectModelLabel') }), jsxs(Select$1, { value: selectedFoundryModel || ((_d = foundryModels[0]) === null || _d === void 0 ? void 0 : _d.id), onValueChange: (value) => onSelectFoundryModel === null || onSelectFoundryModel === void 0 ? void 0 : onSelectFoundryModel(value), children: [jsx(SelectTrigger, { className: "w-full bg-gray-50 border-gray-200 dark:bg-gray-800 dark:border-gray-700", children: jsx(SelectValue, { placeholder: t('localLlmLocalLlmTab.selectModelPlaceholder') }) }), jsx(SelectContent, { children: foundryModels.map((model) => (jsx(SelectItem, { value: model.id, children: jsxs("div", { className: "flex items-center justify-between w-full gap-4", children: [jsx("span", { className: "font-medium", children: model.name || model.id }), jsxs("div", { className: "flex items-center gap-2 text-xs text-gray-500", children: [model.device && (jsx("span", { className: "px-2 py-0.5 bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 rounded", children: model.device })), model.size && jsx("span", { children: model.size }), !model.is_downloaded && (jsx("span", { className: "px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300 rounded", children: t('localLlmLocalLlmTab.notDownloaded') })), model.is_downloaded && (jsx("span", { className: "px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded", children: t('localLlmLocalLlmTab.downloaded') }))] })] }) }, model.id))) })] }), jsxs("div", { className: "flex flex-col gap-1", children: [jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: t('localLlmLocalLlmTab.modelsAvailable', { count: foundryModels.length }) }), selectedFoundryModel && (jsxs("div", { className: "flex items-center gap-1.5 text-xs text-green-600 dark:text-green-400", children: [jsx(CircleCheckBig, { className: "h-3.5 w-3.5" }), jsxs("span", { children: [t('localLlmLocalLlmTab.usingModelPrefix'), ' ', ((_e = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _e === void 0 ? void 0 : _e.name) ||
91078
- selectedFoundryModel, ((_f = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _f === void 0 ? void 0 : _f.device) && (jsxs("span", { className: "ml-1 text-gray-500 dark:text-gray-400", children: ["(", (_g = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _g === void 0 ? void 0 : _g.device, ")"] }))] })] }))] })] })), state.status === 'downloading' && (jsxs("div", { className: "mt-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("div", { className: "animate-spin h-5 w-5 border-2 border-blue-600 dark:border-blue-400 border-t-transparent rounded-full" }), jsxs("div", { className: "flex-1", children: [jsx("p", { className: "text-sm font-medium text-blue-900 dark:text-blue-100", children: state.message }), state.progress > 0 && (jsx("div", { className: "mt-2 w-full bg-blue-200 dark:bg-blue-800 rounded-full h-2", children: jsx("div", { className: "bg-blue-600 dark:bg-blue-400 h-2 rounded-full transition-all duration-300", style: { width: `${state.progress}%` } }) }))] })] }), state.logs.length > 0 && (jsx("div", { className: "mt-3 max-h-32 overflow-y-auto bg-white dark:bg-gray-800 rounded border border-blue-200 dark:border-blue-700 p-2", children: state.logs.slice(-10).map((log, idx) => (jsx("div", { className: `text-xs font-mono ${log.level === 'error'
91079
- ? 'text-red-600 dark:text-red-400'
91080
- : log.level === 'warn'
91081
- ? 'text-yellow-600 dark:text-yellow-400'
91082
- : 'text-gray-700 dark:text-gray-300'}`, children: log.message }, idx))) }))] }))] }) }))] }), jsx(AlertDialog, { open: !!pendingModel, onOpenChange: (open) => {
91083
- if (!open)
91084
- setPendingModel(null);
91085
- }, children: jsxs(AlertDialogContent, { children: [jsxs(AlertDialogHeader, { children: [jsx(AlertDialogTitle, { children: "This model may be too large for your system" }), jsxs(AlertDialogDescription, { children: [pendingModel === null || pendingModel === void 0 ? void 0 : pendingModel.name, " needs about ", pendingModel === null || pendingModel === void 0 ? void 0 : pendingModel.size, ", but your system has", ' ', formatBytes(usableMemoryBytes(systemMemory)), " of memory available to run it. It may run very slowly or fail to load. Download anyway?"] })] }), jsxs(AlertDialogFooter, { children: [jsx(AlertDialogCancel, { onClick: () => setPendingModel(null), children: "Cancel" }), jsx(AlertDialogAction, { onClick: confirmPendingDownload, children: "Download anyway" })] })] }) })] }));
91005
+ return (jsx("div", { className: "space-y-6", children: jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between rounded-lg border px-6 py-4", 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('localLlmLocalLlmTab.enableLocalLlm') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('localLlmLocalLlmTab.moreInfoAriaLabel'), 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 max-w-xs text-white shadow-sm transition-opacity duration-300 z-50", children: jsxs("div", { className: "space-y-2", children: [jsx("p", { children: t('localLlmLocalLlmTab.tooltipWorkOffline') }), (foundryStatus === null || foundryStatus === void 0 ? void 0 : foundryStatus.is_supported) && (jsx("p", { className: "text-xs text-gray-300", children: t('localLlmLocalLlmTab.tooltipFoundrySupported') }))] }) })] }) })] }), jsxs("div", { className: "flex items-center gap-2", children: [isManagerInstalling && !isUsingFoundry && (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500", "aria-label": t('localLlmLocalLlmTab.startingModelManagerAriaLabel') })), jsx(Switch, { checked: switchChecked, onCheckedChange: handleToggle, disabled: switchDisabled, "aria-label": t('localLlmLocalLlmTab.switchAriaLabel', {
91006
+ state: switchChecked
91007
+ ? t('localLlmLocalLlmTab.switchStateEnabled')
91008
+ : t('localLlmLocalLlmTab.switchStateDisabled'),
91009
+ }), className: "cursor-pointer data-[state=checked]:bg-blue-500" })] })] }), shouldShowFoundryInstall ? (jsx("div", { className: "rounded-lg border px-6 py-4 bg-blue-50/30 dark:bg-blue-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "flex items-start gap-3", children: jsxs("div", { className: "flex items-center gap-2 flex-shrink-0 mt-0.5", children: [jsx(Star$1, { className: "h-5 w-5 text-blue-600 fill-blue-600" }), jsx("span", { className: "px-2 py-0.5 text-xs font-semibold bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300 rounded-full", children: t('localLlmLocalLlmTab.preferredBadge') })] }) }), jsxs("div", { className: "flex items-start gap-3", children: [jsx(Info$3, { className: "h-5 w-5 text-blue-500 flex-shrink-0 mt-0.5" }), jsxs("div", { className: "flex-1", children: [jsx("h3", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.settingUpOfflineAi') }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: t('localLlmLocalLlmTab.foundryInstallDescription') })] })] }), state.status === 'downloading' || state.status === 'checking' ? (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: state.message || t('localLlmLocalLlmTab.preparingDownload') })] }), state.progress > 0 && jsx(Progress, { value: state.progress, className: "h-2" })] })) : state.status === 'error' ? (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2 text-red-600 dark:text-red-400", children: [jsx(CircleX, { className: "h-4 w-4" }), jsx("span", { className: "text-sm", children: state.error || t('localLlmLocalLlmTab.downloadFailed') })] }), jsx("div", { className: "flex gap-2", children: jsxs(Button$1, { onClick: onInstallFoundry, size: "sm", variant: "outline", children: [jsx(RefreshCw, { className: "h-4 w-4 mr-2" }), t('localLlmLocalLlmTab.tryAgain')] }) })] })) : (jsx("div", { className: "space-y-2", children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: t('localLlmLocalLlmTab.startingDownload') })] }) })), jsxs("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: [jsx("p", { className: "font-medium mb-1", children: t('localLlmLocalLlmTab.downloadSize') }), jsx("p", { children: t('localLlmLocalLlmTab.oneTimeSetup') })] })] }) })) : /* Requirements Table - Hidden when using Foundry Local */ !isUsingFoundry ? (jsxs(Fragment$1, { children: [(foundryStatus === null || foundryStatus === void 0 ? void 0 : foundryStatus.is_supported) && (jsx("div", { className: "rounded-lg border px-4 py-3 bg-blue-50/20 dark:bg-blue-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "flex items-start gap-2", children: [jsx(Info$3, { className: "h-4 w-4 text-blue-600 flex-shrink-0 mt-0.5" }), jsxs("div", { className: "text-xs text-gray-600 dark:text-gray-400", children: [jsx("span", { className: "font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.noteLabel') }), ' ', t('localLlmLocalLlmTab.foundryAlternativeNote')] })] }) })), localModelsEnabled && (jsxs("div", { className: "rounded-lg border px-6 py-4", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx(Server, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" }), jsxs("div", { children: [jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.modelManagerName') }), jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: t('localLlmLocalLlmTab.modelManagerDescription') })] })] }), jsx("div", { className: "flex items-center gap-2", children: managerRunning ? (jsxs(Fragment$1, { children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300 rounded-full", children: [jsx(CircleCheckBig, { className: "h-3 w-3" }), t('localLlmLocalLlmTab.running')] }), jsx(Button$1, { onClick: onCheckStatus, variant: "ghost", size: "sm", "aria-label": t('localLlmLocalLlmTab.refreshManagerStatusAriaLabel'), children: jsx(RefreshCw, { className: "h-4 w-4" }) })] })) : (jsxs(Fragment$1, { children: [jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 rounded-full", children: [jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), t('localLlmLocalLlmTab.starting')] }), jsx(Button$1, { onClick: onCheckStatus, variant: "ghost", size: "sm", "aria-label": t('localLlmLocalLlmTab.refreshManagerStatusAriaLabel'), children: jsx(RefreshCw, { className: "h-4 w-4" }) })] })) })] }), isManagerInstalling && (jsx("div", { className: "mt-3 w-full max-w-[240px]", children: jsx(Progress, { value: state.managerInstallProgress || 0, className: "h-1.5" }) }))] }))] })) : (jsx("div", { className: "rounded-lg border px-6 py-4 bg-green-50/30 dark:bg-green-950/10", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "flex items-center justify-between", children: jsxs("div", { className: "flex items-center gap-3", children: [jsx(CircleCheckBig, { className: "h-8 w-8 text-green-500 flex-shrink-0" }), jsxs("div", { className: "flex-1", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("h3", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: t('localLlmLocalLlmTab.offlineAiReady') }), jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300 rounded-full", children: [jsx(Star$1, { className: "h-3 w-3 fill-blue-700 dark:fill-blue-300" }), t('localLlmLocalLlmTab.preferredBadge')] })] }), jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: t('localLlmLocalLlmTab.foundryReadyDescription') })] })] }) }), foundryModels.length > 0 && (jsxs("div", { className: "space-y-2", children: [jsx("label", { className: "text-xs font-medium text-gray-700 dark:text-gray-300", children: t('localLlmLocalLlmTab.selectModelLabel') }), jsxs(Select$1, { value: selectedFoundryModel || ((_b = foundryModels[0]) === null || _b === void 0 ? void 0 : _b.id), onValueChange: (value) => onSelectFoundryModel === null || onSelectFoundryModel === void 0 ? void 0 : onSelectFoundryModel(value), children: [jsx(SelectTrigger, { className: "w-full bg-gray-50 border-gray-200 dark:bg-gray-800 dark:border-gray-700", children: jsx(SelectValue, { placeholder: t('localLlmLocalLlmTab.selectModelPlaceholder') }) }), jsx(SelectContent, { children: foundryModels.map((model) => (jsx(SelectItem, { value: model.id, children: jsxs("div", { className: "flex items-center justify-between w-full gap-4", children: [jsx("span", { className: "font-medium", children: model.name || model.id }), jsxs("div", { className: "flex items-center gap-2 text-xs text-gray-500", children: [model.device && (jsx("span", { className: "px-2 py-0.5 bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 rounded", children: model.device })), model.size && jsx("span", { children: model.size }), !model.is_downloaded && (jsx("span", { className: "px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300 rounded", children: t('localLlmLocalLlmTab.notDownloaded') })), model.is_downloaded && (jsx("span", { className: "px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded", children: t('localLlmLocalLlmTab.downloaded') }))] })] }) }, model.id))) })] }), jsxs("div", { className: "flex flex-col gap-1", children: [jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: t('localLlmLocalLlmTab.modelsAvailable', { count: foundryModels.length }) }), selectedFoundryModel && (jsxs("div", { className: "flex items-center gap-1.5 text-xs text-green-600 dark:text-green-400", children: [jsx(CircleCheckBig, { className: "h-3.5 w-3.5" }), jsxs("span", { children: [t('localLlmLocalLlmTab.usingModelPrefix'), ' ', ((_c = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _c === void 0 ? void 0 : _c.name) ||
91010
+ selectedFoundryModel, ((_d = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _d === void 0 ? void 0 : _d.device) && (jsxs("span", { className: "ml-1 text-gray-500 dark:text-gray-400", children: ["(", (_e = foundryModels.find((m) => m.id === selectedFoundryModel)) === null || _e === void 0 ? void 0 : _e.device, ")"] }))] })] }))] })] })), state.status === 'downloading' && (jsxs("div", { className: "mt-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("div", { className: "animate-spin h-5 w-5 border-2 border-blue-600 dark:border-blue-400 border-t-transparent rounded-full" }), jsxs("div", { className: "flex-1", children: [jsx("p", { className: "text-sm font-medium text-blue-900 dark:text-blue-100", children: state.message }), state.progress > 0 && (jsx("div", { className: "mt-2 w-full bg-blue-200 dark:bg-blue-800 rounded-full h-2", children: jsx("div", { className: "bg-blue-600 dark:bg-blue-400 h-2 rounded-full transition-all duration-300", style: { width: `${state.progress}%` } }) }))] })] }), state.logs.length > 0 && (jsx("div", { className: "mt-3 max-h-32 overflow-y-auto bg-white dark:bg-gray-800 rounded border border-blue-200 dark:border-blue-700 p-2", children: state.logs.slice(-10).map((log, idx) => (jsx("div", { className: `text-xs font-mono ${log.level === 'error'
91011
+ ? 'text-red-600 dark:text-red-400'
91012
+ : log.level === 'warn'
91013
+ ? 'text-yellow-600 dark:text-yellow-400'
91014
+ : 'text-gray-700 dark:text-gray-300'}`, children: log.message }, idx))) }))] }))] }) }))] }) }));
91086
91015
  }
91087
91016
 
91088
91017
  function LocalModelsContent(props) {
@@ -91093,195 +91022,6 @@ function LocalModelsContent(props) {
91093
91022
  return (jsxs("div", { className: "rounded-lg px-6 py-5 border border-gray-200 dark:border-gray-700", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: "Local Models" }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": "More info about Local Models", 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 max-w-xs text-white shadow-sm transition-opacity duration-300 z-50", children: jsx("p", { children: "Manage on-device AI models for offline use." }) })] }) })] }), jsx("button", { type: "button", onClick: () => setIsCollapsed((previous) => !previous), className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1", "aria-label": isCollapsed ? 'Expand Local Models' : 'Collapse Local Models', children: isCollapsed ? (jsx(ChevronDown, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" })) : (jsx(ChevronUp, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" })) })] }), !isCollapsed && (jsx("div", { className: "mt-4", children: jsx(LocalLLMTab, { ...props }) }))] }));
91094
91023
  }
91095
91024
 
91096
- const SYSTEM_CONTROL_ENABLED_KEY = 'ibl_system_control_enabled';
91097
- /**
91098
- * Whether the Computer Assistant is enabled, read from localStorage. This is a
91099
- * user preference (mirrors {@link isLocalLLMEnabled}); it reflects the toggle the
91100
- * user last chose, independent of whether the helper is installed yet.
91101
- */
91102
- function isSystemControlEnabled() {
91103
- if (typeof window === 'undefined')
91104
- return false;
91105
- return localStorage.getItem(SYSTEM_CONTROL_ENABLED_KEY) === 'true';
91106
- }
91107
- /**
91108
- * Persist the Computer Assistant enabled preference to localStorage.
91109
- */
91110
- function setSystemControlEnabled(enabled) {
91111
- if (typeof window === 'undefined')
91112
- return;
91113
- localStorage.setItem(SYSTEM_CONTROL_ENABLED_KEY, String(enabled));
91114
- }
91115
- /** Green "done" pill. */
91116
- function DonePill({ children }) {
91117
- return (jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-100 px-2 py-0.5 text-xs font-medium text-green-800 dark:bg-green-900/30 dark:text-green-300", children: [jsx(Check, { className: "h-3 w-3" }), children] }));
91118
- }
91119
- /** Blue "in progress" pill. */
91120
- function WorkingPill({ children }) {
91121
- return (jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-xs font-medium text-blue-800 dark:bg-blue-900/30 dark:text-blue-300", children: [jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), children] }));
91122
- }
91123
- /** A single numbered step row. */
91124
- function Step$2({ number, done, title, description, action, }) {
91125
- return (jsxs("div", { className: "flex items-start justify-between gap-3", children: [jsxs("div", { className: "flex items-start gap-3", children: [jsx("span", { className: `flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full text-xs font-semibold ${done
91126
- ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300'
91127
- : 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400'}`, "aria-hidden": "true", children: done ? jsx(Check, { className: "h-3.5 w-3.5" }) : number }), jsxs("div", { children: [jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: title }), jsx("div", { className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400", children: description })] })] }), jsx("div", { className: "flex-shrink-0", children: action })] }));
91128
- }
91129
- /**
91130
- * Body of the "Computer Assistant" card: a plain-language on/off with two simple
91131
- * steps — set up, then allow control — so non-technical users can follow along.
91132
- * Mirrors the Local Models tab so the two cards behave the same.
91133
- */
91134
- function SystemControlTab({ isAvailable, state, status, requiredSizeGb = DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB, ollamaStatus, systemMemory, accessibilityPermission, onInstall, onStop, onCheckStatus, onResetState, onRequestAccessibilityPermission, onDownloadModel, }) {
91135
- const isInstalling = state.status === 'installing' || (status === null || status === void 0 ? void 0 : status.installing) === true;
91136
- // User preference — independent of whether the helper is installed. Always
91137
- // operable so the user can turn it off again.
91138
- const [isEnabled, setIsEnabled] = useState(() => isSystemControlEnabled());
91139
- // The currently-selected local model (persisted by the Local Models card).
91140
- // Polled so a selection change in the sibling card is reflected here without a
91141
- // remount. The assistant only works well with larger models, so it's gated to
91142
- // a selected model above the size threshold.
91143
- const [selectedModel, setSelectedModel] = useState(() => getLocalLLMModel());
91144
- // Whether "Local Models" is turned on. The assistant runs on a local model, so
91145
- // it's gated off until Local Models is enabled. Polled alongside the model so a
91146
- // toggle in the sibling card is reflected without a remount.
91147
- const [localModelsEnabled, setLocalModelsEnabled] = useState(() => isLocalLLMEnabled());
91148
- useEffect(() => {
91149
- const id = setInterval(() => {
91150
- setSelectedModel(getLocalLLMModel());
91151
- setLocalModelsEnabled(isLocalLLMEnabled());
91152
- }, 1500);
91153
- return () => clearInterval(id);
91154
- }, []);
91155
- const localModelsOff = !localModelsEnabled;
91156
- const modelTooSmall = !modelSupportsSystemControl(selectedModel, requiredSizeGb);
91157
- // "Upgrade" target: the smallest catalog model that clears the size gate.
91158
- const upgradeTarget = smallestSystemControlModel(requiredSizeGb);
91159
- // Set while an upgrade is downloading a model, before we auto-enable.
91160
- const [pendingEnableModelId, setPendingEnableModelId] = useState(null);
91161
- // Model awaiting a RAM/VRAM "may be too large" confirmation before download.
91162
- const [pendingCapacityModel, setPendingCapacityModel] = useState(null);
91163
- const isUpgrading = pendingEnableModelId !== null;
91164
- const managerRunning = (status === null || status === void 0 ? void 0 : status.running) === true;
91165
- // Steps are shown whenever the toggle is on (or mid-setup), so the user always
91166
- // gets feedback for their choice.
91167
- const managerEnabled = isEnabled || isInstalling;
91168
- // Permission is known (macOS + plugin wired) and granted.
91169
- const permissionKnown = typeof accessibilityPermission === 'boolean';
91170
- const permissionGranted = accessibilityPermission === true;
91171
- const allSet = managerRunning && (!permissionKnown || permissionGranted);
91172
- // Keep the app-facing preference flag in sync with the toggle.
91173
- useEffect(() => {
91174
- setSystemControlEnabled(isEnabled);
91175
- }, [isEnabled]);
91176
- // While enabled but not yet running, keep polling so the step flips to "Ready"
91177
- // as soon as the host reports the helper is up.
91178
- useEffect(() => {
91179
- if (!isEnabled || managerRunning)
91180
- return;
91181
- const id = setInterval(() => onCheckStatus(), 2500);
91182
- return () => clearInterval(id);
91183
- }, [isEnabled, managerRunning, onCheckStatus]);
91184
- // While permission isn't granted yet, keep re-checking (the grant happens in
91185
- // System Settings) so the step flips to "Allowed" on its own.
91186
- useEffect(() => {
91187
- if (accessibilityPermission !== false)
91188
- return;
91189
- const id = setInterval(() => onCheckStatus(), 2500);
91190
- return () => clearInterval(id);
91191
- }, [accessibilityPermission, onCheckStatus]);
91192
- // After an upgrade kicks off a download, turn the assistant on once the model
91193
- // finishes downloading (it shows up in the installed list).
91194
- useEffect(() => {
91195
- if (!pendingEnableModelId)
91196
- return;
91197
- if (isModelInstalled(pendingEnableModelId, ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installed_models)) {
91198
- setPendingEnableModelId(null);
91199
- setIsEnabled(true);
91200
- onInstall();
91201
- }
91202
- }, [pendingEnableModelId, ollamaStatus, onInstall]);
91203
- if (!isAvailable) {
91204
- return (jsx("div", { className: "text-sm text-gray-500 dark:text-gray-400", children: "The Computer Assistant is only available in the desktop app." }));
91205
- }
91206
- const handleToggle = (checked) => {
91207
- // Guard: needs Local Models on and a large-enough model.
91208
- if (checked && (localModelsOff || modelTooSmall))
91209
- return;
91210
- setIsEnabled(checked);
91211
- if (checked) {
91212
- if (!isInstalling)
91213
- onInstall();
91214
- }
91215
- else {
91216
- onStop === null || onStop === void 0 ? void 0 : onStop();
91217
- }
91218
- };
91219
- // Upgrade = switch to the smallest usable model: select it, then (if it isn't
91220
- // already downloaded) download it and auto-enable the assistant once it's
91221
- // ready. The RAM/VRAM check is preserved via the confirm below.
91222
- const runUpgrade = (model) => {
91223
- setLocalLLMModel(model.id);
91224
- setLocalLLMToolSupport(model.tool_support);
91225
- setLocalLLMEnabled(true);
91226
- setSelectedModel(model.id); // recompute the size gate immediately
91227
- if (isModelInstalled(model.id, ollamaStatus === null || ollamaStatus === void 0 ? void 0 : ollamaStatus.installed_models)) {
91228
- // Already downloaded → enable now.
91229
- setIsEnabled(true);
91230
- if (!isInstalling)
91231
- onInstall();
91232
- }
91233
- else {
91234
- // Not downloaded → download, then auto-enable when it lands (effect above).
91235
- setPendingEnableModelId(model.id);
91236
- onDownloadModel === null || onDownloadModel === void 0 ? void 0 : onDownloadModel(model.id);
91237
- }
91238
- };
91239
- const handleUpgrade = () => {
91240
- if (!upgradeTarget)
91241
- return;
91242
- // Keep the RAM/VRAM check: confirm before pulling a model that may not fit.
91243
- if (modelExceedsCapacity(upgradeTarget, systemMemory)) {
91244
- setPendingCapacityModel(upgradeTarget);
91245
- return;
91246
- }
91247
- runUpgrade(upgradeTarget);
91248
- };
91249
- const switchChecked = isEnabled;
91250
- const switchDisabled = isInstalling ||
91251
- state.status === 'checking' ||
91252
- ((localModelsOff || modelTooSmall) && !isEnabled);
91253
- return (jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border px-6 py-4", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { children: [jsx("div", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: "Let your assistant control this computer" }), jsx("div", { className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400", children: "It can click, type, and open apps to do tasks for you. You stay in control and can turn this off anytime." })] }), jsxs("div", { className: "flex flex-shrink-0 items-center gap-2", children: [isInstalling && (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500", "aria-label": "Setting up" })), jsx(Switch, { checked: switchChecked, onCheckedChange: handleToggle, disabled: switchDisabled, "aria-label": "Let your assistant control this computer", className: "cursor-pointer data-[state=checked]:bg-blue-500" })] })] }), localModelsOff && (jsxs("div", { className: "flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 dark:border-amber-900/40 dark:bg-amber-900/10", children: [jsx(Info$3, { className: "mt-0.5 h-4 w-4 flex-shrink-0 text-amber-600", "aria-hidden": "true" }), jsx("p", { className: "text-xs text-amber-800 dark:text-amber-300", children: "Turn on \u201CLocal Models\u201D above first \u2014 the Computer Assistant uses a local AI model to do its work." })] })), !localModelsOff && modelTooSmall && (jsxs("div", { className: "flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 dark:border-amber-900/40 dark:bg-amber-900/10", children: [jsx(Info$3, { className: "mt-0.5 h-4 w-4 flex-shrink-0 text-amber-600", "aria-hidden": "true" }), jsxs("div", { className: "flex-1", children: [jsxs("p", { className: "text-xs text-amber-800 dark:text-amber-300", children: ["Your current AI model is too small for this.", ' ', upgradeTarget && onDownloadModel
91254
- ? `Upgrade to ${upgradeTarget.name} (${upgradeTarget.size}) to use it.`
91255
- : 'Pick a larger one under “Local Models” above, then come back.'] }), upgradeTarget && onDownloadModel && (jsx(Button$1, { onClick: handleUpgrade, size: "sm", className: "mt-2", disabled: isUpgrading, "aria-label": `Upgrade to ${upgradeTarget.name}`, children: isUpgrading ? (jsxs(Fragment$1, { children: [jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), "Upgrading\u2026"] })) : (jsxs(Fragment$1, { children: [jsx(CircleArrowUp, { className: "mr-2 h-4 w-4" }), "Upgrade to ", upgradeTarget.name] })) }))] })] })), isUpgrading && !modelTooSmall && (jsxs("div", { className: "flex items-start gap-2 rounded-lg border px-4 py-3", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(LoaderCircle, { className: "mt-0.5 h-4 w-4 flex-shrink-0 animate-spin text-blue-500", "aria-hidden": "true" }), jsx("p", { className: "text-xs text-gray-600 dark:text-gray-300", children: "Downloading your new model\u2026 it\u2019ll turn on automatically when it\u2019s ready. You can watch progress under \u201CLocal Models\u201D above." })] })), managerEnabled && (jsxs("div", { className: "space-y-4 rounded-lg border px-6 py-5", style: { borderColor: 'oklch(.922 0 0)' }, children: [allSet ? (jsxs("div", { className: "flex items-start gap-2", children: [jsx(Check, { className: "mt-0.5 h-4 w-4 flex-shrink-0 text-green-600", "aria-hidden": "true" }), jsx("p", { className: "text-sm text-gray-700 dark:text-gray-300", children: "You\u2019re all set \u2014 your assistant can now help out on this computer." })] })) : (jsx("div", { className: "text-xs font-medium uppercase tracking-wide text-gray-400", children: "A couple of quick steps" })), jsx(Step$2, { number: 1, done: managerRunning, title: "Set up your assistant", description: "A quick, one-time setup so it can work on this computer.", action: managerRunning ? (jsx(DonePill, { children: "Ready" })) : (jsx(WorkingPill, { children: isInstalling ? 'Setting up…' : 'Starting…' })) }), (state.status === 'installing' || state.status === 'checking') && state.progress > 0 && (jsx(Progress, { value: state.progress, className: "h-1.5" })), permissionKnown && (jsx(Step$2, { number: 2, done: permissionGranted, title: "Allow it to control the computer", description: "Your Mac will ask you to confirm. This lets your assistant move the mouse and type for you.", action: permissionGranted ? (jsx(DonePill, { children: "Allowed" })) : onRequestAccessibilityPermission ? (jsx(Button$1, { onClick: onRequestAccessibilityPermission, size: "sm", "aria-label": "Allow your assistant to control the computer", children: "Allow" })) : (jsx("span", { className: "inline-flex items-center rounded-full bg-amber-100 px-2 py-0.5 text-xs font-medium text-amber-800 dark:bg-amber-900/30 dark:text-amber-300", children: "Needed" })) }))] })), state.status === 'error' && (jsxs("div", { className: "rounded-lg border border-red-200 bg-red-50 px-4 py-3 dark:border-red-900/40 dark:bg-red-900/10", children: [jsxs("div", { className: "flex items-center gap-2 text-sm text-red-700 dark:text-red-300", children: [jsx(CircleX, { className: "h-4 w-4 flex-shrink-0" }), jsx("span", { children: "Something went wrong while setting up. Please try again." })] }), jsxs(Button$1, { onClick: () => {
91256
- onResetState();
91257
- onInstall();
91258
- }, size: "sm", variant: "outline", className: "mt-3", children: [jsx(RefreshCw, { className: "mr-2 h-4 w-4" }), "Try again"] })] })), jsx(AlertDialog, { open: pendingCapacityModel !== null, onOpenChange: (open) => {
91259
- if (!open)
91260
- setPendingCapacityModel(null);
91261
- }, children: jsxs(AlertDialogContent, { children: [jsxs(AlertDialogHeader, { children: [jsx(AlertDialogTitle, { children: "This model may be large for your computer" }), jsxs(AlertDialogDescription, { children: [pendingCapacityModel === null || pendingCapacityModel === void 0 ? void 0 : pendingCapacityModel.name, " (", pendingCapacityModel === null || pendingCapacityModel === void 0 ? void 0 : pendingCapacityModel.size, ") may be more than your computer\u2019s memory can handle, so it could run slowly or fail to load. Download and use it anyway?"] })] }), jsxs(AlertDialogFooter, { children: [jsx(AlertDialogCancel, { children: "Cancel" }), jsx(AlertDialogAction, { onClick: () => {
91262
- const model = pendingCapacityModel;
91263
- setPendingCapacityModel(null);
91264
- if (model)
91265
- runUpgrade(model);
91266
- }, children: "Download anyway" })] })] }) })] }));
91267
- }
91268
-
91269
- /**
91270
- * Collapsible "System Control" card for the UserProfile → Advanced section.
91271
- * Mirrors {@link LocalModelsContent}: a purely presentational, titled,
91272
- * collapsible container whose body is the {@link SystemControlTab}. Availability
91273
- * and handlers are threaded in (see UserProfileDropdown, which falls back to
91274
- * {@link useGhostOs} when the host doesn't supply them). Renders nothing outside
91275
- * the desktop app.
91276
- */
91277
- function SystemControlContent(props) {
91278
- const [isCollapsed, setIsCollapsed] = useState(true);
91279
- if (!props.isAvailable) {
91280
- return null;
91281
- }
91282
- return (jsxs("div", { className: "rounded-lg px-6 py-5 border border-gray-200 dark:border-gray-700", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: "Computer Assistant" }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": "More info about the Computer Assistant", 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 max-w-xs text-white shadow-sm transition-opacity duration-300 z-50", children: jsx("p", { children: "Let your assistant do things on your computer \u2014 click, type, and open apps. You stay in control and can turn it off anytime." }) })] }) })] }), jsx("button", { type: "button", onClick: () => setIsCollapsed((previous) => !previous), className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1", "aria-label": isCollapsed ? 'Expand Computer Assistant' : 'Collapse Computer Assistant', children: isCollapsed ? (jsx(ChevronDown, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" })) : (jsx(ChevronUp, { className: "h-5 w-5 text-gray-400", "aria-hidden": "true" })) })] }), !isCollapsed && (jsx("div", { className: "mt-4", children: jsx(SystemControlTab, { ...props }) }))] }));
91283
- }
91284
-
91285
91025
  // src/primitive.tsx
91286
91026
  var NODES = [
91287
91027
  "a",
@@ -141863,6 +141603,26 @@ function ChatPrivacyTab({ org, username }) {
141863
141603
  }) })] }));
141864
141604
  }
141865
141605
 
141606
+ const COWORK_ENABLED_KEY = 'ibl_cowork_enabled';
141607
+ /**
141608
+ * Whether Cowork is enabled, read from localStorage. This is a user preference
141609
+ * (mirrors isLocalLLMEnabled); it reflects the toggle the user last chose,
141610
+ * independent of whether the assistant is installed yet.
141611
+ */
141612
+ function isCoworkEnabled() {
141613
+ if (typeof window === 'undefined')
141614
+ return false;
141615
+ return localStorage.getItem(COWORK_ENABLED_KEY) === 'true';
141616
+ }
141617
+ /**
141618
+ * Persist the Cowork enabled preference to localStorage.
141619
+ */
141620
+ function setCoworkEnabled(enabled) {
141621
+ if (typeof window === 'undefined')
141622
+ return;
141623
+ localStorage.setItem(COWORK_ENABLED_KEY, String(enabled));
141624
+ }
141625
+
141866
141626
  const renderLucideIcon = (Icon) => function RenderedIcon(props) {
141867
141627
  return jsx(Icon, { ...props });
141868
141628
  };
@@ -141889,7 +141649,7 @@ const TAB_DESC_PREVIEW_KEYS = {
141889
141649
  memory: 'descMemoryPreview',
141890
141650
  privacy: 'descPrivacyPreview',
141891
141651
  };
141892
- function Profile({ tenant, username, tenants, onClose, customization = {}, isAdmin = false, targetTab = 'basic', onAccountDeleted, enableMemoryTab = false, localLLMProps, systemControlProps, currentSPA = '', }) {
141652
+ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdmin = false, targetTab = 'basic', onAccountDeleted, enableMemoryTab = false, localLLMProps, currentSPA = '', }) {
141893
141653
  var _a, _b, _c, _d, _e, _f, _g, _h;
141894
141654
  const t = useT();
141895
141655
  const { data: memsearchStatus, isError: isMemsearchStatusError } = useGetMemsearchStatusQuery({ org: tenant, userId: username }, { skip: !enableMemoryTab });
@@ -141966,9 +141726,8 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
141966
141726
  ]
141967
141727
  : []),
141968
141728
  ];
141969
- // Add Advanced tab only when in Tauri app (Local Models or System Control is
141970
- // provided and available)
141971
- const isAdvancedAvailable = (localLLMProps === null || localLLMProps === void 0 ? void 0 : localLLMProps.isAvailable) === true || (systemControlProps === null || systemControlProps === void 0 ? void 0 : systemControlProps.isAvailable) === true;
141729
+ // Add Advanced tab only when in Tauri app (Local Models is provided and available)
141730
+ const isAdvancedAvailable = (localLLMProps === null || localLLMProps === void 0 ? void 0 : localLLMProps.isAvailable) === true;
141972
141731
  const TABS = isAdvancedAvailable
141973
141732
  ? [
141974
141733
  ...baseTabs,
@@ -142134,7 +141893,7 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
142134
141893
  var _a;
142135
141894
  return (jsxs(Fragment$1, { children: [jsxs("div", { className: "relative mb-0", children: [jsx("div", { className: "absolute inset-y-0 left-4 flex items-center pointer-events-none", "aria-hidden": "true", children: jsx("div", { className: "bg-black text-white rounded w-8 h-8 flex items-center justify-center", children: jsx("span", { className: "font-bold text-sm", children: "X" }) }) }), jsx(Input, { id: "x", className: "w-full bg-gray-50 border-gray-200 focus:ring-blue-500 focus:border-blue-500 text-base py-3 pl-16 h-10", placeholder: t('profileIndex.placeholderX'), value: field.state.value, onChange: (e) => handleSocialLinkChange(e.target.value, field.handleChange, X_URL_PREFIX), disabled: socialForm.state.isSubmitting || isReadOnly })] }), jsx("p", { className: "text-red-500 dark:text-gray-400 text-sm", role: ((_a = field.state.meta.errors) === null || _a === void 0 ? void 0 : _a.length) ? 'alert' : undefined, "aria-live": "polite", children: field.state.meta.errors })] }));
142136
141895
  },
142137
- })] })] }) })), 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 }), !isReadOnly && activeTab === 'security' && (jsx(Security, { app: currentSPA || '', email: (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email) || '', platformKey: tenant, onAccountDeleted: onAccountDeleted })), activeTab === 'advanced' && (localLLMProps || systemControlProps) && (jsxs("div", { className: "space-y-6", children: [localLLMProps && (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 })), systemControlProps && (jsx(SystemControlContent, { isAvailable: systemControlProps.isAvailable, state: systemControlProps.state, status: systemControlProps.status, requiredSizeGb: systemControlProps.requiredSizeGb, ollamaStatus: systemControlProps.ollamaStatus, systemMemory: systemControlProps.systemMemory, accessibilityPermission: systemControlProps.accessibilityPermission, onInstall: systemControlProps.onInstall, onStop: systemControlProps.onStop, onCheckStatus: systemControlProps.onCheckStatus, onResetState: systemControlProps.onResetState, onRequestAccessibilityPermission: systemControlProps.onRequestAccessibilityPermission, onDownloadModel: systemControlProps.onDownloadModel }))] }))] }), !isReadOnly && ['basic', 'social'].includes(activeTab) && (jsx("div", { className: "flex-shrink-0 border-t border-gray-200 p-6 bg-white dark:bg-gray-900", children: jsxs("div", { className: "flex justify-end gap-3", children: [jsx(Button$1, { onClick: onClose, variant: "outline", children: t('profileIndex.buttonCancel') }), jsx(Button$1, { onClick: () => {
141896
+ })] })] }) })), 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 }), !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 }) }))] }), !isReadOnly && ['basic', 'social'].includes(activeTab) && (jsx("div", { className: "flex-shrink-0 border-t border-gray-200 p-6 bg-white dark:bg-gray-900", children: jsxs("div", { className: "flex justify-end gap-3", children: [jsx(Button$1, { onClick: onClose, variant: "outline", children: t('profileIndex.buttonCancel') }), jsx(Button$1, { onClick: () => {
142138
141897
  if (activeTab === 'basic') {
142139
141898
  basicForm.handleSubmit();
142140
141899
  }
@@ -143613,11 +143372,11 @@ var PopoverAnchor$1 = React.forwardRef(
143613
143372
  }
143614
143373
  );
143615
143374
  PopoverAnchor$1.displayName = ANCHOR_NAME$1;
143616
- var TRIGGER_NAME$2 = "PopoverTrigger";
143375
+ var TRIGGER_NAME$3 = "PopoverTrigger";
143617
143376
  var PopoverTrigger$1 = React.forwardRef(
143618
143377
  (props, forwardedRef) => {
143619
143378
  const { __scopePopover, ...triggerProps } = props;
143620
- const context = usePopoverContext(TRIGGER_NAME$2, __scopePopover);
143379
+ const context = usePopoverContext(TRIGGER_NAME$3, __scopePopover);
143621
143380
  const popperScope = usePopperScope$1(__scopePopover);
143622
143381
  const composedTriggerRef = useComposedRefs$1(forwardedRef, context.triggerRef);
143623
143382
  const trigger = /* @__PURE__ */ jsx(
@@ -143636,31 +143395,31 @@ var PopoverTrigger$1 = React.forwardRef(
143636
143395
  return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(Anchor$1, { asChild: true, ...popperScope, children: trigger });
143637
143396
  }
143638
143397
  );
143639
- PopoverTrigger$1.displayName = TRIGGER_NAME$2;
143640
- var PORTAL_NAME$2 = "PopoverPortal";
143641
- var [PortalProvider$1, usePortalContext$1] = createPopoverContext(PORTAL_NAME$2, {
143398
+ PopoverTrigger$1.displayName = TRIGGER_NAME$3;
143399
+ var PORTAL_NAME$3 = "PopoverPortal";
143400
+ var [PortalProvider$1, usePortalContext$1] = createPopoverContext(PORTAL_NAME$3, {
143642
143401
  forceMount: void 0
143643
143402
  });
143644
143403
  var PopoverPortal = (props) => {
143645
143404
  const { __scopePopover, forceMount, children, container } = props;
143646
- const context = usePopoverContext(PORTAL_NAME$2, __scopePopover);
143405
+ const context = usePopoverContext(PORTAL_NAME$3, __scopePopover);
143647
143406
  return /* @__PURE__ */ jsx(PortalProvider$1, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence$2, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Portal$6, { asChild: true, container, children }) }) });
143648
143407
  };
143649
- PopoverPortal.displayName = PORTAL_NAME$2;
143650
- var CONTENT_NAME$3 = "PopoverContent";
143408
+ PopoverPortal.displayName = PORTAL_NAME$3;
143409
+ var CONTENT_NAME$4 = "PopoverContent";
143651
143410
  var PopoverContent$1 = React.forwardRef(
143652
143411
  (props, forwardedRef) => {
143653
- const portalContext = usePortalContext$1(CONTENT_NAME$3, props.__scopePopover);
143412
+ const portalContext = usePortalContext$1(CONTENT_NAME$4, props.__scopePopover);
143654
143413
  const { forceMount = portalContext.forceMount, ...contentProps } = props;
143655
- const context = usePopoverContext(CONTENT_NAME$3, props.__scopePopover);
143414
+ const context = usePopoverContext(CONTENT_NAME$4, props.__scopePopover);
143656
143415
  return /* @__PURE__ */ jsx(Presence$2, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });
143657
143416
  }
143658
143417
  );
143659
- PopoverContent$1.displayName = CONTENT_NAME$3;
143418
+ PopoverContent$1.displayName = CONTENT_NAME$4;
143660
143419
  var Slot$1 = createSlot$1("PopoverContent.RemoveScroll");
143661
143420
  var PopoverContentModal = React.forwardRef(
143662
143421
  (props, forwardedRef) => {
143663
- const context = usePopoverContext(CONTENT_NAME$3, props.__scopePopover);
143422
+ const context = usePopoverContext(CONTENT_NAME$4, props.__scopePopover);
143664
143423
  const contentRef = React.useRef(null);
143665
143424
  const composedRefs = useComposedRefs$1(forwardedRef, contentRef);
143666
143425
  const isRightClickOutsideRef = React.useRef(false);
@@ -143700,7 +143459,7 @@ var PopoverContentModal = React.forwardRef(
143700
143459
  );
143701
143460
  var PopoverContentNonModal = React.forwardRef(
143702
143461
  (props, forwardedRef) => {
143703
- const context = usePopoverContext(CONTENT_NAME$3, props.__scopePopover);
143462
+ const context = usePopoverContext(CONTENT_NAME$4, props.__scopePopover);
143704
143463
  const hasInteractedOutsideRef = React.useRef(false);
143705
143464
  const hasPointerDownOutsideRef = React.useRef(false);
143706
143465
  return /* @__PURE__ */ jsx(
@@ -143752,7 +143511,7 @@ var PopoverContentImpl = React.forwardRef(
143752
143511
  onInteractOutside,
143753
143512
  ...contentProps
143754
143513
  } = props;
143755
- const context = usePopoverContext(CONTENT_NAME$3, __scopePopover);
143514
+ const context = usePopoverContext(CONTENT_NAME$4, __scopePopover);
143756
143515
  const popperScope = usePopperScope$1(__scopePopover);
143757
143516
  useFocusGuards();
143758
143517
  return /* @__PURE__ */ jsx(
@@ -143830,26 +143589,26 @@ PopoverArrow.displayName = ARROW_NAME$2;
143830
143589
  function getState$2(open) {
143831
143590
  return open ? "open" : "closed";
143832
143591
  }
143833
- var Root2$2 = Popover$1;
143592
+ var Root2$3 = Popover$1;
143834
143593
  var Anchor2$1 = PopoverAnchor$1;
143835
143594
  var Trigger$1 = PopoverTrigger$1;
143836
143595
  var Portal$1 = PopoverPortal;
143837
- var Content2$2 = PopoverContent$1;
143596
+ var Content2$3 = PopoverContent$1;
143838
143597
 
143839
- const Popover = Root2$2;
143598
+ const Popover = Root2$3;
143840
143599
  const PopoverTrigger = Trigger$1;
143841
143600
  const PopoverAnchor = Anchor2$1;
143842
143601
  const PopoverContent = React.forwardRef(({ className, align = 'center', sideOffset = 4, portalled = true, container, ...props }, ref) => {
143843
143602
  var _a;
143844
143603
  const portalContainer = useFloatingPortalContainer();
143845
143604
  const resolvedContainer = (_a = container !== null && container !== void 0 ? container : portalContainer) !== null && _a !== void 0 ? _a : undefined;
143846
- const content = (jsx(Content2$2, { ref: ref, "data-iblai-dialog-interaction-layer": true, align: align, sideOffset: sideOffset, className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none', className), ...props }));
143605
+ const content = (jsx(Content2$3, { ref: ref, "data-iblai-dialog-interaction-layer": true, align: align, sideOffset: sideOffset, className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none', className), ...props }));
143847
143606
  if (!portalled) {
143848
143607
  return content;
143849
143608
  }
143850
143609
  return jsx(Portal$1, { container: resolvedContainer, children: content });
143851
143610
  });
143852
- PopoverContent.displayName = Content2$2.displayName;
143611
+ PopoverContent.displayName = Content2$3.displayName;
143853
143612
 
143854
143613
  function UsersTab({ tenant, onInviteClick, currentSpa, showGradebookTab = false, }) {
143855
143614
  const t = useT();
@@ -145731,11 +145490,11 @@ var Collapsible$1 = React.forwardRef(
145731
145490
  }
145732
145491
  );
145733
145492
  Collapsible$1.displayName = COLLAPSIBLE_NAME;
145734
- var TRIGGER_NAME$1 = "CollapsibleTrigger";
145493
+ var TRIGGER_NAME$2 = "CollapsibleTrigger";
145735
145494
  var CollapsibleTrigger$1 = React.forwardRef(
145736
145495
  (props, forwardedRef) => {
145737
145496
  const { __scopeCollapsible, ...triggerProps } = props;
145738
- const context = useCollapsibleContext(TRIGGER_NAME$1, __scopeCollapsible);
145497
+ const context = useCollapsibleContext(TRIGGER_NAME$2, __scopeCollapsible);
145739
145498
  return /* @__PURE__ */ jsx(
145740
145499
  Primitive$3.button,
145741
145500
  {
@@ -145752,19 +145511,19 @@ var CollapsibleTrigger$1 = React.forwardRef(
145752
145511
  );
145753
145512
  }
145754
145513
  );
145755
- CollapsibleTrigger$1.displayName = TRIGGER_NAME$1;
145756
- var CONTENT_NAME$2 = "CollapsibleContent";
145514
+ CollapsibleTrigger$1.displayName = TRIGGER_NAME$2;
145515
+ var CONTENT_NAME$3 = "CollapsibleContent";
145757
145516
  var CollapsibleContent$1 = React.forwardRef(
145758
145517
  (props, forwardedRef) => {
145759
145518
  const { forceMount, ...contentProps } = props;
145760
- const context = useCollapsibleContext(CONTENT_NAME$2, props.__scopeCollapsible);
145519
+ const context = useCollapsibleContext(CONTENT_NAME$3, props.__scopeCollapsible);
145761
145520
  return /* @__PURE__ */ jsx(Presence$3, { present: forceMount || context.open, children: ({ present }) => /* @__PURE__ */ jsx(CollapsibleContentImpl, { ...contentProps, ref: forwardedRef, present }) });
145762
145521
  }
145763
145522
  );
145764
- CollapsibleContent$1.displayName = CONTENT_NAME$2;
145523
+ CollapsibleContent$1.displayName = CONTENT_NAME$3;
145765
145524
  var CollapsibleContentImpl = React.forwardRef((props, forwardedRef) => {
145766
145525
  const { __scopeCollapsible, present, children, ...contentProps } = props;
145767
- const context = useCollapsibleContext(CONTENT_NAME$2, __scopeCollapsible);
145526
+ const context = useCollapsibleContext(CONTENT_NAME$3, __scopeCollapsible);
145768
145527
  const [isPresent, setIsPresent] = React.useState(present);
145769
145528
  const ref = React.useRef(null);
145770
145529
  const composedRefs = useComposedRefs$1(forwardedRef, ref);
@@ -169048,7 +168807,7 @@ var joinTextblockForward = () => ({ state, dispatch }) => {
169048
168807
  };
169049
168808
 
169050
168809
  // src/utilities/isMacOS.ts
169051
- function isMacOS() {
168810
+ function isMacOS$1() {
169052
168811
  return typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false;
169053
168812
  }
169054
168813
 
@@ -169074,7 +168833,7 @@ function normalizeKeyName(name) {
169074
168833
  } else if (/^s(hift)?$/i.test(mod)) {
169075
168834
  shift = true;
169076
168835
  } else if (/^mod$/i.test(mod)) {
169077
- if (isiOS() || isMacOS()) {
168836
+ if (isiOS() || isMacOS$1()) {
169078
168837
  meta = true;
169079
168838
  } else {
169080
168839
  ctrl = true;
@@ -172051,7 +171810,7 @@ var Keymap = Extension.create({
172051
171810
  "Ctrl-a": () => this.editor.commands.selectTextblockStart(),
172052
171811
  "Ctrl-e": () => this.editor.commands.selectTextblockEnd()
172053
171812
  };
172054
- if (isiOS() || isMacOS()) {
171813
+ if (isiOS() || isMacOS$1()) {
172055
171814
  return macKeymap;
172056
171815
  }
172057
171816
  return pcKeymap;
@@ -182089,30 +181848,30 @@ var MenuAnchor = React.forwardRef(
182089
181848
  }
182090
181849
  );
182091
181850
  MenuAnchor.displayName = ANCHOR_NAME;
182092
- var PORTAL_NAME$1 = "MenuPortal";
182093
- var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME$1, {
181851
+ var PORTAL_NAME$2 = "MenuPortal";
181852
+ var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME$2, {
182094
181853
  forceMount: void 0
182095
181854
  });
182096
181855
  var MenuPortal = (props) => {
182097
181856
  const { __scopeMenu, forceMount, children, container } = props;
182098
- const context = useMenuContext(PORTAL_NAME$1, __scopeMenu);
181857
+ const context = useMenuContext(PORTAL_NAME$2, __scopeMenu);
182099
181858
  return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsx(Presence$2, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Portal$6, { asChild: true, container, children }) }) });
182100
181859
  };
182101
- MenuPortal.displayName = PORTAL_NAME$1;
182102
- var CONTENT_NAME$1 = "MenuContent";
182103
- var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME$1);
181860
+ MenuPortal.displayName = PORTAL_NAME$2;
181861
+ var CONTENT_NAME$2 = "MenuContent";
181862
+ var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME$2);
182104
181863
  var MenuContent = React.forwardRef(
182105
181864
  (props, forwardedRef) => {
182106
- const portalContext = usePortalContext(CONTENT_NAME$1, props.__scopeMenu);
181865
+ const portalContext = usePortalContext(CONTENT_NAME$2, props.__scopeMenu);
182107
181866
  const { forceMount = portalContext.forceMount, ...contentProps } = props;
182108
- const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
182109
- const rootContext = useMenuRootContext(CONTENT_NAME$1, props.__scopeMenu);
181867
+ const context = useMenuContext(CONTENT_NAME$2, props.__scopeMenu);
181868
+ const rootContext = useMenuRootContext(CONTENT_NAME$2, props.__scopeMenu);
182110
181869
  return /* @__PURE__ */ jsx(Collection$1.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence$2, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection$1.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
182111
181870
  }
182112
181871
  );
182113
181872
  var MenuRootContentModal = React.forwardRef(
182114
181873
  (props, forwardedRef) => {
182115
- const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
181874
+ const context = useMenuContext(CONTENT_NAME$2, props.__scopeMenu);
182116
181875
  const ref = React.useRef(null);
182117
181876
  const composedRefs = useComposedRefs$1(forwardedRef, ref);
182118
181877
  React.useEffect(() => {
@@ -182138,7 +181897,7 @@ var MenuRootContentModal = React.forwardRef(
182138
181897
  }
182139
181898
  );
182140
181899
  var MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {
182141
- const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
181900
+ const context = useMenuContext(CONTENT_NAME$2, props.__scopeMenu);
182142
181901
  return /* @__PURE__ */ jsx(
182143
181902
  MenuContentImpl,
182144
181903
  {
@@ -182170,8 +181929,8 @@ var MenuContentImpl = React.forwardRef(
182170
181929
  disableOutsideScroll,
182171
181930
  ...contentProps
182172
181931
  } = props;
182173
- const context = useMenuContext(CONTENT_NAME$1, __scopeMenu);
182174
- const rootContext = useMenuRootContext(CONTENT_NAME$1, __scopeMenu);
181932
+ const context = useMenuContext(CONTENT_NAME$2, __scopeMenu);
181933
+ const rootContext = useMenuRootContext(CONTENT_NAME$2, __scopeMenu);
182175
181934
  const popperScope = usePopperScope(__scopeMenu);
182176
181935
  const rovingFocusGroupScope = useRovingFocusGroupScope$1(__scopeMenu);
182177
181936
  const getItems = useCollection$1(__scopeMenu);
@@ -182334,7 +182093,7 @@ var MenuContentImpl = React.forwardRef(
182334
182093
  );
182335
182094
  }
182336
182095
  );
182337
- MenuContent.displayName = CONTENT_NAME$1;
182096
+ MenuContent.displayName = CONTENT_NAME$2;
182338
182097
  var GROUP_NAME$2 = "MenuGroup";
182339
182098
  var MenuGroup = React.forwardRef(
182340
182099
  (props, forwardedRef) => {
@@ -182708,10 +182467,10 @@ MenuSubTrigger.displayName = SUB_TRIGGER_NAME$1;
182708
182467
  var SUB_CONTENT_NAME$1 = "MenuSubContent";
182709
182468
  var MenuSubContent = React.forwardRef(
182710
182469
  (props, forwardedRef) => {
182711
- const portalContext = usePortalContext(CONTENT_NAME$1, props.__scopeMenu);
182470
+ const portalContext = usePortalContext(CONTENT_NAME$2, props.__scopeMenu);
182712
182471
  const { forceMount = portalContext.forceMount, ...subContentProps } = props;
182713
- const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
182714
- const rootContext = useMenuRootContext(CONTENT_NAME$1, props.__scopeMenu);
182472
+ const context = useMenuContext(CONTENT_NAME$2, props.__scopeMenu);
182473
+ const rootContext = useMenuRootContext(CONTENT_NAME$2, props.__scopeMenu);
182715
182474
  const subContext = useMenuSubContext(SUB_CONTENT_NAME$1, props.__scopeMenu);
182716
182475
  const ref = React.useRef(null);
182717
182476
  const composedRefs = useComposedRefs$1(forwardedRef, ref);
@@ -182809,7 +182568,7 @@ function whenMouse(handler) {
182809
182568
  var Root3 = Menu;
182810
182569
  var Anchor2 = MenuAnchor;
182811
182570
  var Portal = MenuPortal;
182812
- var Content2$1 = MenuContent;
182571
+ var Content2$2 = MenuContent;
182813
182572
  var Group = MenuGroup;
182814
182573
  var Label = MenuLabel;
182815
182574
  var Item2$2 = MenuItem;
@@ -182863,11 +182622,11 @@ var DropdownMenu$1 = (props) => {
182863
182622
  );
182864
182623
  };
182865
182624
  DropdownMenu$1.displayName = DROPDOWN_MENU_NAME;
182866
- var TRIGGER_NAME = "DropdownMenuTrigger";
182625
+ var TRIGGER_NAME$1 = "DropdownMenuTrigger";
182867
182626
  var DropdownMenuTrigger$1 = React.forwardRef(
182868
182627
  (props, forwardedRef) => {
182869
182628
  const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;
182870
- const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);
182629
+ const context = useDropdownMenuContext(TRIGGER_NAME$1, __scopeDropdownMenu);
182871
182630
  const menuScope = useMenuScope(__scopeDropdownMenu);
182872
182631
  return /* @__PURE__ */ jsx(Anchor2, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsx(
182873
182632
  Primitive$4.button,
@@ -182898,23 +182657,23 @@ var DropdownMenuTrigger$1 = React.forwardRef(
182898
182657
  ) });
182899
182658
  }
182900
182659
  );
182901
- DropdownMenuTrigger$1.displayName = TRIGGER_NAME;
182902
- var PORTAL_NAME = "DropdownMenuPortal";
182660
+ DropdownMenuTrigger$1.displayName = TRIGGER_NAME$1;
182661
+ var PORTAL_NAME$1 = "DropdownMenuPortal";
182903
182662
  var DropdownMenuPortal$1 = (props) => {
182904
182663
  const { __scopeDropdownMenu, ...portalProps } = props;
182905
182664
  const menuScope = useMenuScope(__scopeDropdownMenu);
182906
182665
  return /* @__PURE__ */ jsx(Portal, { ...menuScope, ...portalProps });
182907
182666
  };
182908
- DropdownMenuPortal$1.displayName = PORTAL_NAME;
182909
- var CONTENT_NAME = "DropdownMenuContent";
182667
+ DropdownMenuPortal$1.displayName = PORTAL_NAME$1;
182668
+ var CONTENT_NAME$1 = "DropdownMenuContent";
182910
182669
  var DropdownMenuContent$1 = React.forwardRef(
182911
182670
  (props, forwardedRef) => {
182912
182671
  const { __scopeDropdownMenu, ...contentProps } = props;
182913
- const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);
182672
+ const context = useDropdownMenuContext(CONTENT_NAME$1, __scopeDropdownMenu);
182914
182673
  const menuScope = useMenuScope(__scopeDropdownMenu);
182915
182674
  const hasInteractedOutsideRef = React.useRef(false);
182916
182675
  return /* @__PURE__ */ jsx(
182917
- Content2$1,
182676
+ Content2$2,
182918
182677
  {
182919
182678
  id: context.contentId,
182920
182679
  "aria-labelledby": context.triggerId,
@@ -182947,7 +182706,7 @@ var DropdownMenuContent$1 = React.forwardRef(
182947
182706
  );
182948
182707
  }
182949
182708
  );
182950
- DropdownMenuContent$1.displayName = CONTENT_NAME;
182709
+ DropdownMenuContent$1.displayName = CONTENT_NAME$1;
182951
182710
  var GROUP_NAME$1 = "DropdownMenuGroup";
182952
182711
  var DropdownMenuGroup$1 = React.forwardRef(
182953
182712
  (props, forwardedRef) => {
@@ -183061,10 +182820,10 @@ var DropdownMenuSubContent$1 = React.forwardRef((props, forwardedRef) => {
183061
182820
  );
183062
182821
  });
183063
182822
  DropdownMenuSubContent$1.displayName = SUB_CONTENT_NAME;
183064
- var Root2$1 = DropdownMenu$1;
182823
+ var Root2$2 = DropdownMenu$1;
183065
182824
  var Trigger = DropdownMenuTrigger$1;
183066
- var Portal2 = DropdownMenuPortal$1;
183067
- var Content2 = DropdownMenuContent$1;
182825
+ var Portal2$1 = DropdownMenuPortal$1;
182826
+ var Content2$1 = DropdownMenuContent$1;
183068
182827
  var Group2 = DropdownMenuGroup$1;
183069
182828
  var Label2 = DropdownMenuLabel$1;
183070
182829
  var Item2$1 = DropdownMenuItem$1;
@@ -183078,17 +182837,17 @@ var SubTrigger2 = DropdownMenuSubTrigger$1;
183078
182837
  var SubContent2 = DropdownMenuSubContent$1;
183079
182838
 
183080
182839
  function DropdownMenu({ ...props }) {
183081
- return jsx(Root2$1, { "data-slot": "dropdown-menu", ...props });
182840
+ return jsx(Root2$2, { "data-slot": "dropdown-menu", ...props });
183082
182841
  }
183083
182842
  function DropdownMenuPortal({ ...props }) {
183084
- return jsx(Portal2, { "data-slot": "dropdown-menu-portal", ...props });
182843
+ return jsx(Portal2$1, { "data-slot": "dropdown-menu-portal", ...props });
183085
182844
  }
183086
182845
  function DropdownMenuTrigger({ ...props }) {
183087
182846
  return jsx(Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
183088
182847
  }
183089
182848
  function DropdownMenuContent({ className, sideOffset = 4, ...props }) {
183090
182849
  const portalContainer = useFloatingPortalContainer();
183091
- return (jsx(Portal2, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsx(Content2, { "data-slot": "dropdown-menu-content", "data-iblai-dialog-interaction-layer": true, sideOffset: sideOffset, className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), ...props }) }));
182850
+ return (jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsx(Content2$1, { "data-slot": "dropdown-menu-content", "data-iblai-dialog-interaction-layer": true, sideOffset: sideOffset, className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), ...props }) }));
183092
182851
  }
183093
182852
  function DropdownMenuGroup({ ...props }) {
183094
182853
  return jsx(Group2, { "data-slot": "dropdown-menu-group", ...props });
@@ -183930,12 +183689,12 @@ var RadioGroupIndicator = React.forwardRef(
183930
183689
  }
183931
183690
  );
183932
183691
  RadioGroupIndicator.displayName = INDICATOR_NAME2;
183933
- var Root2 = RadioGroup$1;
183692
+ var Root2$1 = RadioGroup$1;
183934
183693
  var Item2 = RadioGroupItem$1;
183935
183694
  var Indicator = RadioGroupIndicator;
183936
183695
 
183937
183696
  function RadioGroup({ className, ...props }) {
183938
- return (jsx(Root2, { "data-slot": "radio-group", className: cn('grid gap-3', className), ...props }));
183697
+ return (jsx(Root2$1, { "data-slot": "radio-group", className: cn('grid gap-3', className), ...props }));
183939
183698
  }
183940
183699
  function RadioGroupItem({ className, ...props }) {
183941
183700
  return (jsx(Item2, { "data-slot": "radio-group-item", className: cn('border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50', className), ...props, children: jsx(Indicator, { "data-slot": "radio-group-indicator", className: "relative flex items-center justify-center", children: jsx(Circle, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" }) }) }));
@@ -185471,6 +185230,173 @@ function NotificationDisplay({ org, userId, isAdmin = false, selectedNotificatio
185471
185230
  } }), jsx(Dialog, { open: isMobileModalOpen, onOpenChange: setIsMobileModalOpen, children: jsx(DialogContent, { className: "max-h-[85vh] overflow-y-auto max-w-[95vw]", children: selectedNotification && (jsxs(Fragment$1, { children: [jsxs(DialogHeader, { children: [jsx(DialogTitle, { className: "text-xl font-semibold text-gray-900 pr-6", children: selectedNotification.title }), jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500 pt-2", children: [jsx(Clock, { className: "h-4 w-4", "aria-hidden": "true" }), jsx("time", { dateTime: selectedNotification.timestamp.toISOString(), children: format$1(selectedNotification.timestamp, "MMMM d, yyyy 'at' h:mm a") })] })] }), jsx("div", { className: "prose prose-sm max-w-none text-gray-700 mt-4", dangerouslySetInnerHTML: { __html: sanitizeHtml(selectedNotification.body) }, "aria-labelledby": "mobile-notification-title" })] })) }) })] }));
185472
185231
  }
185473
185232
 
185233
+ var SLOTTABLE_IDENTIFIER = Symbol("radix.slottable");
185234
+ // @__NO_SIDE_EFFECTS__
185235
+ function createSlottable(ownerName) {
185236
+ const Slottable2 = ({ children }) => {
185237
+ return /* @__PURE__ */ jsx(Fragment$1, { children });
185238
+ };
185239
+ Slottable2.displayName = `${ownerName}.Slottable`;
185240
+ Slottable2.__radixId = SLOTTABLE_IDENTIFIER;
185241
+ return Slottable2;
185242
+ }
185243
+
185244
+ var ROOT_NAME = "AlertDialog";
185245
+ var [createAlertDialogContext] = createContextScope$1(ROOT_NAME, [
185246
+ createDialogScope
185247
+ ]);
185248
+ var useDialogScope = createDialogScope();
185249
+ var AlertDialog$1 = (props) => {
185250
+ const { __scopeAlertDialog, ...alertDialogProps } = props;
185251
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185252
+ return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...dialogScope, ...alertDialogProps, modal: true });
185253
+ };
185254
+ AlertDialog$1.displayName = ROOT_NAME;
185255
+ var TRIGGER_NAME = "AlertDialogTrigger";
185256
+ var AlertDialogTrigger = React.forwardRef(
185257
+ (props, forwardedRef) => {
185258
+ const { __scopeAlertDialog, ...triggerProps } = props;
185259
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185260
+ return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { ...dialogScope, ...triggerProps, ref: forwardedRef });
185261
+ }
185262
+ );
185263
+ AlertDialogTrigger.displayName = TRIGGER_NAME;
185264
+ var PORTAL_NAME = "AlertDialogPortal";
185265
+ var AlertDialogPortal$1 = (props) => {
185266
+ const { __scopeAlertDialog, ...portalProps } = props;
185267
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185268
+ return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { ...dialogScope, ...portalProps });
185269
+ };
185270
+ AlertDialogPortal$1.displayName = PORTAL_NAME;
185271
+ var OVERLAY_NAME = "AlertDialogOverlay";
185272
+ var AlertDialogOverlay$1 = React.forwardRef(
185273
+ (props, forwardedRef) => {
185274
+ const { __scopeAlertDialog, ...overlayProps } = props;
185275
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185276
+ return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { ...dialogScope, ...overlayProps, ref: forwardedRef });
185277
+ }
185278
+ );
185279
+ AlertDialogOverlay$1.displayName = OVERLAY_NAME;
185280
+ var CONTENT_NAME = "AlertDialogContent";
185281
+ var [AlertDialogContentProvider, useAlertDialogContentContext] = createAlertDialogContext(CONTENT_NAME);
185282
+ var Slottable = createSlottable("AlertDialogContent");
185283
+ var AlertDialogContent$1 = React.forwardRef(
185284
+ (props, forwardedRef) => {
185285
+ const { __scopeAlertDialog, children, ...contentProps } = props;
185286
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185287
+ const contentRef = React.useRef(null);
185288
+ const composedRefs = useComposedRefs$1(forwardedRef, contentRef);
185289
+ const cancelRef = React.useRef(null);
185290
+ return /* @__PURE__ */ jsx(
185291
+ DialogPrimitive.WarningProvider,
185292
+ {
185293
+ contentName: CONTENT_NAME,
185294
+ titleName: TITLE_NAME,
185295
+ docsSlug: "alert-dialog",
185296
+ children: /* @__PURE__ */ jsx(AlertDialogContentProvider, { scope: __scopeAlertDialog, cancelRef, children: /* @__PURE__ */ jsxs(
185297
+ DialogPrimitive.Content,
185298
+ {
185299
+ role: "alertdialog",
185300
+ ...dialogScope,
185301
+ ...contentProps,
185302
+ ref: composedRefs,
185303
+ onOpenAutoFocus: composeEventHandlers$2(contentProps.onOpenAutoFocus, (event) => {
185304
+ event.preventDefault();
185305
+ cancelRef.current?.focus({ preventScroll: true });
185306
+ }),
185307
+ onPointerDownOutside: (event) => event.preventDefault(),
185308
+ onInteractOutside: (event) => event.preventDefault(),
185309
+ children: [
185310
+ /* @__PURE__ */ jsx(Slottable, { children }),
185311
+ /* @__PURE__ */ jsx(DescriptionWarning, { contentRef })
185312
+ ]
185313
+ }
185314
+ ) })
185315
+ }
185316
+ );
185317
+ }
185318
+ );
185319
+ AlertDialogContent$1.displayName = CONTENT_NAME;
185320
+ var TITLE_NAME = "AlertDialogTitle";
185321
+ var AlertDialogTitle$1 = React.forwardRef(
185322
+ (props, forwardedRef) => {
185323
+ const { __scopeAlertDialog, ...titleProps } = props;
185324
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185325
+ return /* @__PURE__ */ jsx(DialogPrimitive.Title, { ...dialogScope, ...titleProps, ref: forwardedRef });
185326
+ }
185327
+ );
185328
+ AlertDialogTitle$1.displayName = TITLE_NAME;
185329
+ var DESCRIPTION_NAME = "AlertDialogDescription";
185330
+ var AlertDialogDescription$1 = React.forwardRef((props, forwardedRef) => {
185331
+ const { __scopeAlertDialog, ...descriptionProps } = props;
185332
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185333
+ return /* @__PURE__ */ jsx(DialogPrimitive.Description, { ...dialogScope, ...descriptionProps, ref: forwardedRef });
185334
+ });
185335
+ AlertDialogDescription$1.displayName = DESCRIPTION_NAME;
185336
+ var ACTION_NAME = "AlertDialogAction";
185337
+ var AlertDialogAction$1 = React.forwardRef(
185338
+ (props, forwardedRef) => {
185339
+ const { __scopeAlertDialog, ...actionProps } = props;
185340
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185341
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...actionProps, ref: forwardedRef });
185342
+ }
185343
+ );
185344
+ AlertDialogAction$1.displayName = ACTION_NAME;
185345
+ var CANCEL_NAME = "AlertDialogCancel";
185346
+ var AlertDialogCancel$1 = React.forwardRef(
185347
+ (props, forwardedRef) => {
185348
+ const { __scopeAlertDialog, ...cancelProps } = props;
185349
+ const { cancelRef } = useAlertDialogContentContext(CANCEL_NAME, __scopeAlertDialog);
185350
+ const dialogScope = useDialogScope(__scopeAlertDialog);
185351
+ const ref = useComposedRefs$1(forwardedRef, cancelRef);
185352
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...cancelProps, ref });
185353
+ }
185354
+ );
185355
+ AlertDialogCancel$1.displayName = CANCEL_NAME;
185356
+ var DescriptionWarning = ({ contentRef }) => {
185357
+ const MESSAGE = `\`${CONTENT_NAME}\` requires a description for the component to be accessible for screen reader users.
185358
+
185359
+ You can add a description to the \`${CONTENT_NAME}\` by passing a \`${DESCRIPTION_NAME}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
185360
+
185361
+ Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${CONTENT_NAME}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
185362
+
185363
+ For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;
185364
+ React.useEffect(() => {
185365
+ const hasDescription = document.getElementById(
185366
+ contentRef.current?.getAttribute("aria-describedby")
185367
+ );
185368
+ if (!hasDescription) console.warn(MESSAGE);
185369
+ }, [MESSAGE, contentRef]);
185370
+ return null;
185371
+ };
185372
+ var Root2 = AlertDialog$1;
185373
+ var Portal2 = AlertDialogPortal$1;
185374
+ var Overlay2 = AlertDialogOverlay$1;
185375
+ var Content2 = AlertDialogContent$1;
185376
+ var Action = AlertDialogAction$1;
185377
+ var Cancel = AlertDialogCancel$1;
185378
+ var Title2 = AlertDialogTitle$1;
185379
+ var Description2 = AlertDialogDescription$1;
185380
+
185381
+ const AlertDialog = Root2;
185382
+ const AlertDialogPortal = Portal2;
185383
+ const AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => (jsx(Overlay2, { className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80', className), ...props, ref: ref })));
185384
+ AlertDialogOverlay.displayName = Overlay2.displayName;
185385
+ const AlertDialogContent = React.forwardRef(({ className, ...props }, ref) => (jsxs(AlertDialogPortal, { children: [jsx(AlertDialogOverlay, {}), jsx(Content2, { ref: ref, className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg', className), ...props })] })));
185386
+ AlertDialogContent.displayName = Content2.displayName;
185387
+ const AlertDialogHeader = ({ className, ...props }) => (jsx("div", { className: cn('flex flex-col space-y-2 text-center sm:text-left', className), ...props }));
185388
+ AlertDialogHeader.displayName = 'AlertDialogHeader';
185389
+ const AlertDialogFooter = ({ className, ...props }) => (jsx("div", { className: cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
185390
+ AlertDialogFooter.displayName = 'AlertDialogFooter';
185391
+ const AlertDialogTitle = React.forwardRef(({ className, ...props }, ref) => (jsx(Title2, { ref: ref, className: cn('text-lg font-semibold', className), ...props })));
185392
+ AlertDialogTitle.displayName = Title2.displayName;
185393
+ const AlertDialogDescription = React.forwardRef(({ className, ...props }, ref) => (jsx(Description2, { ref: ref, className: cn('text-muted-foreground text-sm', className), ...props })));
185394
+ AlertDialogDescription.displayName = Description2.displayName;
185395
+ const AlertDialogAction = React.forwardRef(({ className, ...props }, ref) => (jsx(Action, { ref: ref, className: cn(buttonVariants(), className), ...props })));
185396
+ AlertDialogAction.displayName = Action.displayName;
185397
+ const AlertDialogCancel = React.forwardRef(({ className, ...props }, ref) => (jsx(Cancel, { ref: ref, className: cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className), ...props })));
185398
+ AlertDialogCancel.displayName = Cancel.displayName;
185399
+
185474
185400
  /**
185475
185401
  * **Private mode** toggle for the platform nav-bar. A single pill that
185476
185402
  * collapses to an icon-only chip when off, and expands with a cool
@@ -227424,27 +227350,192 @@ function AgentConfigPrompts({ platformKey, mentorUniqueId }) {
227424
227350
  }) }), editingField && (jsx(EditFieldModal, { isOpen: !!editingField, onClose: () => setEditingField(null), label: editingField.label, value: editingField.value, onSave: handleSaveField, isSaving: isUpdating }))] }));
227425
227351
  }
227426
227352
 
227353
+ /** Page size for the resources list inside the Edit Skill dialog. */
227354
+ const RESOURCES_PAGE_SIZE = 20;
227355
+ const EMPTY_RESOURCE_FORM = {
227356
+ file_type: 'reference',
227357
+ filename: '',
227358
+ content: '',
227359
+ };
227360
+ /**
227361
+ * File attachments for a skill (agent-skill-resources). `reference`/`script`
227362
+ * files are text (filename + content); `asset` files are binary uploads.
227363
+ * Rendered as the Files tab of the Edit Skill dialog: a list with row
227364
+ * actions, a New File popup for add/edit, and a delete confirmation.
227365
+ */
227366
+ function SkillResourcesSection({ platformKey, skillId }) {
227367
+ var _a, _b, _c;
227368
+ const t = useT();
227369
+ const [page, setPage] = useState(1);
227370
+ const { data: resourcePage, isLoading } = useGetAgentSkillResourcesQuery({
227371
+ org: platformKey,
227372
+ skill: skillId,
227373
+ limit: RESOURCES_PAGE_SIZE,
227374
+ offset: (page - 1) * RESOURCES_PAGE_SIZE,
227375
+ });
227376
+ const resources = (_a = resourcePage === null || resourcePage === void 0 ? void 0 : resourcePage.results) !== null && _a !== void 0 ? _a : [];
227377
+ const totalCount = (_b = resourcePage === null || resourcePage === void 0 ? void 0 : resourcePage.count) !== null && _b !== void 0 ? _b : 0;
227378
+ const totalPages = Math.max(1, Math.ceil(totalCount / RESOURCES_PAGE_SIZE));
227379
+ // Deleting the last item of the last page leaves the page out of range —
227380
+ // snap back to the new last page.
227381
+ useEffect(() => {
227382
+ if (page > totalPages)
227383
+ setPage(totalPages);
227384
+ }, [page, totalPages]);
227385
+ const [createResource, { isLoading: isCreating }] = useCreateAgentSkillResourceMutation();
227386
+ const [updateResource, { isLoading: isUpdating }] = useUpdateAgentSkillResourceMutation();
227387
+ const [uploadAsset, { isLoading: isUploading }] = useUploadAgentSkillResourceAssetMutation();
227388
+ const [deleteResource, { isLoading: isDeleting }] = useDeleteAgentSkillResourceMutation();
227389
+ const [showFileDialog, setShowFileDialog] = useState(false);
227390
+ const [editingResource, setEditingResource] = useState(null);
227391
+ const [deletingResource, setDeletingResource] = useState(null);
227392
+ const [form, setForm] = useState(EMPTY_RESOURCE_FORM);
227393
+ const [assetFile, setAssetFile] = useState(null);
227394
+ const fileInputRef = useRef(null);
227395
+ const isSaving = isCreating || isUpdating || isUploading;
227396
+ const isAssetForm = form.file_type === 'asset' && !editingResource;
227397
+ const canSubmitFile = isAssetForm ? !!assetFile : !!form.filename && !!form.content;
227398
+ const typeLabel = (fileType) => {
227399
+ switch (fileType) {
227400
+ case 'script':
227401
+ return t('clawSandboxAgentSkills.fileTypeScript');
227402
+ case 'asset':
227403
+ return t('clawSandboxAgentSkills.fileTypeAsset');
227404
+ default:
227405
+ return t('clawSandboxAgentSkills.fileTypeReference');
227406
+ }
227407
+ };
227408
+ const openNewFileDialog = () => {
227409
+ setForm(EMPTY_RESOURCE_FORM);
227410
+ setAssetFile(null);
227411
+ setEditingResource(null);
227412
+ setShowFileDialog(true);
227413
+ };
227414
+ const openEditFileDialog = (resource) => {
227415
+ var _a, _b;
227416
+ setForm({
227417
+ file_type: (_a = resource.file_type) !== null && _a !== void 0 ? _a : 'reference',
227418
+ filename: resource.filename,
227419
+ content: (_b = resource.content) !== null && _b !== void 0 ? _b : '',
227420
+ });
227421
+ setAssetFile(null);
227422
+ setEditingResource(resource);
227423
+ setShowFileDialog(true);
227424
+ };
227425
+ const closeFileDialog = () => {
227426
+ setShowFileDialog(false);
227427
+ setEditingResource(null);
227428
+ setForm(EMPTY_RESOURCE_FORM);
227429
+ setAssetFile(null);
227430
+ };
227431
+ const handleSubmitFile = async () => {
227432
+ try {
227433
+ if (editingResource) {
227434
+ await updateResource({
227435
+ org: platformKey,
227436
+ id: editingResource.id,
227437
+ filename: form.filename,
227438
+ content: form.content,
227439
+ }).unwrap();
227440
+ toast.success(t('clawSandboxAgentSkills.fileSaved'));
227441
+ }
227442
+ else if (isAssetForm) {
227443
+ if (!assetFile)
227444
+ return;
227445
+ await uploadAsset({
227446
+ org: platformKey,
227447
+ skill: skillId,
227448
+ file: assetFile,
227449
+ filename: assetFile.name,
227450
+ }).unwrap();
227451
+ toast.success(t('clawSandboxAgentSkills.fileUploaded'));
227452
+ }
227453
+ else {
227454
+ await createResource({
227455
+ org: platformKey,
227456
+ skill: skillId,
227457
+ file_type: form.file_type,
227458
+ filename: form.filename,
227459
+ content: form.content,
227460
+ }).unwrap();
227461
+ toast.success(t('clawSandboxAgentSkills.fileAdded'));
227462
+ }
227463
+ closeFileDialog();
227464
+ }
227465
+ catch (_a) {
227466
+ toast.error(t(isAssetForm
227467
+ ? 'clawSandboxAgentSkills.failedToUploadFile'
227468
+ : 'clawSandboxAgentSkills.failedToSaveFile'));
227469
+ }
227470
+ };
227471
+ const handleDeleteFile = async () => {
227472
+ if (!deletingResource)
227473
+ return;
227474
+ try {
227475
+ await deleteResource({ org: platformKey, id: deletingResource.id }).unwrap();
227476
+ toast.success(t('clawSandboxAgentSkills.fileDeleted'));
227477
+ setDeletingResource(null);
227478
+ }
227479
+ catch (_a) {
227480
+ toast.error(t('clawSandboxAgentSkills.failedToDeleteFile'));
227481
+ }
227482
+ };
227483
+ const submitLabel = () => {
227484
+ if (editingResource) {
227485
+ return isUpdating ? t('clawSandboxAgentSkills.saving') : t('clawSandboxAgentSkills.save');
227486
+ }
227487
+ if (isAssetForm) {
227488
+ return isUploading
227489
+ ? t('clawSandboxAgentSkills.uploading')
227490
+ : t('clawSandboxAgentSkills.upload');
227491
+ }
227492
+ return isCreating ? t('clawSandboxAgentSkills.adding') : t('clawSandboxAgentSkills.addFileButton');
227493
+ };
227494
+ return (jsxs("div", { className: "space-y-4", "data-testid": "skill-resources-section", children: [jsxs("div", { className: "flex items-start justify-between gap-4", children: [jsx("p", { className: "text-xs text-gray-500", children: t('clawSandboxAgentSkills.filesHint') }), jsxs(Button$1, { onClick: openNewFileDialog, size: "sm", className: "shrink-0 cursor-pointer bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: [jsx(Plus, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.newFile')] })] }), isLoading ? (jsxs("div", { className: "flex items-center gap-2 p-4", role: "status", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.loadingFiles') })] })) : resources.length === 0 ? (jsx("div", { className: "flex items-center justify-center rounded-lg border p-6", children: jsx("p", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.noFiles') }) })) : (jsxs("div", { className: "space-y-3", children: [resources.map((resource) => (jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border p-4", children: [jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [jsx(Paperclip, { className: "h-4 w-4 shrink-0 text-gray-400" }), jsx("span", { className: "truncate text-sm font-medium text-gray-700", children: resource.filename }), jsx("span", { className: "rounded-full bg-gray-100 px-2 py-0.5 text-[0.625rem] text-gray-500", children: typeLabel(resource.file_type) })] }), jsx(FloatingPortalContainerContext.Provider, { value: null, children: jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsx(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxAgentSkills.skillActions', {
227495
+ name: resource.filename,
227496
+ }), children: jsx(Ellipsis, { className: "h-4 w-4" }) }) }), jsxs(DropdownMenuContent, { align: "end", className: "z-[110]", children: [resource.file_type === 'asset' && resource.file && (jsx(DropdownMenuItem, { asChild: true, className: "cursor-pointer", children: jsxs("a", { href: resource.file, target: "_blank", rel: "noreferrer", download: true, children: [jsx(Download, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.download')] }) })), resource.file_type !== 'asset' && (jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => openEditFileDialog(resource), children: [jsx(Pen, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.edit')] })), jsxs(DropdownMenuItem, { variant: "destructive", className: "cursor-pointer", onClick: () => setDeletingResource(resource), children: [jsx(Trash2, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.delete')] })] })] }) })] }, resource.id))), jsx(AdvancedPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, totalCount: totalCount, itemsPerPage: RESOURCES_PAGE_SIZE, itemLabel: t('clawSandboxAgentSkills.resourcesItemLabel') })] })), jsxs(OverlayModal, { open: showFileDialog, onClose: closeFileDialog, title: t(editingResource
227497
+ ? 'clawSandboxAgentSkills.editFileDialogTitle'
227498
+ : 'clawSandboxAgentSkills.newFileDialogTitle'), className: "max-w-lg", children: [jsxs("div", { className: "mt-4 grid gap-4", children: [!editingResource && (jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "resource-type", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fileTypeLabel') }), jsxs(Select$1, { value: form.file_type, onValueChange: (value) => setForm({ ...form, file_type: value }), children: [jsx(SelectTrigger, { id: "resource-type", className: "w-full", children: jsx(SelectValue, {}) }), jsxs(SelectContent, { children: [jsx(SelectItem, { value: "reference", children: t('clawSandboxAgentSkills.fileTypeReference') }), jsx(SelectItem, { value: "script", children: t('clawSandboxAgentSkills.fileTypeScript') }), jsx(SelectItem, { value: "asset", children: t('clawSandboxAgentSkills.fileTypeAsset') })] })] })] })), isAssetForm ? (jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "resource-file", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fileNameLabel') }), jsx("input", { ref: fileInputRef, id: "resource-file", type: "file", className: "hidden", onChange: (e) => { var _a, _b; return setAssetFile((_b = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null); }, "data-testid": "resource-file-input" }), jsxs("div", { className: "flex items-center gap-2", children: [jsxs(Button$1, { variant: "outline", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: [jsx(Paperclip, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.chooseFile')] }), assetFile && (jsx("span", { className: "truncate text-sm text-gray-600", children: assetFile.name }))] })] })) : (jsxs(Fragment$1, { children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "resource-filename", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fileNameLabel') }), jsx(Input, { id: "resource-filename", name: "resource-filename", value: form.filename, onChange: (e) => setForm({ ...form, filename: e.target.value }), placeholder: t('clawSandboxAgentSkills.fileNamePlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "resource-content", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fileContentLabel') }), jsx(Textarea, { id: "resource-content", name: "resource-content", value: form.content, onChange: (e) => setForm({ ...form, content: e.target.value }), placeholder: t('clawSandboxAgentSkills.fileContentPlaceholder'), rows: 6 })] })] }))] }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: closeFileDialog, children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleSubmitFile, disabled: isSaving || !canSubmitFile, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: submitLabel() })] })] }), jsxs(OverlayModal, { open: !!deletingResource, onClose: () => setDeletingResource(null), title: t('clawSandboxAgentSkills.deleteFileDialogTitle'), className: "max-w-md", children: [jsx("p", { className: "mt-2 text-sm text-gray-600", children: t('clawSandboxAgentSkills.deleteFileConfirmation', {
227499
+ name: (_c = deletingResource === null || deletingResource === void 0 ? void 0 : deletingResource.filename) !== null && _c !== void 0 ? _c : '',
227500
+ }) }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setDeletingResource(null), children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleDeleteFile, disabled: isDeleting, className: "bg-red-600 text-white hover:bg-red-700", children: isDeleting
227501
+ ? t('clawSandboxAgentSkills.deleting')
227502
+ : t('clawSandboxAgentSkills.delete') })] })] })] }));
227503
+ }
227504
+
227427
227505
  const EMPTY_SKILL_FORM = {
227428
227506
  name: '',
227429
227507
  slug: '',
227430
227508
  description: '',
227431
227509
  version: '1.0.0',
227510
+ category: '',
227432
227511
  instruction: '',
227512
+ privateToAgent: false,
227433
227513
  };
227514
+ // The builder resolves the effective skill set client-side, which needs the
227515
+ // complete catalog and assignment lists. Request one explicit large page so
227516
+ // the result is deterministic even if the backend later configures a default
227517
+ // page size (the list endpoints unwrap paginated envelopes to `results`).
227518
+ const FULL_LIST_LIMIT = 1000;
227434
227519
  function AgentSkills({ platformKey, mentorUniqueId }) {
227435
227520
  var _a;
227436
227521
  const t = useT();
227437
227522
  // Skills are managed independently of the sandbox connection — org-level
227438
227523
  // skills and the mentor's assignments both resolve without a wired Claw
227439
227524
  // instance, so we always fetch and let admins add/assign skills freely.
227525
+ // Always fetch — the backend enforces read access; RBAC here only gates
227526
+ // the write affordances (a partial permissions map must not blank the UI).
227440
227527
  const { data: availableSkills, isLoading: isLoadingSkills } = useGetAgentSkillsQuery({
227441
227528
  org: platformKey,
227529
+ limit: FULL_LIST_LIMIT,
227530
+ offset: 0,
227442
227531
  });
227443
227532
  const { data: assignments, isLoading: isLoadingAssignments } = useGetMentorSkillAssignmentsQuery({
227444
227533
  org: platformKey,
227445
227534
  mentorUniqueId,
227535
+ limit: FULL_LIST_LIMIT,
227536
+ offset: 0,
227446
227537
  });
227447
- // Assignment mutations (toggle on mentor)
227538
+ // Assignment mutations (attach/detach/toggle on the agent)
227448
227539
  const [createAssignment, { isLoading: isCreatingAssignment }] = useCreateMentorSkillAssignmentMutation();
227449
227540
  const [updateAssignment, { isLoading: isUpdatingAssignment }] = useUpdateMentorSkillAssignmentMutation();
227450
227541
  const [deleteAssignment, { isLoading: isDeletingAssignment }] = useDeleteMentorSkillAssignmentMutation();
@@ -227457,59 +227548,95 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227457
227548
  const [deletingSkill, setDeletingSkill] = useState(null);
227458
227549
  const [form, setForm] = useState(EMPTY_SKILL_FORM);
227459
227550
  const isLoading = isLoadingSkills || isLoadingAssignments;
227460
- const isTogglingMentorSkill = isCreatingAssignment || isUpdatingAssignment || isDeletingAssignment;
227461
- const skills = (availableSkills !== null && availableSkills !== void 0 ? availableSkills : []).filter((s) => s.enabled);
227462
- // Skill assignments are now keyed by skill UUID (the new stable identifier).
227463
- const assignmentsBySkillUniqueId = new Map((assignments !== null && assignments !== void 0 ? assignments : []).map((a) => [a.skill, a]));
227551
+ const isMutatingAgentSkill = isCreatingAssignment || isUpdatingAssignment || isDeletingAssignment || isUpdatingSkill;
227552
+ const allSkills = availableSkills !== null && availableSkills !== void 0 ? availableSkills : [];
227553
+ const effectiveSkills = resolveEffectiveAgentSkills(allSkills, assignments !== null && assignments !== void 0 ? assignments : [], mentorUniqueId);
227554
+ const effectiveUniqueIds = new Set(effectiveSkills.map((s) => s.unique_id));
227555
+ const effectiveSlugs = new Set(effectiveSkills.map((s) => s.slug));
227556
+ // Catalog skills this agent could still attach: enabled, platform-wide
227557
+ // (never another agent's private skills), and not already effective. A
227558
+ // skill whose slug is already effective (e.g. shadowed by a private skill)
227559
+ // would dedupe away after attaching — don't offer an Add that does nothing.
227560
+ const attachableSkills = allSkills.filter((skill) => skill.enabled &&
227561
+ !skill.mentor &&
227562
+ !effectiveUniqueIds.has(skill.unique_id) &&
227563
+ !effectiveSlugs.has(skill.slug));
227564
+ // Featured skills from the `main` platform are read-only for tenants — the
227565
+ // API 404s writes against them, so hide the edit/delete affordances.
227566
+ const isSkillEditable = (skill) => {
227567
+ if (!skill)
227568
+ return false;
227569
+ return skill.platform_key ? skill.platform_key === platformKey : !skill.is_featured;
227570
+ };
227464
227571
  const resetForm = () => setForm(EMPTY_SKILL_FORM);
227465
- const handleToggle = async (skill, shouldEnable) => {
227466
- const existing = assignmentsBySkillUniqueId.get(skill.unique_id);
227572
+ const handleToggleEffective = async (effective, shouldEnable) => {
227467
227573
  try {
227468
- if (shouldEnable) {
227469
- if (existing) {
227470
- await updateAssignment({
227471
- org: platformKey,
227472
- mentorUniqueId,
227473
- assignmentPk: existing.id,
227474
- enabled: true,
227475
- }).unwrap();
227476
- }
227477
- else {
227478
- await createAssignment({
227479
- org: platformKey,
227480
- mentorUniqueId,
227481
- skill: skill.unique_id,
227482
- enabled: true,
227483
- }).unwrap();
227484
- }
227485
- toast.success(t('clawSandboxAgentSkills.skillEnabled', { name: skill.name }));
227574
+ if (effective.origin === 'private' && effective.skill) {
227575
+ await updateSkill({
227576
+ org: platformKey,
227577
+ id: effective.skill.id,
227578
+ enabled: shouldEnable,
227579
+ }).unwrap();
227486
227580
  }
227487
- else {
227488
- if (!existing)
227489
- return;
227490
- await deleteAssignment({
227581
+ else if (effective.assignmentId !== undefined) {
227582
+ await updateAssignment({
227491
227583
  org: platformKey,
227492
227584
  mentorUniqueId,
227493
- assignmentPk: existing.id,
227585
+ assignmentPk: effective.assignmentId,
227586
+ enabled: shouldEnable,
227494
227587
  }).unwrap();
227495
- toast.success(t('clawSandboxAgentSkills.skillDisabled', { name: skill.name }));
227496
227588
  }
227589
+ toast.success(t(shouldEnable
227590
+ ? 'clawSandboxAgentSkills.skillEnabled'
227591
+ : 'clawSandboxAgentSkills.skillDisabled', { name: effective.name }));
227592
+ }
227593
+ catch (_a) {
227594
+ toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: effective.name }));
227595
+ }
227596
+ };
227597
+ const handleAttach = async (skill) => {
227598
+ try {
227599
+ await createAssignment({
227600
+ org: platformKey,
227601
+ mentorUniqueId,
227602
+ skill: skill.unique_id,
227603
+ enabled: true,
227604
+ }).unwrap();
227605
+ toast.success(t('clawSandboxAgentSkills.skillAdded', { name: skill.name }));
227497
227606
  }
227498
227607
  catch (_a) {
227499
227608
  toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: skill.name }));
227500
227609
  }
227501
227610
  };
227611
+ const handleDetach = async (effective) => {
227612
+ if (effective.assignmentId === undefined)
227613
+ return;
227614
+ try {
227615
+ await deleteAssignment({
227616
+ org: platformKey,
227617
+ mentorUniqueId,
227618
+ assignmentPk: effective.assignmentId,
227619
+ }).unwrap();
227620
+ toast.success(t('clawSandboxAgentSkills.skillRemoved', { name: effective.name }));
227621
+ }
227622
+ catch (_a) {
227623
+ toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: effective.name }));
227624
+ }
227625
+ };
227502
227626
  const openNewSkillDialog = () => {
227503
227627
  resetForm();
227504
227628
  setShowNewDialog(true);
227505
227629
  };
227506
227630
  const openEditSkillDialog = (skill) => {
227631
+ var _a;
227507
227632
  setForm({
227508
227633
  name: skill.name,
227509
227634
  slug: skill.slug,
227510
227635
  description: skill.description,
227511
227636
  version: skill.version,
227637
+ category: (_a = skill.category) !== null && _a !== void 0 ? _a : '',
227512
227638
  instruction: skill.instruction,
227639
+ privateToAgent: skill.mentor === mentorUniqueId,
227513
227640
  });
227514
227641
  setEditingSkill(skill);
227515
227642
  };
@@ -227530,6 +227657,8 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227530
227657
  slug: form.slug,
227531
227658
  description: form.description,
227532
227659
  version: form.version || '1.0.0',
227660
+ ...(form.category && { category: form.category }),
227661
+ ...(form.privateToAgent && { mentor: mentorUniqueId }),
227533
227662
  instruction: form.instruction,
227534
227663
  enabled: true,
227535
227664
  }).unwrap();
@@ -227555,6 +227684,7 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227555
227684
  slug: form.slug,
227556
227685
  description: form.description,
227557
227686
  version: form.version,
227687
+ category: form.category,
227558
227688
  instruction: form.instruction,
227559
227689
  }).unwrap();
227560
227690
  toast.success(t('clawSandboxAgentSkills.skillUpdated'));
@@ -227576,32 +227706,169 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227576
227706
  toast.error(t('clawSandboxAgentSkills.failedToDeleteSkill'));
227577
227707
  }
227578
227708
  };
227709
+ const renderBadges = (skill, effective) => {
227710
+ var _a, _b, _c;
227711
+ const category = (_a = effective === null || effective === void 0 ? void 0 : effective.category) !== null && _a !== void 0 ? _a : skill === null || skill === void 0 ? void 0 : skill.category;
227712
+ const skillType = (_b = effective === null || effective === void 0 ? void 0 : effective.skill_type) !== null && _b !== void 0 ? _b : skill === null || skill === void 0 ? void 0 : skill.skill_type;
227713
+ const isFeatured = (_c = effective === null || effective === void 0 ? void 0 : effective.is_featured) !== null && _c !== void 0 ? _c : skill === null || skill === void 0 ? void 0 : skill.is_featured;
227714
+ return (jsxs("span", { className: "flex flex-wrap items-center gap-1", children: [category && (jsx("span", { className: "rounded-full bg-gray-100 px-2 py-0.5 text-[0.625rem] text-gray-500", children: category })), skillType === 'native' && (jsx("span", { className: "rounded-full bg-purple-50 px-2 py-0.5 text-[0.625rem] text-purple-600", children: t('clawSandboxAgentSkills.nativeBadge') })), isFeatured && (jsx("span", { className: "rounded-full bg-amber-50 px-2 py-0.5 text-[0.625rem] text-amber-600", children: t('clawSandboxAgentSkills.featuredBadge') })), (effective === null || effective === void 0 ? void 0 : effective.origin) === 'private' && (jsx("span", { className: "rounded-full bg-blue-50 px-2 py-0.5 text-[0.625rem] text-blue-600", children: t('clawSandboxAgentSkills.privateBadge') }))] }));
227715
+ };
227716
+ const renderSkillMenu = (skill, effective) => {
227717
+ var _a, _b;
227718
+ const editable = isSkillEditable(skill);
227719
+ const showEdit = editable;
227720
+ const showDelete = editable;
227721
+ const detachable = (effective === null || effective === void 0 ? void 0 : effective.origin) === 'assignment';
227722
+ if (!showEdit && !showDelete && !detachable)
227723
+ return null;
227724
+ const name = (_b = (_a = effective === null || effective === void 0 ? void 0 : effective.name) !== null && _a !== void 0 ? _a : skill === null || skill === void 0 ? void 0 : skill.name) !== null && _b !== void 0 ? _b : '';
227725
+ return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsx(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxAgentSkills.skillActions', { name }), children: jsx(Ellipsis, { className: "h-4 w-4" }) }) }), jsxs(DropdownMenuContent, { align: "end", children: [detachable && (jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => effective && handleDetach(effective), children: [jsx(CircleMinus$1, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.removeFromAgent')] })), showEdit && skill && (jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => openEditSkillDialog(skill), children: [jsx(Pen, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.edit')] })), showDelete && skill && (jsxs(DropdownMenuItem, { variant: "destructive", className: "cursor-pointer", onClick: () => setDeletingSkill(skill), children: [jsx(Trash2, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.delete')] }))] })] }));
227726
+ };
227579
227727
  if (isLoading) {
227580
227728
  return (jsxs("div", { className: "flex items-center gap-2 p-4", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.loadingSkills') })] }));
227581
227729
  }
227582
- return (jsxs("div", { className: "space-y-4", "data-testid": "agent-skills-content", children: [jsx("div", { className: "flex items-center justify-end", children: jsxs(Button$1, { onClick: openNewSkillDialog, size: "sm", className: "cursor-pointer bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: [jsx(Plus, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.newSkill')] }) }), skills.length === 0 ? (jsx("div", { className: "flex items-center justify-center rounded-lg border p-6", children: jsx("p", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.noSkillsAvailable') }) })) : (jsx("div", { className: "space-y-6", children: skills.map((skill) => {
227583
- var _a;
227584
- const assignment = assignmentsBySkillUniqueId.get(skill.unique_id);
227585
- const isEnabled = (_a = assignment === null || assignment === void 0 ? void 0 : assignment.enabled) !== null && _a !== void 0 ? _a : false;
227586
- return (jsxs("div", { className: "flex items-center justify-between rounded-lg border p-6", children: [jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: skill.name }), skill.description && (jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('clawSandboxAgentSkills.moreInfoAbout', {
227587
- name: skill.name,
227588
- }), children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "ibl-tooltip-content", children: jsx("p", { children: skill.description }) })] }) })), jsxs("span", { className: "hidden sm:inline text-xs text-gray-400", children: ["v", skill.version] })] }), jsxs("div", { className: "flex items-center gap-2", children: [jsx(Switch, { checked: isEnabled, onCheckedChange: (checked) => handleToggle(skill, checked), disabled: isTogglingMentorSkill, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": t(isEnabled
227589
- ? 'clawSandboxAgentSkills.skillEnabledLabel'
227590
- : 'clawSandboxAgentSkills.skillDisabledLabel', { name: skill.name }) }), jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsx(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxAgentSkills.skillActions', {
227591
- name: skill.name,
227592
- }), children: jsx(Ellipsis, { className: "h-4 w-4" }) }) }), jsxs(DropdownMenuContent, { align: "end", children: [jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => openEditSkillDialog(skill), children: [jsx(Pen, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.edit')] }), jsxs(DropdownMenuItem, { variant: "destructive", className: "cursor-pointer", onClick: () => setDeletingSkill(skill), children: [jsx(Trash2, { className: "mr-2 h-4 w-4" }), t('clawSandboxAgentSkills.delete')] })] })] })] })] }, skill.id));
227593
- }) })), jsxs(OverlayModal, { open: showNewDialog, onClose: closeAllDialogs, title: t('clawSandboxAgentSkills.newSkillDialogTitle'), className: "max-w-2xl", children: [jsx(SkillForm, { form: form, onChange: setForm }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: closeAllDialogs, children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleCreateSkill, disabled: isCreatingSkill || !form.name || !form.slug, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isCreatingSkill
227594
- ? t('clawSandboxAgentSkills.creating')
227595
- : t('clawSandboxAgentSkills.create') })] })] }), jsxs(OverlayModal, { open: !!editingSkill, onClose: closeAllDialogs, title: t('clawSandboxAgentSkills.editSkillDialogTitle'), className: "max-w-2xl", children: [jsx(SkillForm, { form: form, onChange: setForm }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: closeAllDialogs, children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleUpdateSkill, disabled: isUpdatingSkill || !form.name || !form.slug, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isUpdatingSkill
227596
- ? t('clawSandboxAgentSkills.saving')
227597
- : t('clawSandboxAgentSkills.save') })] })] }), jsxs(OverlayModal, { open: !!deletingSkill, onClose: () => setDeletingSkill(null), title: t('clawSandboxAgentSkills.deleteSkillDialogTitle'), className: "max-w-md", children: [jsx("p", { className: "mt-2 text-sm text-gray-600", children: t('clawSandboxAgentSkills.deleteConfirmation', { name: (_a = deletingSkill === null || deletingSkill === void 0 ? void 0 : deletingSkill.name) !== null && _a !== void 0 ? _a : '' }) }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setDeletingSkill(null), children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleDeleteSkill, disabled: isDeletingSkill, className: "bg-red-600 text-white hover:bg-red-700", children: isDeletingSkill
227730
+ return (jsxs("div", { className: "space-y-4", "data-testid": "agent-skills-content", children: [jsxs("div", { className: "flex items-start justify-between gap-4", children: [jsxs("p", { className: "flex items-start gap-2 text-xs text-gray-500", children: [jsx(Info$3, { className: "mt-0.5 h-4 w-4 shrink-0 text-gray-400" }), jsx("span", { children: t('clawSandboxAgentSkills.sessionNote') })] }), jsxs(Button$1, { onClick: openNewSkillDialog, size: "sm", className: "shrink-0 cursor-pointer bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: [jsx(Plus, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.newSkill')] })] }), jsxs("div", { className: "space-y-2", children: [jsx("h3", { className: "text-sm font-semibold text-gray-700", children: t('clawSandboxAgentSkills.effectiveHeading') }), effectiveSkills.length === 0 ? (jsx("div", { className: "flex items-center justify-center rounded-lg border p-6", children: jsx("p", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.noEffectiveSkills') }) })) : (jsx("div", { className: "space-y-3", children: effectiveSkills.map((effective) => {
227731
+ var _a;
227732
+ return (jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border p-4", children: [jsxs("div", { className: "min-w-0 space-y-1", children: [jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: effective.name }), ((_a = effective.skill) === null || _a === void 0 ? void 0 : _a.version) && (jsxs("span", { className: "hidden text-xs text-gray-400 sm:inline", children: ["v", effective.skill.version] })), renderBadges(effective.skill, effective)] }), effective.description && (jsx("p", { className: "line-clamp-2 text-xs text-gray-500", children: effective.description }))] }), jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [jsx(Switch, { checked: effective.enabled, onCheckedChange: (checked) => handleToggleEffective(effective, checked), disabled: isMutatingAgentSkill, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": t(effective.enabled
227733
+ ? 'clawSandboxAgentSkills.skillEnabledLabel'
227734
+ : 'clawSandboxAgentSkills.skillDisabledLabel', { name: effective.name }) }), renderSkillMenu(effective.skill, effective)] })] }, effective.unique_id));
227735
+ }) }))] }), jsxs("div", { className: "space-y-2", children: [jsx("h3", { className: "text-sm font-semibold text-gray-700", children: t('clawSandboxAgentSkills.catalogHeading') }), attachableSkills.length === 0 ? (jsx("div", { className: "flex items-center justify-center rounded-lg border p-6", children: jsx("p", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.noSkillsAvailable') }) })) : (jsx("div", { className: "space-y-3", children: attachableSkills.map((skill) => (jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border p-4", children: [jsxs("div", { className: "min-w-0 space-y-1", children: [jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: skill.name }), jsxs("span", { className: "hidden text-xs text-gray-400 sm:inline", children: ["v", skill.version] }), renderBadges(skill)] }), skill.description && (jsx("p", { className: "line-clamp-2 text-xs text-gray-500", children: skill.description }))] }), jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "cursor-pointer", disabled: isMutatingAgentSkill, onClick: () => handleAttach(skill), "aria-label": t('clawSandboxAgentSkills.addToAgentLabel', { name: skill.name }), children: [jsx(Plus, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.addToAgent')] }), renderSkillMenu(skill)] })] }, skill.id))) }))] }), jsx(OverlayModal, { open: showNewDialog, onClose: closeAllDialogs, title: t('clawSandboxAgentSkills.newSkillDialogTitle'), className: "max-w-2xl", children: jsxs("div", { className: "flex h-[min(75dvh,46rem)] flex-col", children: [jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto pb-4 pr-1", children: [jsx(SkillForm, { form: form, onChange: setForm, showPrivateToggle: true }), jsx("p", { className: "text-xs text-gray-500", children: t('clawSandboxAgentSkills.filesAfterCreateHint') })] }), jsxs("div", { className: "flex justify-end gap-2 border-t pt-4", children: [jsx(Button$1, { variant: "outline", onClick: closeAllDialogs, children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleCreateSkill, disabled: isCreatingSkill || !form.name || !form.slug, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isCreatingSkill
227736
+ ? t('clawSandboxAgentSkills.creating')
227737
+ : t('clawSandboxAgentSkills.create') })] })] }) }), jsx(OverlayModal, { open: !!editingSkill, onClose: closeAllDialogs, title: t('clawSandboxAgentSkills.editSkillDialogTitle'), className: "max-w-2xl", children: jsxs(Tabs, { defaultValue: "details", className: "w-full", children: [jsxs(TabsList, { "aria-label": t('clawSandboxAgentSkills.editSkillDialogTitle'), "data-testid": "skill-dialog-tabs", children: [jsx(TabsTrigger, { value: "details", "data-testid": "skill-dialog-tab-details", children: t('clawSandboxAgentSkills.detailsTab') }), jsx(TabsTrigger, { value: "files", "data-testid": "skill-dialog-tab-files", children: t('clawSandboxAgentSkills.filesTab') })] }), jsx(TabsContent, { value: "details", children: jsxs("div", { className: "flex h-[min(75dvh,46rem)] flex-col", children: [jsx("div", { className: "flex-1 space-y-4 overflow-y-auto pb-4 pr-1", children: jsx(SkillForm, { form: form, onChange: setForm }) }), jsxs("div", { className: "flex justify-end gap-2 border-t pt-4", children: [jsx(Button$1, { variant: "outline", onClick: closeAllDialogs, children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleUpdateSkill, disabled: isUpdatingSkill || !form.name || !form.slug, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isUpdatingSkill
227738
+ ? t('clawSandboxAgentSkills.saving')
227739
+ : t('clawSandboxAgentSkills.save') })] })] }) }), jsx(TabsContent, { value: "files", children: jsx("div", { className: "flex h-[min(75dvh,46rem)] flex-col", children: jsx("div", { className: "flex-1 space-y-4 overflow-y-auto pb-4 pr-1", children: editingSkill && (jsx(SkillResourcesSection, { platformKey: platformKey, skillId: editingSkill.id })) }) }) })] }) }), jsxs(OverlayModal, { open: !!deletingSkill, onClose: () => setDeletingSkill(null), title: t('clawSandboxAgentSkills.deleteSkillDialogTitle'), className: "max-w-md", children: [jsx("p", { className: "mt-2 text-sm text-gray-600", children: t('clawSandboxAgentSkills.deleteConfirmation', { name: (_a = deletingSkill === null || deletingSkill === void 0 ? void 0 : deletingSkill.name) !== null && _a !== void 0 ? _a : '' }) }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setDeletingSkill(null), children: t('clawSandboxAgentSkills.cancel') }), jsx(Button$1, { onClick: handleDeleteSkill, disabled: isDeletingSkill, className: "bg-red-600 text-white hover:bg-red-700", children: isDeletingSkill
227598
227740
  ? t('clawSandboxAgentSkills.deleting')
227599
227741
  : t('clawSandboxAgentSkills.delete') })] })] })] }));
227600
227742
  }
227601
227743
  // ── Shared Skill Form ────────────────────────────────────────────────────────
227602
- function SkillForm({ form, onChange, }) {
227744
+ function SkillForm({ form, onChange, showPrivateToggle = false, }) {
227603
227745
  const t = useT();
227604
- return (jsxs("div", { className: "mt-4 grid gap-4", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-name", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldName') }), jsx(Input, { id: "skill-name", name: "skill-name", value: form.name, onChange: (e) => onChange({ ...form, name: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldNamePlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-slug", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldSlug') }), jsx(Input, { id: "skill-slug", name: "skill-slug", value: form.slug, onChange: (e) => onChange({ ...form, slug: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldSlugPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-version", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldVersion') }), jsx(Input, { id: "skill-version", name: "skill-version", value: form.version, onChange: (e) => onChange({ ...form, version: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldVersionPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-description", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldDescription') }), jsx(Input, { id: "skill-description", name: "skill-description", value: form.description, onChange: (e) => onChange({ ...form, description: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldDescriptionPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2 overflow-hidden", children: [jsx(Label$2, { htmlFor: "skill-instruction", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldInstruction') }), jsx(RichTextEditor, { value: form.instruction, onChange: (value) => onChange({ ...form, instruction: value }) })] })] }));
227746
+ return (jsxs("div", { className: "mt-4 grid gap-4", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-name", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldName') }), jsx(Input, { id: "skill-name", name: "skill-name", value: form.name, onChange: (e) => onChange({ ...form, name: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldNamePlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-slug", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldSlug') }), jsx(Input, { id: "skill-slug", name: "skill-slug", value: form.slug, onChange: (e) => onChange({ ...form, slug: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldSlugPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-version", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldVersion') }), jsx(Input, { id: "skill-version", name: "skill-version", value: form.version, onChange: (e) => onChange({ ...form, version: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldVersionPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-category", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldCategory') }), jsx(Input, { id: "skill-category", name: "skill-category", value: form.category, onChange: (e) => onChange({ ...form, category: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldCategoryPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "skill-description", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldDescription') }), jsx(Input, { id: "skill-description", name: "skill-description", value: form.description, onChange: (e) => onChange({ ...form, description: e.target.value }), placeholder: t('clawSandboxAgentSkills.fieldDescriptionPlaceholder'), className: "py-6" })] }), showPrivateToggle && (jsxs("div", { className: "flex items-center justify-between rounded-lg border p-4", children: [jsxs("div", { className: "space-y-1", children: [jsx(Label$2, { htmlFor: "skill-private", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.privateToAgent') }), jsx("p", { className: "text-xs text-gray-500", children: t('clawSandboxAgentSkills.privateToAgentHint') })] }), jsx(Switch, { id: "skill-private", checked: form.privateToAgent, onCheckedChange: (checked) => onChange({ ...form, privateToAgent: checked }), className: "cursor-pointer data-[state=checked]:bg-blue-500" })] })), jsxs("div", { className: "space-y-2 overflow-hidden", children: [jsx(Label$2, { htmlFor: "skill-instruction", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxAgentSkills.fieldInstruction') }), jsx("p", { className: "text-xs text-gray-500", children: t('clawSandboxAgentSkills.instructionHint') }), jsx(RichTextEditor, { value: form.instruction, onChange: (value) => onChange({ ...form, instruction: value }) })] })] }));
227747
+ }
227748
+
227749
+ /** Distance (px) from the list bottom at which the next page is requested. */
227750
+ const LOAD_MORE_THRESHOLD_PX = 48;
227751
+ /**
227752
+ * Listbox half of the chat `/` skill combobox. The composer textarea owns
227753
+ * focus and keyboard handling (see `useSlashSkillPicker`); options here are
227754
+ * referenced via `aria-activedescendant` and selected on click. Scrolling
227755
+ * near the bottom lazily loads the next page of skills.
227756
+ */
227757
+ function SlashSkillPicker({ skills, activeIndex, listboxId, onSelect, onActiveIndexChange, isLoading = false, isFetchingMore = false, hasMore = false, onLoadMore, }) {
227758
+ const t = useT();
227759
+ const listRef = useRef(null);
227760
+ // Keep the active option scrolled into view during arrow-key browsing.
227761
+ useEffect(() => {
227762
+ var _a;
227763
+ const option = (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.children[activeIndex];
227764
+ option === null || option === void 0 ? void 0 : option.scrollIntoView({ block: 'nearest' });
227765
+ }, [activeIndex]);
227766
+ if (skills.length === 0 && !isLoading)
227767
+ return null;
227768
+ const handleScroll = (event) => {
227769
+ if (!hasMore || isFetchingMore || !onLoadMore)
227770
+ return;
227771
+ const el = event.currentTarget;
227772
+ if (el.scrollTop + el.clientHeight >= el.scrollHeight - LOAD_MORE_THRESHOLD_PX) {
227773
+ onLoadMore();
227774
+ }
227775
+ };
227776
+ return (jsxs("div", { className: "absolute right-0 bottom-full left-0 z-50 mb-2", children: [jsx("div", { "aria-live": "polite", className: "sr-only", children: isLoading
227777
+ ? t('slashSkillPicker.loading')
227778
+ : t('slashSkillPicker.resultsAnnouncement', { count: skills.length }) }), isLoading ? (jsxs("div", { role: "status", className: "flex items-center gap-2 rounded-xl border border-gray-200 bg-white px-3 py-3 shadow-lg", "data-testid": "slash-skill-picker-loading", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-sm text-gray-500", children: t('slashSkillPicker.loading') })] })) : (jsxs("ul", { ref: listRef, id: listboxId, role: "listbox", "aria-label": t('slashSkillPicker.listLabel'), onScroll: handleScroll, className: "max-h-64 overflow-y-auto rounded-xl border border-gray-200 bg-white p-1 shadow-lg", "data-testid": "slash-skill-picker", children: [skills.map((skill, index) => (jsxs("li", { id: `${listboxId}-option-${index}`, role: "option", "aria-selected": index === activeIndex, className: cn('flex cursor-pointer flex-col gap-0.5 rounded-lg px-3 py-2', index === activeIndex ? 'bg-blue-50' : 'hover:bg-gray-50'), onMouseEnter: () => onActiveIndexChange(index),
227779
+ // onMouseDown so selection wins over the textarea losing focus.
227780
+ onMouseDown: (e) => {
227781
+ e.preventDefault();
227782
+ onSelect(skill);
227783
+ }, children: [jsxs("span", { className: "flex items-baseline gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-800", children: skill.name }), jsxs("span", { className: "text-xs text-gray-400", children: ["/", skill.slug] }), skill.category && (jsx("span", { className: "ml-auto rounded-full bg-gray-100 px-2 py-0.5 text-[0.625rem] text-gray-500", children: skill.category }))] }), skill.description && (jsx("span", { className: "line-clamp-2 text-xs text-gray-500", children: skill.description }))] }, skill.unique_id))), isFetchingMore && (jsxs("li", { role: "presentation", className: "flex items-center gap-2 px-3 py-2", "data-testid": "slash-skill-picker-loading-more", children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-blue-500" }), jsx("span", { className: "text-xs text-gray-500", children: t('slashSkillPicker.loading') })] }))] }))] }));
227784
+ }
227785
+
227786
+ /** Matches a composer value that is a single `/`-prefixed token (no whitespace). */
227787
+ const SLASH_TOKEN_RE = /^\/\S*$/;
227788
+ /** Whether the composer text is a `/` skill token (single word, leading slash). */
227789
+ function isSlashCommandToken(value) {
227790
+ return SLASH_TOKEN_RE.test(value);
227791
+ }
227792
+ /**
227793
+ * State machine for the chat `/` skill picker. Opens while the composer holds
227794
+ * a single `/`-prefixed token and at least one enabled skill matches; `Esc`
227795
+ * dismisses until the token is cleared, so plain text starting with `/` is
227796
+ * never blocked.
227797
+ */
227798
+ function useSlashSkillPicker({ inputValue, setInputValue, skills, isLoading = false, }) {
227799
+ const listboxId = useId$2();
227800
+ const [dismissed, setDismissed] = useState(false);
227801
+ const [activeIndex, setActiveIndex] = useState(0);
227802
+ const isSlashToken = SLASH_TOKEN_RE.test(inputValue);
227803
+ const query = isSlashToken ? inputValue.slice(1) : '';
227804
+ const filteredSkills = useMemo(() => (isSlashToken ? filterSlashSkills(skills, query) : []), [isSlashToken, skills, query]);
227805
+ // Loading keeps the picker open (with a loading row) so the user knows
227806
+ // something is coming; once loaded, zero matches closes it.
227807
+ const open = isSlashToken && !dismissed && (filteredSkills.length > 0 || isLoading);
227808
+ // Re-arm the picker once the slash token is gone (text sent or cleared).
227809
+ useEffect(() => {
227810
+ if (!isSlashToken && dismissed)
227811
+ setDismissed(false);
227812
+ }, [isSlashToken, dismissed]);
227813
+ // Keep the active option valid as the query narrows the list.
227814
+ const filteredLength = filteredSkills.length;
227815
+ const previousLength = useRef(filteredLength);
227816
+ useEffect(() => {
227817
+ if (previousLength.current !== filteredLength) {
227818
+ previousLength.current = filteredLength;
227819
+ setActiveIndex(0);
227820
+ }
227821
+ }, [filteredLength]);
227822
+ const selectSkill = (skill) => {
227823
+ setInputValue(`/${skill.slug} `);
227824
+ setActiveIndex(0);
227825
+ };
227826
+ const handleKeyDown = (event) => {
227827
+ if (!open)
227828
+ return false;
227829
+ switch (event.key) {
227830
+ case 'ArrowDown':
227831
+ if (!filteredSkills.length)
227832
+ return false;
227833
+ event.preventDefault();
227834
+ setActiveIndex((index) => (index + 1) % filteredSkills.length);
227835
+ return true;
227836
+ case 'ArrowUp':
227837
+ if (!filteredSkills.length)
227838
+ return false;
227839
+ event.preventDefault();
227840
+ setActiveIndex((index) => (index - 1 + filteredSkills.length) % filteredSkills.length);
227841
+ return true;
227842
+ case 'Enter':
227843
+ if (event.shiftKey || !filteredSkills.length)
227844
+ return false;
227845
+ event.preventDefault();
227846
+ selectSkill(filteredSkills[activeIndex]);
227847
+ return true;
227848
+ case 'Tab':
227849
+ if (!filteredSkills.length)
227850
+ return false;
227851
+ event.preventDefault();
227852
+ selectSkill(filteredSkills[activeIndex]);
227853
+ return true;
227854
+ case 'Escape':
227855
+ event.preventDefault();
227856
+ setDismissed(true);
227857
+ return true;
227858
+ default:
227859
+ return false;
227860
+ }
227861
+ };
227862
+ return {
227863
+ open,
227864
+ filteredSkills,
227865
+ activeIndex,
227866
+ setActiveIndex,
227867
+ listboxId,
227868
+ activeOptionId: open && filteredSkills.length > 0 ? `${listboxId}-option-${activeIndex}` : undefined,
227869
+ selectSkill,
227870
+ handleKeyDown,
227871
+ };
227605
227872
  }
227606
227873
 
227607
227874
  /**
@@ -229066,7 +229333,7 @@ const CSS_CLASS_NAMES = {
229066
229333
  STOP_STREAMING_BUTTON: 'chat-stop-streaming-button',
229067
229334
  }};
229068
229335
 
229069
- const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmit, disabled = false, placeholder = '', sessionId = null, isPreviewMode = false, textAreaRows = 3, className = '', style = {}, allowAnonymousAccess = false, embedMode = false, ...props }) => {
229336
+ const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmit, onComposerKeyDown, disabled = false, placeholder = '', sessionId = null, isPreviewMode = false, textAreaRows = 3, className = '', style = {}, allowAnonymousAccess = false, embedMode = false, ...props }) => {
229070
229337
  const textareaRef = useRef(null);
229071
229338
  const [isResizing, setIsResizing] = useState(false);
229072
229339
  const numberOfMessages = useSelector(selectNumberOfActiveChatMessages);
@@ -229114,6 +229381,8 @@ const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmi
229114
229381
  const handleKeyDown = (e) => {
229115
229382
  if (isPreviewMode && !allowAnonymousAccess)
229116
229383
  return;
229384
+ if (onComposerKeyDown === null || onComposerKeyDown === void 0 ? void 0 : onComposerKeyDown(e))
229385
+ return;
229117
229386
  if (e.key === 'Enter' && !e.shiftKey) {
229118
229387
  e.preventDefault();
229119
229388
  if (value.trim() || allowEmptySubmit) {
@@ -229388,8 +229657,53 @@ function MemoryButton({ mentorId, tenantKey, username }) {
229388
229657
  } }))] }) }), jsx(PopoverContent, { className: "w-96 rounded-lg border border-gray-200 bg-white p-0 shadow-xl", children: jsx(MemoryMenu, { onClose: () => setIsOpen(false), mentorId: mentorId, tenantKey: tenantKey, username: username }) })] }));
229389
229658
  }
229390
229659
 
229660
+ // Cowork is macOS-only in prod; the env flag bypasses the OS check so the
229661
+ // toggle can be exercised on Linux/Windows desktop builds during testing.
229662
+ const isMacOS = () => {
229663
+ if (typeof navigator === 'undefined')
229664
+ return false;
229665
+ return /mac/i.test(navigator.userAgent || '');
229666
+ };
229667
+ const allowNonMacOSCowork = () => process.env.NEXT_PUBLIC_ALLOW_NON_MACOS_COMPUTER_USE_TOGGLE === 'true';
229668
+ // 14GB floor per spec; modelSupportsCowork gates size > gb, so a model of
229669
+ // exactly 14GB is also off (no 14.0GB model in the catalog). Only the local-model
229670
+ // backend needs this; the remote AI has no size requirement.
229671
+ const COWORK_MIN_MODEL_GB = 14;
229391
229672
  const InsideButtons = ({ activeOptions, onOptionClick, deepResearch, studyMode, artifactsEnabled, containerWidth, disabled = false, onOpenPromptGallery, embedMode = false, promptsIsEnabled = false, memoryEnabled = false, mentorId, tenantKey, username, }) => {
229392
229673
  const t = useT();
229674
+ // Cowork = the Tauri GhostOS assistant. GhostOS runs the tools on-device;
229675
+ // the "brain" is EITHER a large local model (Local Models / Ollama) OR the
229676
+ // remote AI (DM OpenAI-compatible endpoint), whichever is set up. useGhostOs
229677
+ // handles install/stop; the localStorage pref (isCoworkEnabled) is read
229678
+ // by the chat hook to route the turn. Reads the pref on mount.
229679
+ // Local state is `coworkOn` so it doesn't shadow the imported setCoworkEnabled.
229680
+ const ghostOs = useGhostOs();
229681
+ const [coworkOn, setCoworkOn] = useState(isCoworkEnabled);
229682
+ const toggleCowork = () => {
229683
+ const next = !coworkOn;
229684
+ // Guard only when turning on. Cowork runs on either a large local model
229685
+ // or the remote AI — allow enabling when either backend is ready (the local
229686
+ // model + Cowork combo still works). The chatbox has no inline notice
229687
+ // space, so remind via toast. (RBAC is enforced separately: this button is
229688
+ // `disabled` when the user lacks the mentor `#chat` permission — see
229689
+ // chat-input-form's isChatDisabledByRbac.)
229690
+ if (next) {
229691
+ const localReady = isLocalLLMEnabled() &&
229692
+ modelSupportsCowork(getLocalLLMModel(), COWORK_MIN_MODEL_GB);
229693
+ if (!localReady && !hasRemoteAiConfig()) {
229694
+ toast.warning(isLocalLLMEnabled()
229695
+ ? t('chatInputFormInsideButtons.coworkModelTooSmall')
229696
+ : t('chatInputFormInsideButtons.coworkNeedsBackend'));
229697
+ return;
229698
+ }
229699
+ }
229700
+ setCoworkOn(next);
229701
+ setCoworkEnabled(next);
229702
+ if (next)
229703
+ ghostOs.install();
229704
+ else
229705
+ ghostOs.stop();
229706
+ };
229393
229707
  const allInsideButtons = [
229394
229708
  {
229395
229709
  name: 'Canvas',
@@ -229433,6 +229747,14 @@ const InsideButtons = ({ activeOptions, onOptionClick, deepResearch, studyMode,
229433
229747
  action: /* istanbul ignore next */ () => onOptionClick(TOOLS.MEMORY),
229434
229748
  isEnabled: memoryEnabled && !embedMode && !!username,
229435
229749
  },
229750
+ {
229751
+ name: 'Cowork',
229752
+ label: t('chatInputFormInsideButtons.cowork'),
229753
+ icon: jsx(Monitor, { className: "h-4 w-4" }),
229754
+ isActive: coworkOn,
229755
+ action: toggleCowork,
229756
+ isEnabled: ghostOs.isAvailable && (isMacOS() || allowNonMacOSCowork()),
229757
+ },
229436
229758
  ].filter((item) => item.isEnabled);
229437
229759
  // Get visible inside buttons based on screen size
229438
229760
  // Active buttons are always visible, inactive ones are hidden based on available width
@@ -229950,7 +230272,7 @@ function SubmitMessageButton({ isPreviewMode, allowAnonymousAccess, isUploading,
229950
230272
  const PromptGalleryModal$1 = dynamic(() => Promise.resolve().then(function () { return promptGalleryModal; }).then((mod) => mod.PromptGalleryModal), {
229951
230273
  ssr: false,
229952
230274
  });
229953
- function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpen, onPhoneCallClick, sessionId, stopGenerating, mentorId, tenantKey, isPublicRoute, userIsStudent, username, isPreviewMode, enableWebBrowsing, isStreaming, updateSessionTools, setSessionTools, activeTools, screenSharing, deepResearch, studyMode, imageGeneration, codeInterpreter, promptsIsEnabled, googleSlidesIsEnabled, googleDocumentIsEnabled, artifactsEnabled, compactMode = false, chatAreaMaxWidth, isConnecting = false, stopStreamingButtonRef, }) {
230275
+ function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpen, onPhoneCallClick, sessionId, stopGenerating, mentorId, tenantKey, isPublicRoute, userIsStudent, username, isPreviewMode, enableWebBrowsing, isStreaming, updateSessionTools, setSessionTools, activeTools, screenSharing, deepResearch, studyMode, imageGeneration, codeInterpreter, promptsIsEnabled, googleSlidesIsEnabled, googleDocumentIsEnabled, artifactsEnabled, compactMode = false, chatAreaMaxWidth, isConnecting = false, stopStreamingButtonRef, slashSkills, slashSkillsLoading = false, }) {
229954
230276
  var _a, _b, _c, _d, _e;
229955
230277
  const t = useT();
229956
230278
  const dispatch = useDispatch();
@@ -230004,6 +230326,15 @@ function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpe
230004
230326
  const setInputValue = (input) => {
230005
230327
  dispatch(chatInputSliceActions.setTextareaInput(input));
230006
230328
  };
230329
+ // `/` skill picker — active only when the host supplies the agent's
230330
+ // effective skills (or reports them loading). No fetching happens here.
230331
+ const effectiveSlashSkills = slashSkills !== null && slashSkills !== void 0 ? slashSkills : [];
230332
+ const slashPicker = useSlashSkillPicker({
230333
+ inputValue,
230334
+ setInputValue,
230335
+ skills: effectiveSlashSkills,
230336
+ isLoading: slashSkillsLoading,
230337
+ });
230007
230338
  const handleSelectPrompt = (promptText) => {
230008
230339
  setInputValue(promptText);
230009
230340
  setIsPromptGalleryOpen(false);
@@ -230068,9 +230399,18 @@ function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpe
230068
230399
  }
230069
230400
  return persistentChatInputLabel ? '' : t('chatInputForm.askAnything');
230070
230401
  };
230071
- return (jsxs(Fragment$1, { children: [isTabletOrMobile && !isPreviewMode && !embedMode && !compactMode && (jsx("div", { className: "mx-auto flex w-full justify-end pt-4 pl-4", style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: jsx(RetrievedDocumentsButton, { sessionId: sessionId }) })), ((_c = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _c === void 0 ? void 0 : _c.disclaimer) && !compactMode && (jsx("div", { className: "mx-auto mt-1 w-full pb-1", style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: jsx("p", { id: "chat-input-disclaimer", className: "text-center text-[0.625rem] text-gray-500 italic", children: (_d = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _d === void 0 ? void 0 : _d.disclaimer }) })), jsxs("form", { ref: containerRef, onSubmit: handleSubmit, className: cn('mx-auto mt-4 w-full pb-2', CSS_CLASS_NAMES.CHAT.TEXTAREA), style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: [jsxs("div", { className: "relative overflow-hidden rounded-2xl border border-gray-200 bg-[#fbfbfb] pb-3 shadow-xs", children: [jsx(FileAttachmentsList, { attachedFiles: attachedFiles, onRemoveFile: handleRemoveFile, onRetryFile: retryUpload }), fileAddedNotification && (jsxs("div", { className: "animate-in slide-in-from-bottom-5 absolute top-0 right-0 left-0 -mt-10 flex items-center gap-2 rounded-md bg-blue-50 p-2 text-xs text-blue-600 duration-300", children: [jsx(FileText, { className: "h-3 w-3" }), jsx("span", { className: "truncate", children: fileAddedNotification })] })), jsxs("div", { className: "grid", children: [jsx("label", { id: "chat-input-label", htmlFor: "chat-input-textarea", className: cn(persistentChatInputLabel
230402
+ return (jsxs(Fragment$1, { children: [isTabletOrMobile && !isPreviewMode && !embedMode && !compactMode && (jsx("div", { className: "mx-auto flex w-full justify-end pt-4 pl-4", style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: jsx(RetrievedDocumentsButton, { sessionId: sessionId }) })), ((_c = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _c === void 0 ? void 0 : _c.disclaimer) && !compactMode && (jsx("div", { className: "mx-auto mt-1 w-full pb-1", style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: jsx("p", { id: "chat-input-disclaimer", className: "text-center text-[0.625rem] text-gray-500 italic", children: (_d = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _d === void 0 ? void 0 : _d.disclaimer }) })), jsxs("form", { ref: containerRef, onSubmit: handleSubmit, className: cn('relative mx-auto mt-4 w-full pb-2', CSS_CLASS_NAMES.CHAT.TEXTAREA), style: chatAreaMaxWidth ? { maxWidth: `${chatAreaMaxWidth}px` } : undefined, children: [slashPicker.open && (jsx(SlashSkillPicker, { skills: slashPicker.filteredSkills, activeIndex: slashPicker.activeIndex, listboxId: slashPicker.listboxId, onSelect: slashPicker.selectSkill, onActiveIndexChange: slashPicker.setActiveIndex, isLoading: slashSkillsLoading })), jsxs("div", { className: "relative overflow-hidden rounded-2xl border border-gray-200 bg-[#fbfbfb] pb-3 shadow-xs", children: [jsx(FileAttachmentsList, { attachedFiles: attachedFiles, onRemoveFile: handleRemoveFile, onRetryFile: retryUpload }), fileAddedNotification && (jsxs("div", { className: "animate-in slide-in-from-bottom-5 absolute top-0 right-0 left-0 -mt-10 flex items-center gap-2 rounded-md bg-blue-50 p-2 text-xs text-blue-600 duration-300", children: [jsx(FileText, { className: "h-3 w-3" }), jsx("span", { className: "truncate", children: fileAddedNotification })] })), jsxs("div", { className: "grid", children: [jsx("label", { id: "chat-input-label", htmlFor: "chat-input-textarea", className: cn(persistentChatInputLabel
230072
230403
  ? 'block px-[18.5px] pt-3 text-xs font-medium text-gray-600'
230073
- : 'sr-only'), children: t('chatInputForm.askAnything') }), jsx(AutoResizeTextarea, { id: "chat-input-textarea", "aria-labelledby": "chat-input-label", "aria-describedby": ((_e = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _e === void 0 ? void 0 : _e.disclaimer) ? 'chat-input-disclaimer' : undefined, value: inputValue, onChange: handleInputChange, onSubmit: handleSubmit, sessionId: sessionId, isPreviewMode: isPreviewMode, textAreaRows: textAreaRows, placeholder: isChatDisabledByRbac ? t('chatInputForm.noChatPermission') : textAreaPlaceholder(), disabled: isChatDisabledByRbac || hasUploadingFiles, allowEmptySubmit: attachedFiles.length > 0, allowAnonymousAccess: isMentorViewableByAnyone || showingSharedChat || !!userIsVisiting, embedMode: embedMode }), jsxs("div", { className: "flex items-center gap-2 px-2", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(UploadMenu, { onFileInputTrigger: () => executeWithTrialCheck(triggerFileInput), disabled: isChatDisabledByRbac || !sessionId, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(InsideButtons, { containerWidth: containerWidth, activeOptions: activeTools, onOptionClick: updateSessionTools, deepResearch: deepResearch, artifactsEnabled: artifactsEnabled, disabled: isChatDisabledByRbac, onOpenPromptGallery: openPromptGallery, embedMode: embedMode, promptsIsEnabled: promptsIsEnabled, studyMode: studyMode, memoryEnabled: mentorSettings.data.memoryEnabled, mentorId: mentorId, tenantKey: tenantKey, username: username })), jsxs("div", { className: "ml-auto flex", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(ScreenSharingButton, { onClick: onScreenSharingClick, isScreenSharingModalOpen: isScreenSharingModalOpen, screenSharing: screenSharing, isPreviewMode: isPreviewMode, disabled: isChatDisabledByRbac })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceChatButton, { isPreviewMode: isPreviewMode, handleMicrophoneBtnClick: () => executeWithTrialCheck(handleMicrophoneBtnClick), processing: processing, recording: recording, disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceCallButton, { isPreviewMode: isPreviewMode, onClick: () => executeWithTrialCheck(onPhoneCallClick), disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), isStreaming ? (jsx(StopStreamingButton, { ref: stopStreamingButtonRef, stopGenerating: stopGenerating })) : (jsx(SubmitMessageButton, { isPreviewMode: isPreviewMode, allowAnonymousAccess: isMentorViewableByAnyone, isUploading: hasUploadingFiles, disabled: isChatDisabledByRbac || !sessionId, isConnecting: isConnecting }))] })] })] }), jsx("input", { type: "file", ref: fileUploadInputRef, className: "hidden", onChange: handleFileInputChange, accept: fileUploadCapabilities.allSupportedTypes.length > 0
230404
+ : 'sr-only'), children: t('chatInputForm.askAnything') }), jsx(AutoResizeTextarea, { id: "chat-input-textarea", "aria-labelledby": "chat-input-label", "aria-describedby": ((_e = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _e === void 0 ? void 0 : _e.disclaimer) ? 'chat-input-disclaimer' : undefined, ...((effectiveSlashSkills.length > 0 || slashPicker.open) && {
230405
+ role: 'combobox',
230406
+ 'aria-expanded': slashPicker.open,
230407
+ 'aria-haspopup': 'listbox',
230408
+ 'aria-controls': slashPicker.open && slashPicker.filteredSkills.length > 0
230409
+ ? slashPicker.listboxId
230410
+ : undefined,
230411
+ 'aria-activedescendant': slashPicker.activeOptionId,
230412
+ 'aria-autocomplete': 'list',
230413
+ }), value: inputValue, onChange: handleInputChange, onSubmit: handleSubmit, onComposerKeyDown: slashPicker.handleKeyDown, sessionId: sessionId, isPreviewMode: isPreviewMode, textAreaRows: textAreaRows, placeholder: isChatDisabledByRbac ? t('chatInputForm.noChatPermission') : textAreaPlaceholder(), disabled: isChatDisabledByRbac || hasUploadingFiles, allowEmptySubmit: attachedFiles.length > 0, allowAnonymousAccess: isMentorViewableByAnyone || showingSharedChat || !!userIsVisiting, embedMode: embedMode }), jsxs("div", { className: "flex items-center gap-2 px-2", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(UploadMenu, { onFileInputTrigger: () => executeWithTrialCheck(triggerFileInput), disabled: isChatDisabledByRbac || !sessionId, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(InsideButtons, { containerWidth: containerWidth, activeOptions: activeTools, onOptionClick: updateSessionTools, deepResearch: deepResearch, artifactsEnabled: artifactsEnabled, disabled: isChatDisabledByRbac, onOpenPromptGallery: openPromptGallery, embedMode: embedMode, promptsIsEnabled: promptsIsEnabled, studyMode: studyMode, memoryEnabled: mentorSettings.data.memoryEnabled, mentorId: mentorId, tenantKey: tenantKey, username: username })), jsxs("div", { className: "ml-auto flex", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(ScreenSharingButton, { onClick: onScreenSharingClick, isScreenSharingModalOpen: isScreenSharingModalOpen, screenSharing: screenSharing, isPreviewMode: isPreviewMode, disabled: isChatDisabledByRbac })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceChatButton, { isPreviewMode: isPreviewMode, handleMicrophoneBtnClick: () => executeWithTrialCheck(handleMicrophoneBtnClick), processing: processing, recording: recording, disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceCallButton, { isPreviewMode: isPreviewMode, onClick: () => executeWithTrialCheck(onPhoneCallClick), disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), isStreaming ? (jsx(StopStreamingButton, { ref: stopStreamingButtonRef, stopGenerating: stopGenerating })) : (jsx(SubmitMessageButton, { isPreviewMode: isPreviewMode, allowAnonymousAccess: isMentorViewableByAnyone, isUploading: hasUploadingFiles, disabled: isChatDisabledByRbac || !sessionId, isConnecting: isConnecting }))] })] })] }), jsx("input", { type: "file", ref: fileUploadInputRef, className: "hidden", onChange: handleFileInputChange, accept: fileUploadCapabilities.allSupportedTypes.length > 0
230074
230414
  ? fileUploadCapabilities.allSupportedTypes.join(',')
230075
230415
  : MENTOR_CHAT_DOCUMENTS_EXTENSIONS.join(','), multiple: true, disabled: isChatDisabledByRbac || !sessionId })] }), visibleToLoggedInUsersOnly && !compactMode && (jsx("div", { className: "flex w-full justify-center", children: jsx(OutsideButtons, { activeOptions: activeTools, onOptionClick: updateSessionTools, setSessionTools: setSessionTools, onCrossClick: updateSessionTools, containerWidth: containerWidth, enableWebBrowsing: enableWebBrowsing, imageGeneration: imageGeneration, codeInterpreter: codeInterpreter, googleSlidesIsEnabled: googleSlidesIsEnabled, googleDocumentIsEnabled: googleDocumentIsEnabled, tenantKey: tenantKey, userId: username, disabled: isChatDisabledByRbac }) }))] }), isPromptGalleryOpen && (jsx(PromptGalleryModal$1, { isOpen: isPromptGalleryOpen, onClose: () => setIsPromptGalleryOpen(false), onSelectPrompt: handleSelectPrompt, mentorId: mentorId, tenantKey: tenantKey, userIsStudent: userIsStudent })), isFreeTrialModalOpen && FreeTrialDialog && (jsx(FreeTrialDialog, { isOpen: isFreeTrialModalOpen, onClose: closeFreeTrialModal }))] }));
230076
230416
  }
@@ -234207,5 +234547,5 @@ var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
234207
234547
  TrainOrDeleteModal: TrainOrDeleteModal
234208
234548
  });
234209
234549
 
234210
- export { ACCESS_COURSE_LABEL, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentSkills, AlertsTab, AnalyticsAuditLogStats, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsLayout, AnalyticsMonetizationStats, AnalyticsOverview, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, BUY_NOW_LABEL, BillingTab, CATALOGS, CREATE_AGENT_LABELS, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_LOCALE, DEFAULT_SYSTEM_CONTROL_REQUIRED_SIZE_GB, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GHOST_OS_REPO_URL, GHOST_OS_TAURI_COMMANDS, GHOST_OS_TAURI_EVENTS, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, Markdown, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_SECTORS, OnboardingShell, OnboardingWizard, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, Spinner, StatCard, StepHeader, SystemControlContent, SystemControlTab, TAURI_COMMANDS, TAURI_EVENTS, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, UpgradePackageModal, UserAvatar, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, availablePlacementExams, findLastResumeBlock, findSequentialParent, flattenVerticalBlocks, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, inBrowserPrint, inIframe, initialGhostOsInstallState, initialModelDownloadState, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSystemControlEnabled, isTauriApp, isValidLocale, components as markdownComponents, modelSupportsSystemControl, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, resolveCreateAgentLabels, sanitizeCss, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, setSystemControlEnabled, smallestSystemControlModel, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useDiscover, useEdxIframe, useFinancial, useGhostOs, useIframeMessageHandler, useLocalStorage, useModelDownload, useMonetization, useOverview, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
234550
+ export { ACCESS_COURSE_LABEL, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentSkills, AlertsTab, AnalyticsAuditLogStats, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsLayout, AnalyticsMonetizationStats, AnalyticsOverview, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, BUY_NOW_LABEL, BillingTab, CATALOGS, CREATE_AGENT_LABELS, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_COWORK_REQUIRED_SIZE_GB, DEFAULT_LOCALE, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GHOST_OS_REPO_URL, GHOST_OS_TAURI_COMMANDS, GHOST_OS_TAURI_EVENTS, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, Markdown, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_SECTORS, OnboardingShell, OnboardingWizard, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, SlashSkillPicker, Spinner, StatCard, StepHeader, TAURI_COMMANDS, TAURI_EVENTS, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, UpgradePackageModal, UserAvatar, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, availablePlacementExams, findLastResumeBlock, findSequentialParent, flattenVerticalBlocks, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, inBrowserPrint, inIframe, initialGhostOsInstallState, initialModelDownloadState, isCoworkEnabled, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSlashCommandToken, isTauriApp, isValidLocale, components as markdownComponents, modelSupportsCowork, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, resolveCreateAgentLabels, sanitizeCss, setCoworkEnabled, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, smallestCoworkModel, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useDiscover, useEdxIframe, useFinancial, useGhostOs, useIframeMessageHandler, useLocalStorage, useModelDownload, useMonetization, useOverview, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useSlashSkillPicker, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
234211
234551
  //# sourceMappingURL=index.esm.js.map