@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.
- package/dist/web-containers/source/index.esm.js +1271 -931
- package/dist/web-containers/source/next/index.esm.js +1812 -1250
- package/package.json +6 -6
|
@@ -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,
|
|
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
|
-
//
|
|
430
|
+
// Cowork (GhostOS)
|
|
431
431
|
// ----------------------------------------------------------------------------
|
|
432
|
-
// Contract for the
|
|
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
|
|
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
|
|
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
|
|
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
|
-
["
|
|
55246
|
-
["path", { d: "
|
|
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
|
|
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
|
-
["
|
|
55261
|
-
["path", { d: "m9
|
|
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
|
|
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: "
|
|
55274
|
+
["path", { d: "M8 12h8", key: "1wcyev" }]
|
|
55276
55275
|
];
|
|
55277
|
-
const
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
56147
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
90623
|
-
// (only models above the configured gate can use
|
|
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
|
|
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.
|
|
90734
|
-
* System Control card's `requiredSizeGb` prop (see SystemControlTabProps).
|
|
90777
|
+
* manager is gated to models above this size.
|
|
90735
90778
|
*/
|
|
90736
|
-
const
|
|
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
|
|
90783
|
+
* {@link DEFAULT_COWORK_REQUIRED_SIZE_GB}). Unknown ids or unparseable
|
|
90741
90784
|
* sizes return false (gated off).
|
|
90742
90785
|
*/
|
|
90743
|
-
function
|
|
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
|
|
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
|
|
90760
|
-
const usable = LOCAL_MODELS.filter((m) =>
|
|
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,
|
|
90822
|
-
var _a, _b, _c, _d, _e
|
|
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.
|
|
90846
|
-
// shown whenever the toggle is on
|
|
90847
|
-
//
|
|
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 (
|
|
91039
|
-
|
|
91040
|
-
|
|
91041
|
-
|
|
91042
|
-
|
|
91043
|
-
|
|
91044
|
-
|
|
91045
|
-
|
|
91046
|
-
|
|
91047
|
-
|
|
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,
|
|
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
|
|
141970
|
-
|
|
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' &&
|
|
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$
|
|
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$
|
|
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$
|
|
143640
|
-
var PORTAL_NAME$
|
|
143641
|
-
var [PortalProvider$1, usePortalContext$1] = createPopoverContext(PORTAL_NAME$
|
|
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$
|
|
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$
|
|
143650
|
-
var CONTENT_NAME$
|
|
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$
|
|
143412
|
+
const portalContext = usePortalContext$1(CONTENT_NAME$4, props.__scopePopover);
|
|
143654
143413
|
const { forceMount = portalContext.forceMount, ...contentProps } = props;
|
|
143655
|
-
const context = usePopoverContext(CONTENT_NAME$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
143596
|
+
var Content2$3 = PopoverContent$1;
|
|
143838
143597
|
|
|
143839
|
-
const Popover = Root2$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
145756
|
-
var CONTENT_NAME$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
182093
|
-
var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME$
|
|
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$
|
|
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$
|
|
182102
|
-
var CONTENT_NAME$
|
|
182103
|
-
var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME$
|
|
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$
|
|
181865
|
+
const portalContext = usePortalContext(CONTENT_NAME$2, props.__scopeMenu);
|
|
182107
181866
|
const { forceMount = portalContext.forceMount, ...contentProps } = props;
|
|
182108
|
-
const context = useMenuContext(CONTENT_NAME$
|
|
182109
|
-
const rootContext = useMenuRootContext(CONTENT_NAME$
|
|
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$
|
|
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$
|
|
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$
|
|
182174
|
-
const rootContext = useMenuRootContext(CONTENT_NAME$
|
|
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$
|
|
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$
|
|
182470
|
+
const portalContext = usePortalContext(CONTENT_NAME$2, props.__scopeMenu);
|
|
182712
182471
|
const { forceMount = portalContext.forceMount, ...subContentProps } = props;
|
|
182713
|
-
const context = useMenuContext(CONTENT_NAME$
|
|
182714
|
-
const rootContext = useMenuRootContext(CONTENT_NAME$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
|
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
|
|
227461
|
-
const
|
|
227462
|
-
|
|
227463
|
-
const
|
|
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
|
|
227466
|
-
const existing = assignmentsBySkillUniqueId.get(skill.unique_id);
|
|
227572
|
+
const handleToggleEffective = async (effective, shouldEnable) => {
|
|
227467
227573
|
try {
|
|
227468
|
-
if (
|
|
227469
|
-
|
|
227470
|
-
|
|
227471
|
-
|
|
227472
|
-
|
|
227473
|
-
|
|
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
|
-
|
|
227489
|
-
return;
|
|
227490
|
-
await deleteAssignment({
|
|
227581
|
+
else if (effective.assignmentId !== undefined) {
|
|
227582
|
+
await updateAssignment({
|
|
227491
227583
|
org: platformKey,
|
|
227492
227584
|
mentorUniqueId,
|
|
227493
|
-
assignmentPk:
|
|
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: [
|
|
227583
|
-
|
|
227584
|
-
|
|
227585
|
-
|
|
227586
|
-
|
|
227587
|
-
|
|
227588
|
-
|
|
227589
|
-
|
|
227590
|
-
|
|
227591
|
-
|
|
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,
|
|
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,
|
|
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
|