@iblai/iblai-js 2.2.9 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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, hasRemoteAiConfig, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, selectRbacPermissions, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, removeFile, chatInputSliceActions, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
4
+ import { selectSessionId, selectActiveChatMessages, useCachedSessionId, chatActions, LOCAL_STORAGE_KEYS, TimeTracker, getInitials, useTenantMetadata, WithPermissions, useStripeUpgrade, openExternalUrl, CHAT_AREA_SIZE, isAlphaNumeric32, checkRbacPermission, getTimeAgo, REQUIRED_ACTIONS_FOR_GROUPS, formatRelativeTime as formatRelativeTime$2, ANONYMOUS_USERNAME, combineCSVData, redirectToAuthSpaJoinTenant, redirectToAuthSpa, getAuthSpaJoinUrl, useOS, selectNumberOfActiveChatMessages, useUsername, selectStreaming, isLoggedIn, TOOLS, hasRemoteAiConfig, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, selectRbacPermissions, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, chatInputSliceActions, removeFile, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
5
5
  import * as dataLayer from '@iblai/data-layer';
6
- import { useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useDeleteGlobalMemoryMutation, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useDeleteApiKeyMutation, useGetApiKeysQuery, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useUpdateTenantMetadataMutation, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useGetAiSearchMentorsQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, useGetMentorsQuery, useUpdateTemplateMutation, useGetTemplateDetailsQuery, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetFinancialStatsQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useLazyGetDownloadReportFromURLQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useLazyGetCourseMetaDataQuery, useLazyGetCourseCompletionOutlinesQuery, useLazyGetCourseEligibilityQuery, useLazyGetUserEnrolledCoursesQuery, useLazyGetUserAssignedCoursesQuery, useLazyGetUserCredentialsQuery, useLazyGetOverTimeActivityQuery, useLazyGetCatalogSearchQuery, useCreateOrUpdateUserReportedSkillMutation, useCreateOrUpdateUserDesiredSkillMutation, useLazyGetPathwayListQuery, useLazyGetUserAssignedPathwaysQuery, useLazyGetUserEnrolledPathwaysQuery, useLazyGetPathwayCompletionQuery, useLazyGetProgramListQuery, useLazyGetProgramCompletionQuery, useLazyGetUserEnrolledProgramsQuery, useLazyGetAssignedProgramsQuery, useLazyGetUserSkillsPointsQuery, useLazyGetUserReportedSkillsQuery, useLazyGetUserDesiredSkillsQuery, useLazyGetUserCatalogPathwaysQuery, useLazyGetPerLearnerInfoQuery, useLazyGetEdxSSOTokenQuery, useCreateCourseEnrollmentMutation, useCreateStripeCheckoutSessionMutation, useLazyGetCourseProgressQuery, useLazyGetCourseCompletionQuery, useLazyGetPersonnalizedSearchQuery, useUpdateExamAttemptMutation, useStartExamMutation, useLazyGetExamInfoQuery, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillsQuery, useGetMentorSkillAssignmentsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useDeleteMentorMemoryMutation, useUpdateMentorMemoryMutation, useCreateMentorMemoryMutation, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorSettingsQuery, useEditMentorMutation, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
6
+ import { useCreateSessionIdMutation, useTimeTrackingMutation, useGetUserMetadataQuery, useGetUserMetadataEdxQuery, useUpdateUserMetadataMutation, useUpdateUserMetadataEdxMutation, useUploadProfileImageMutation, useResetPasswordMutation, useSelfRetireMutation, useCreateUserInstitutionMutation, useGetUserInstitutionsQuery, useCreateUserEducationMutation, useUpdateUserEducationMutation, useDeleteUserEducationMutation, useGetUserEducationQuery, useCreateUserCompanyMutation, useGetUserCompaniesQuery, useCreateUserExperienceMutation, useUpdateUserExperienceMutation, useDeleteUserExperienceMutation, useGetUserExperienceQuery, useGetUserResumeQuery, useCreateUserResumeMutation, useGetMySubscriptionsQuery, useGetItemSubscriptionQuery, useCancelSubscriptionMutation, useGetLearnerDetailsQuery, useGetUserEnrolledCoursesQuery, useGetUserEnrolledProgramsQuery, useGetUserCatalogPathwaysQuery, useGetUsersAsAssertionsQuery, useGetUserEarnedSkillsQuery, useGetUserReportedSkillsQuery, useGetUserDesiredSkillsQuery, useCreateGlobalMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useDeleteGlobalMemoryMutation, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useDeleteApiKeyMutation, useGetApiKeysQuery, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useUpdateTenantMetadataMutation, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useGetAiSearchMentorsQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, useGetMentorsQuery, useUpdateTemplateMutation, useGetTemplateDetailsQuery, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetFinancialStatsQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useLazyGetDownloadReportFromURLQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useLazyGetCourseMetaDataQuery, useLazyGetCourseCompletionOutlinesQuery, useLazyGetCourseEligibilityQuery, useLazyGetUserEnrolledCoursesQuery, useLazyGetUserAssignedCoursesQuery, useLazyGetUserCredentialsQuery, useLazyGetOverTimeActivityQuery, useLazyGetCatalogSearchQuery, useCreateOrUpdateUserReportedSkillMutation, useCreateOrUpdateUserDesiredSkillMutation, useLazyGetPathwayListQuery, useLazyGetUserAssignedPathwaysQuery, useLazyGetUserEnrolledPathwaysQuery, useLazyGetPathwayCompletionQuery, useLazyGetProgramListQuery, useLazyGetProgramCompletionQuery, useLazyGetUserEnrolledProgramsQuery, useLazyGetAssignedProgramsQuery, useLazyGetUserSkillsPointsQuery, useLazyGetUserReportedSkillsQuery, useLazyGetUserDesiredSkillsQuery, useLazyGetUserCatalogPathwaysQuery, useLazyGetPerLearnerInfoQuery, useLazyGetEdxSSOTokenQuery, useCreateCourseEnrollmentMutation, useCreateStripeCheckoutSessionMutation, useLazyGetCourseProgressQuery, useLazyGetCourseCompletionQuery, useLazyGetPersonnalizedSearchQuery, useUpdateExamAttemptMutation, useStartExamMutation, useLazyGetExamInfoQuery, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillResourcesQuery, useCreateAgentSkillResourceMutation, useUpdateAgentSkillResourceMutation, useUploadAgentSkillResourceAssetMutation, useDeleteAgentSkillResourceMutation, useGetAgentSkillsQuery, useGetMentorSkillAssignmentsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, resolveEffectiveAgentSkills, filterSlashSkills, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, useGetMentorMemoriesListQuery, useGetMemoryCategoriesAdminQuery, useDeleteMentorMemoryMutation, useUpdateMentorMemoryMutation, useCreateMentorMemoryMutation, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, useGetMentorSettingsQuery, useEditMentorMutation, useGetMentorCategoriesQuery, useCreateMentorMutation, useUpdateUserPlatformMetadataMutation, useGetApplicationStatusQuery, useListOwnApplicationsQuery, useGetApplicationFormQuery, useWithdrawApplicationMutation, useRenewApplicationMutation, useCreateApplicationDraftMutation, useSubmitApplicationMutation, useUpdateApplicationMutation, useUploadApplicationAttachmentMutation, useDeleteApplicationAttachmentMutation, useGetPromptCategoriesQuery, useCreatePromptMutation, useDeletePromptMutation, useGetPromptsSearchQuery, useUpdatePromptMutation, useDeleteTrainingDocumentMutation, useGetTrainingDocumentRetrainScheduleQuery, useCreateTrainingDocumentRetrainScheduleMutation } from '@iblai/data-layer';
7
7
  import { toast } from 'sonner';
8
8
  import { jsx, Fragment as Fragment$1, jsxs } from 'react/jsx-runtime';
9
9
  import * as ReactDOM from 'react-dom';
@@ -254,7 +254,7 @@ function useTimeTracking(config = {}) {
254
254
  }
255
255
  }, [config.getTenantKey, config.getMentorId]);
256
256
  const handleTimeUpdate = useCallback(async (url, timeSpent) => {
257
- var _a;
257
+ var _a, _b, _c;
258
258
  // Check if user is logged in before making time tracking API call
259
259
  if (config.storageService) {
260
260
  try {
@@ -278,6 +278,10 @@ function useTimeTracking(config = {}) {
278
278
  const currentSessionUuid = config.getSessionUuid
279
279
  ? config.getSessionUuid()
280
280
  : config.sessionUuid;
281
+ // Course/unit context is resolved per-update from the tracked URL (not
282
+ // cached like tenant/mentor) because it changes as the user navigates.
283
+ const courseId = (_a = config.getCourseId) === null || _a === void 0 ? void 0 : _a.call(config, url);
284
+ const blockId = (_b = config.getBlockId) === null || _b === void 0 ? void 0 : _b.call(config, url);
281
285
  const timeTrackingData = {
282
286
  timestamp: new Date().toISOString(),
283
287
  url: url,
@@ -285,8 +289,10 @@ function useTimeTracking(config = {}) {
285
289
  count: Math.floor(timeSpent / 1000), // Convert milliseconds to seconds
286
290
  ...(mentorId && { mentor_uuid: mentorId }),
287
291
  ...(currentSessionUuid && { session_uuid: currentSessionUuid }),
292
+ ...(courseId && { course_id: courseId }),
293
+ ...(blockId && { block_id: blockId }),
288
294
  };
289
- if ((_a = config.storageService) === null || _a === void 0 ? void 0 : _a.getItem(LOCAL_STORAGE_KEYS.USER_DATA)) {
295
+ if ((_c = config.storageService) === null || _c === void 0 ? void 0 : _c.getItem(LOCAL_STORAGE_KEYS.USER_DATA)) {
290
296
  await timeTracking(timeTrackingData).unwrap();
291
297
  }
292
298
  else {
@@ -298,7 +304,7 @@ function useTimeTracking(config = {}) {
298
304
  ...(currentSessionUuid && { sessionUuid: currentSessionUuid }),
299
305
  });
300
306
  }
301
- catch (_b) {
307
+ catch (_d) {
302
308
  // console.error('Failed to send time tracking data:', error);
303
309
  // Don't throw the error to prevent disrupting the user experience
304
310
  }
@@ -307,6 +313,8 @@ function useTimeTracking(config = {}) {
307
313
  mentorId,
308
314
  config.getSessionUuid,
309
315
  config.sessionUuid,
316
+ config.getCourseId,
317
+ config.getBlockId,
310
318
  config.storageService,
311
319
  timeTracking,
312
320
  ]);
@@ -54758,7 +54766,7 @@ const createLucideIcon = (iconName, iconNode) => {
54758
54766
  */
54759
54767
 
54760
54768
 
54761
- const __iconNode$2k = [
54769
+ const __iconNode$2l = [
54762
54770
  [
54763
54771
  "path",
54764
54772
  {
@@ -54767,7 +54775,7 @@ const __iconNode$2k = [
54767
54775
  }
54768
54776
  ]
54769
54777
  ];
54770
- const Activity = createLucideIcon("activity", __iconNode$2k);
54778
+ const Activity = createLucideIcon("activity", __iconNode$2l);
54771
54779
 
54772
54780
  /**
54773
54781
  * @license lucide-react v0.528.0 - ISC
@@ -54777,12 +54785,12 @@ const Activity = createLucideIcon("activity", __iconNode$2k);
54777
54785
  */
54778
54786
 
54779
54787
 
54780
- const __iconNode$2j = [
54788
+ const __iconNode$2k = [
54781
54789
  ["path", { d: "M17 12H7", key: "16if0g" }],
54782
54790
  ["path", { d: "M19 18H5", key: "18s9l3" }],
54783
54791
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
54784
54792
  ];
54785
- const AlignCenter = createLucideIcon("align-center", __iconNode$2j);
54793
+ const AlignCenter = createLucideIcon("align-center", __iconNode$2k);
54786
54794
 
54787
54795
  /**
54788
54796
  * @license lucide-react v0.528.0 - ISC
@@ -54792,12 +54800,12 @@ const AlignCenter = createLucideIcon("align-center", __iconNode$2j);
54792
54800
  */
54793
54801
 
54794
54802
 
54795
- const __iconNode$2i = [
54803
+ const __iconNode$2j = [
54796
54804
  ["path", { d: "M15 12H3", key: "6jk70r" }],
54797
54805
  ["path", { d: "M17 18H3", key: "1amg6g" }],
54798
54806
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
54799
54807
  ];
54800
- const AlignLeft = createLucideIcon("align-left", __iconNode$2i);
54808
+ const AlignLeft = createLucideIcon("align-left", __iconNode$2j);
54801
54809
 
54802
54810
  /**
54803
54811
  * @license lucide-react v0.528.0 - ISC
@@ -54807,12 +54815,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$2i);
54807
54815
  */
54808
54816
 
54809
54817
 
54810
- const __iconNode$2h = [
54818
+ const __iconNode$2i = [
54811
54819
  ["path", { d: "M21 12H9", key: "dn1m92" }],
54812
54820
  ["path", { d: "M21 18H7", key: "1ygte8" }],
54813
54821
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
54814
54822
  ];
54815
- const AlignRight = createLucideIcon("align-right", __iconNode$2h);
54823
+ const AlignRight = createLucideIcon("align-right", __iconNode$2i);
54816
54824
 
54817
54825
  /**
54818
54826
  * @license lucide-react v0.528.0 - ISC
@@ -54822,12 +54830,12 @@ const AlignRight = createLucideIcon("align-right", __iconNode$2h);
54822
54830
  */
54823
54831
 
54824
54832
 
54825
- const __iconNode$2g = [
54833
+ const __iconNode$2h = [
54826
54834
  ["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
54827
54835
  ["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
54828
54836
  ["path", { d: "M10 12h4", key: "a56b0p" }]
54829
54837
  ];
54830
- const Archive = createLucideIcon("archive", __iconNode$2g);
54838
+ const Archive = createLucideIcon("archive", __iconNode$2h);
54831
54839
 
54832
54840
  /**
54833
54841
  * @license lucide-react v0.528.0 - ISC
@@ -54837,11 +54845,11 @@ const Archive = createLucideIcon("archive", __iconNode$2g);
54837
54845
  */
54838
54846
 
54839
54847
 
54840
- const __iconNode$2f = [
54848
+ const __iconNode$2g = [
54841
54849
  ["path", { d: "M12 5v14", key: "s699le" }],
54842
54850
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
54843
54851
  ];
54844
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$2f);
54852
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2g);
54845
54853
 
54846
54854
  /**
54847
54855
  * @license lucide-react v0.528.0 - ISC
@@ -54851,11 +54859,11 @@ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2f);
54851
54859
  */
54852
54860
 
54853
54861
 
54854
- const __iconNode$2e = [
54862
+ const __iconNode$2f = [
54855
54863
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
54856
54864
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
54857
54865
  ];
54858
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2e);
54866
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2f);
54859
54867
 
54860
54868
  /**
54861
54869
  * @license lucide-react v0.528.0 - ISC
@@ -54865,11 +54873,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2e);
54865
54873
  */
54866
54874
 
54867
54875
 
54868
- const __iconNode$2d = [
54876
+ const __iconNode$2e = [
54869
54877
  ["path", { d: "M5 12h14", key: "1ays0h" }],
54870
54878
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
54871
54879
  ];
54872
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$2d);
54880
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2e);
54873
54881
 
54874
54882
  /**
54875
54883
  * @license lucide-react v0.528.0 - ISC
@@ -54879,11 +54887,11 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2d);
54879
54887
  */
54880
54888
 
54881
54889
 
54882
- const __iconNode$2c = [
54890
+ const __iconNode$2d = [
54883
54891
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
54884
54892
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
54885
54893
  ];
54886
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$2c);
54894
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2d);
54887
54895
 
54888
54896
  /**
54889
54897
  * @license lucide-react v0.528.0 - ISC
@@ -54893,7 +54901,7 @@ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2c);
54893
54901
  */
54894
54902
 
54895
54903
 
54896
- const __iconNode$2b = [
54904
+ const __iconNode$2c = [
54897
54905
  [
54898
54906
  "path",
54899
54907
  {
@@ -54903,7 +54911,7 @@ const __iconNode$2b = [
54903
54911
  ],
54904
54912
  ["circle", { cx: "12", cy: "8", r: "6", key: "1vp47v" }]
54905
54913
  ];
54906
- const Award = createLucideIcon("award", __iconNode$2b);
54914
+ const Award = createLucideIcon("award", __iconNode$2c);
54907
54915
 
54908
54916
  /**
54909
54917
  * @license lucide-react v0.528.0 - ISC
@@ -54913,11 +54921,11 @@ const Award = createLucideIcon("award", __iconNode$2b);
54913
54921
  */
54914
54922
 
54915
54923
 
54916
- const __iconNode$2a = [
54924
+ const __iconNode$2b = [
54917
54925
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
54918
54926
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
54919
54927
  ];
54920
- const Ban = createLucideIcon("ban", __iconNode$2a);
54928
+ const Ban = createLucideIcon("ban", __iconNode$2b);
54921
54929
 
54922
54930
  /**
54923
54931
  * @license lucide-react v0.528.0 - ISC
@@ -54927,12 +54935,12 @@ const Ban = createLucideIcon("ban", __iconNode$2a);
54927
54935
  */
54928
54936
 
54929
54937
 
54930
- const __iconNode$29 = [
54938
+ const __iconNode$2a = [
54931
54939
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }],
54932
54940
  ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }],
54933
54941
  ["path", { d: "M6 12h.01M18 12h.01", key: "113zkx" }]
54934
54942
  ];
54935
- const Banknote = createLucideIcon("banknote", __iconNode$29);
54943
+ const Banknote = createLucideIcon("banknote", __iconNode$2a);
54936
54944
 
54937
54945
  /**
54938
54946
  * @license lucide-react v0.528.0 - ISC
@@ -54942,7 +54950,7 @@ const Banknote = createLucideIcon("banknote", __iconNode$29);
54942
54950
  */
54943
54951
 
54944
54952
 
54945
- const __iconNode$28 = [
54953
+ const __iconNode$29 = [
54946
54954
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
54947
54955
  ["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
54948
54956
  [
@@ -54954,7 +54962,7 @@ const __iconNode$28 = [
54954
54962
  ],
54955
54963
  ["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
54956
54964
  ];
54957
- const BellRing = createLucideIcon("bell-ring", __iconNode$28);
54965
+ const BellRing = createLucideIcon("bell-ring", __iconNode$29);
54958
54966
 
54959
54967
  /**
54960
54968
  * @license lucide-react v0.528.0 - ISC
@@ -54964,7 +54972,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$28);
54964
54972
  */
54965
54973
 
54966
54974
 
54967
- const __iconNode$27 = [
54975
+ const __iconNode$28 = [
54968
54976
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
54969
54977
  [
54970
54978
  "path",
@@ -54974,7 +54982,7 @@ const __iconNode$27 = [
54974
54982
  }
54975
54983
  ]
54976
54984
  ];
54977
- const Bell = createLucideIcon("bell", __iconNode$27);
54985
+ const Bell = createLucideIcon("bell", __iconNode$28);
54978
54986
 
54979
54987
  /**
54980
54988
  * @license lucide-react v0.528.0 - ISC
@@ -54984,13 +54992,13 @@ const Bell = createLucideIcon("bell", __iconNode$27);
54984
54992
  */
54985
54993
 
54986
54994
 
54987
- const __iconNode$26 = [
54995
+ const __iconNode$27 = [
54988
54996
  [
54989
54997
  "path",
54990
54998
  { d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8", key: "mg9rjx" }
54991
54999
  ]
54992
55000
  ];
54993
- const Bold$1 = createLucideIcon("bold", __iconNode$26);
55001
+ const Bold$1 = createLucideIcon("bold", __iconNode$27);
54994
55002
 
54995
55003
  /**
54996
55004
  * @license lucide-react v0.528.0 - ISC
@@ -55000,7 +55008,7 @@ const Bold$1 = createLucideIcon("bold", __iconNode$26);
55000
55008
  */
55001
55009
 
55002
55010
 
55003
- const __iconNode$25 = [
55011
+ const __iconNode$26 = [
55004
55012
  ["path", { d: "M12 7v14", key: "1akyts" }],
55005
55013
  [
55006
55014
  "path",
@@ -55010,7 +55018,7 @@ const __iconNode$25 = [
55010
55018
  }
55011
55019
  ]
55012
55020
  ];
55013
- const BookOpen = createLucideIcon("book-open", __iconNode$25);
55021
+ const BookOpen = createLucideIcon("book-open", __iconNode$26);
55014
55022
 
55015
55023
  /**
55016
55024
  * @license lucide-react v0.528.0 - ISC
@@ -55020,7 +55028,7 @@ const BookOpen = createLucideIcon("book-open", __iconNode$25);
55020
55028
  */
55021
55029
 
55022
55030
 
55023
- const __iconNode$24 = [
55031
+ const __iconNode$25 = [
55024
55032
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
55025
55033
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
55026
55034
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -55028,7 +55036,7 @@ const __iconNode$24 = [
55028
55036
  ["path", { d: "M15 13v2", key: "1xurst" }],
55029
55037
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
55030
55038
  ];
55031
- const Bot = createLucideIcon("bot", __iconNode$24);
55039
+ const Bot = createLucideIcon("bot", __iconNode$25);
55032
55040
 
55033
55041
  /**
55034
55042
  * @license lucide-react v0.528.0 - ISC
@@ -55038,11 +55046,11 @@ const Bot = createLucideIcon("bot", __iconNode$24);
55038
55046
  */
55039
55047
 
55040
55048
 
55041
- const __iconNode$23 = [
55049
+ const __iconNode$24 = [
55042
55050
  ["path", { d: "M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16", key: "jecpp" }],
55043
55051
  ["rect", { width: "20", height: "14", x: "2", y: "6", rx: "2", key: "i6l2r4" }]
55044
55052
  ];
55045
- const Briefcase = createLucideIcon("briefcase", __iconNode$23);
55053
+ const Briefcase = createLucideIcon("briefcase", __iconNode$24);
55046
55054
 
55047
55055
  /**
55048
55056
  * @license lucide-react v0.528.0 - ISC
@@ -55052,7 +55060,7 @@ const Briefcase = createLucideIcon("briefcase", __iconNode$23);
55052
55060
  */
55053
55061
 
55054
55062
 
55055
- const __iconNode$22 = [
55063
+ const __iconNode$23 = [
55056
55064
  ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
55057
55065
  ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
55058
55066
  ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
@@ -55061,7 +55069,7 @@ const __iconNode$22 = [
55061
55069
  ["path", { d: "M10 14h4", key: "kelpxr" }],
55062
55070
  ["path", { d: "M10 18h4", key: "1ulq68" }]
55063
55071
  ];
55064
- const Building2 = createLucideIcon("building-2", __iconNode$22);
55072
+ const Building2 = createLucideIcon("building-2", __iconNode$23);
55065
55073
 
55066
55074
  /**
55067
55075
  * @license lucide-react v0.528.0 - ISC
@@ -55071,13 +55079,13 @@ const Building2 = createLucideIcon("building-2", __iconNode$22);
55071
55079
  */
55072
55080
 
55073
55081
 
55074
- const __iconNode$21 = [
55082
+ const __iconNode$22 = [
55075
55083
  ["path", { d: "M8 2v4", key: "1cmpym" }],
55076
55084
  ["path", { d: "M16 2v4", key: "4m81vk" }],
55077
55085
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
55078
55086
  ["path", { d: "M3 10h18", key: "8toen8" }]
55079
55087
  ];
55080
- const Calendar$1 = createLucideIcon("calendar", __iconNode$21);
55088
+ const Calendar$1 = createLucideIcon("calendar", __iconNode$22);
55081
55089
 
55082
55090
  /**
55083
55091
  * @license lucide-react v0.528.0 - ISC
@@ -55087,11 +55095,11 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$21);
55087
55095
  */
55088
55096
 
55089
55097
 
55090
- const __iconNode$20 = [
55098
+ const __iconNode$21 = [
55091
55099
  ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
55092
55100
  ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
55093
55101
  ];
55094
- const CheckCheck = createLucideIcon("check-check", __iconNode$20);
55102
+ const CheckCheck = createLucideIcon("check-check", __iconNode$21);
55095
55103
 
55096
55104
  /**
55097
55105
  * @license lucide-react v0.528.0 - ISC
@@ -55101,8 +55109,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$20);
55101
55109
  */
55102
55110
 
55103
55111
 
55104
- const __iconNode$1$ = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
55105
- const Check = createLucideIcon("check", __iconNode$1$);
55112
+ const __iconNode$20 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
55113
+ const Check = createLucideIcon("check", __iconNode$20);
55106
55114
 
55107
55115
  /**
55108
55116
  * @license lucide-react v0.528.0 - ISC
@@ -55112,8 +55120,8 @@ const Check = createLucideIcon("check", __iconNode$1$);
55112
55120
  */
55113
55121
 
55114
55122
 
55115
- const __iconNode$1_ = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
55116
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$1_);
55123
+ const __iconNode$1$ = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
55124
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1$);
55117
55125
 
55118
55126
  /**
55119
55127
  * @license lucide-react v0.528.0 - ISC
@@ -55123,11 +55131,11 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1_);
55123
55131
  */
55124
55132
 
55125
55133
 
55126
- const __iconNode$1Z = [
55134
+ const __iconNode$1_ = [
55127
55135
  ["path", { d: "m17 18-6-6 6-6", key: "1yerx2" }],
55128
55136
  ["path", { d: "M7 6v12", key: "1p53r6" }]
55129
55137
  ];
55130
- const ChevronFirst = createLucideIcon("chevron-first", __iconNode$1Z);
55138
+ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$1_);
55131
55139
 
55132
55140
  /**
55133
55141
  * @license lucide-react v0.528.0 - ISC
@@ -55137,11 +55145,11 @@ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$1Z);
55137
55145
  */
55138
55146
 
55139
55147
 
55140
- const __iconNode$1Y = [
55148
+ const __iconNode$1Z = [
55141
55149
  ["path", { d: "m7 18 6-6-6-6", key: "lwmzdw" }],
55142
55150
  ["path", { d: "M17 6v12", key: "1o0aio" }]
55143
55151
  ];
55144
- const ChevronLast = createLucideIcon("chevron-last", __iconNode$1Y);
55152
+ const ChevronLast = createLucideIcon("chevron-last", __iconNode$1Z);
55145
55153
 
55146
55154
  /**
55147
55155
  * @license lucide-react v0.528.0 - ISC
@@ -55151,8 +55159,8 @@ const ChevronLast = createLucideIcon("chevron-last", __iconNode$1Y);
55151
55159
  */
55152
55160
 
55153
55161
 
55154
- const __iconNode$1X = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
55155
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1X);
55162
+ const __iconNode$1Y = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
55163
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1Y);
55156
55164
 
55157
55165
  /**
55158
55166
  * @license lucide-react v0.528.0 - ISC
@@ -55162,8 +55170,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1X);
55162
55170
  */
55163
55171
 
55164
55172
 
55165
- const __iconNode$1W = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
55166
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$1W);
55173
+ const __iconNode$1X = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
55174
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1X);
55167
55175
 
55168
55176
  /**
55169
55177
  * @license lucide-react v0.528.0 - ISC
@@ -55173,8 +55181,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1W);
55173
55181
  */
55174
55182
 
55175
55183
 
55176
- const __iconNode$1V = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
55177
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1V);
55184
+ const __iconNode$1W = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
55185
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1W);
55178
55186
 
55179
55187
  /**
55180
55188
  * @license lucide-react v0.528.0 - ISC
@@ -55184,11 +55192,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1V);
55184
55192
  */
55185
55193
 
55186
55194
 
55187
- const __iconNode$1U = [
55195
+ const __iconNode$1V = [
55188
55196
  ["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
55189
55197
  ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
55190
55198
  ];
55191
- const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1U);
55199
+ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1V);
55192
55200
 
55193
55201
  /**
55194
55202
  * @license lucide-react v0.528.0 - ISC
@@ -55198,11 +55206,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1U);
55198
55206
  */
55199
55207
 
55200
55208
 
55201
- const __iconNode$1T = [
55209
+ const __iconNode$1U = [
55202
55210
  ["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
55203
55211
  ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
55204
55212
  ];
55205
- const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1T);
55213
+ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1U);
55206
55214
 
55207
55215
  /**
55208
55216
  * @license lucide-react v0.528.0 - ISC
@@ -55212,11 +55220,11 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1T);
55212
55220
  */
55213
55221
 
55214
55222
 
55215
- const __iconNode$1S = [
55223
+ const __iconNode$1T = [
55216
55224
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
55217
55225
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
55218
55226
  ];
55219
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1S);
55227
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1T);
55220
55228
 
55221
55229
  /**
55222
55230
  * @license lucide-react v0.528.0 - ISC
@@ -55226,12 +55234,12 @@ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1S);
55226
55234
  */
55227
55235
 
55228
55236
 
55229
- const __iconNode$1R = [
55237
+ const __iconNode$1S = [
55230
55238
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55231
55239
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
55232
55240
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
55233
55241
  ];
55234
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$1R);
55242
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1S);
55235
55243
 
55236
55244
  /**
55237
55245
  * @license lucide-react v0.528.0 - ISC
@@ -55241,11 +55249,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1R);
55241
55249
  */
55242
55250
 
55243
55251
 
55244
- const __iconNode$1Q = [
55252
+ const __iconNode$1R = [
55245
55253
  ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
55246
55254
  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
55247
55255
  ];
55248
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1Q);
55256
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1R);
55249
55257
 
55250
55258
  /**
55251
55259
  * @license lucide-react v0.528.0 - ISC
@@ -55255,11 +55263,25 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1Q);
55255
55263
  */
55256
55264
 
55257
55265
 
55258
- const __iconNode$1P = [
55266
+ const __iconNode$1Q = [
55259
55267
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55260
55268
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
55261
55269
  ];
55262
- const CircleCheck = createLucideIcon("circle-check", __iconNode$1P);
55270
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$1Q);
55271
+
55272
+ /**
55273
+ * @license lucide-react v0.528.0 - ISC
55274
+ *
55275
+ * This source code is licensed under the ISC license.
55276
+ * See the LICENSE file in the root directory of this source tree.
55277
+ */
55278
+
55279
+
55280
+ const __iconNode$1P = [
55281
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
55282
+ ["path", { d: "M8 12h8", key: "1wcyev" }]
55283
+ ];
55284
+ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1P);
55263
55285
 
55264
55286
  /**
55265
55287
  * @license lucide-react v0.528.0 - ISC
@@ -61011,118 +61033,6 @@ var gradebookGradebookTab$3 = {
61011
61033
  previousPage: "Previous",
61012
61034
  nextPage: "Next"
61013
61035
  };
61014
- var graderTabLabels$3 = {
61015
- header: {
61016
- title: "Grader",
61017
- description: "Set up how your agent grades work against a rubric you define."
61018
- },
61019
- capability: {
61020
- title: "Grading",
61021
- 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.",
61022
- 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."
61023
- },
61024
- subTabs: {
61025
- setup: "Grading setup",
61026
- rubric: "Rubric"
61027
- },
61028
- denied: {
61029
- title: "No access to grading settings",
61030
- description: "You don't have permission to view this agent's grading setup. Ask an administrator for access."
61031
- },
61032
- warnings: {
61033
- 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.",
61034
- 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."
61035
- },
61036
- config: {
61037
- sectionTitle: "Grading setup",
61038
- gradingMode: {
61039
- label: "What gets graded",
61040
- options: {
61041
- submission: "A submission",
61042
- conversation: "The conversation"
61043
- },
61044
- help: {
61045
- submission: "The agent grades a piece of work the person hands in, like an essay or answer.",
61046
- conversation: "The agent grades how the whole conversation went."
61047
- }
61048
- },
61049
- feedbackMode: {
61050
- label: "Feedback shared with the person",
61051
- options: {
61052
- overall: "Overall feedback only",
61053
- perCriteria: "Feedback per criterion",
61054
- both: "Overall + per criterion"
61055
- },
61056
- help: "The overall score is always calculated — this only controls how much detail is shared back."
61057
- },
61058
- instructions: {
61059
- label: "Grading instructions",
61060
- 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.'",
61061
- help: "Required. This is the context the agent uses every time it grades."
61062
- },
61063
- saveButton: "Save",
61064
- savingButton: "Saving…"
61065
- },
61066
- criteria: {
61067
- sectionTitle: "Rubric",
61068
- 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.",
61069
- needsConfigHint: "Save your grading setup first, then add rubric criteria here.",
61070
- emptyState: "No criteria yet. Add your first one — for example \"Clarity\", 10 points.",
61071
- addButton: "Add criterion",
61072
- columns: {
61073
- name: "Name",
61074
- criteria: "Criteria",
61075
- points: "Points"
61076
- },
61077
- actionsAria: "Actions for {name}",
61078
- edit: "Edit",
61079
- "delete": "Delete",
61080
- totalPoints: "Total possible points: {total}",
61081
- scoreHint: "Overall score = points earned ÷ {total}.",
61082
- lastCriterionHint: "A rubric needs at least one criterion — add another before removing this one.",
61083
- modal: {
61084
- addTitle: "Add criterion",
61085
- editTitle: "Edit criterion",
61086
- name: {
61087
- label: "Name",
61088
- placeholder: "e.g. Clarity",
61089
- required: "Name is required"
61090
- },
61091
- criteria: {
61092
- label: "Criteria",
61093
- placeholder: "e.g. The argument is easy to follow and each paragraph makes one clear point.",
61094
- required: "Criteria is required"
61095
- },
61096
- points: {
61097
- label: "Points",
61098
- placeholder: "10",
61099
- positive: "Points must be a positive number"
61100
- },
61101
- save: "Save",
61102
- saving: "Saving…",
61103
- cancel: "Cancel"
61104
- },
61105
- deleteModal: {
61106
- title: "Delete criterion",
61107
- confirmationPrefix: "Are you sure you want to remove",
61108
- confirmationSuffix: " from the rubric?",
61109
- cancel: "Cancel",
61110
- "delete": "Delete",
61111
- deleting: "Deleting…"
61112
- }
61113
- },
61114
- toasts: {
61115
- toggleOn: "Grading turned on",
61116
- toggleOff: "Grading turned off — your rubric is kept for next time",
61117
- toggleError: "Couldn't update grading",
61118
- configSaved: "Grading setup saved",
61119
- configError: "Couldn't save grading setup",
61120
- criterionAdded: "Criterion added",
61121
- criterionUpdated: "Criterion updated",
61122
- criterionDeleted: "Criterion deleted",
61123
- criterionError: "Couldn't update the rubric"
61124
- }
61125
- };
61126
61036
  var careerExperienceDialog$3 = {
61127
61037
  pleaseSelectACompany: "Please select a company",
61128
61038
  endDateCannotBeBeforeStartDate: "End date cannot be before start date",
@@ -61436,7 +61346,57 @@ var clawSandboxAgentSkills$3 = {
61436
61346
  fieldVersionPlaceholder: "e.g. 1.0.0",
61437
61347
  fieldDescription: "Description",
61438
61348
  fieldDescriptionPlaceholder: "e.g. Search the web for information",
61439
- fieldInstruction: "Instruction"
61349
+ fieldInstruction: "Instruction",
61350
+ 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.",
61351
+ effectiveHeading: "This agent's skills",
61352
+ catalogHeading: "Available skills",
61353
+ noEffectiveSkills: "No skills enabled for this agent yet. Add one from the available skills below.",
61354
+ addToAgent: "Add",
61355
+ addToAgentLabel: "Add {name} to this agent",
61356
+ removeFromAgent: "Remove from agent",
61357
+ skillAdded: "{name} added",
61358
+ skillRemoved: "{name} removed",
61359
+ featuredBadge: "Featured",
61360
+ nativeBadge: "Native",
61361
+ privateBadge: "Only this agent",
61362
+ fieldCategory: "Category",
61363
+ fieldCategoryPlaceholder: "e.g. web, code, data",
61364
+ privateToAgent: "Only this agent",
61365
+ privateToAgentHint: "Private skills are available to this agent only and take precedence over platform skills with the same slug.",
61366
+ instructionHint: "The playbook the agent follows when the skill is used. Edits apply immediately, including in conversations already in progress.",
61367
+ filesHint: "Optional resources the agent can use with this skill. References and scripts are text files; assets are uploaded files.",
61368
+ filesAfterCreateHint: "You can attach resources to this skill after creating it (reopen it with Edit).",
61369
+ noFiles: "No resources attached yet.",
61370
+ loadingFiles: "Loading resources...",
61371
+ fileTypeLabel: "Type",
61372
+ fileTypeReference: "Reference",
61373
+ fileTypeScript: "Script",
61374
+ fileTypeAsset: "Asset",
61375
+ fileNameLabel: "File name",
61376
+ fileNamePlaceholder: "e.g. rubric.md",
61377
+ fileContentLabel: "Content",
61378
+ fileContentPlaceholder: "The file's text content",
61379
+ addFileButton: "Add resource",
61380
+ adding: "Adding...",
61381
+ uploading: "Uploading...",
61382
+ fileAdded: "Resource added",
61383
+ fileUploaded: "Resource uploaded",
61384
+ fileSaved: "Resource saved",
61385
+ fileDeleted: "Resource deleted",
61386
+ failedToSaveFile: "Failed to save resource",
61387
+ failedToUploadFile: "Failed to upload resource",
61388
+ failedToDeleteFile: "Failed to delete resource",
61389
+ detailsTab: "General",
61390
+ filesTab: "Resources",
61391
+ newFile: "New Resource",
61392
+ newFileDialogTitle: "New Resource",
61393
+ editFileDialogTitle: "Edit Resource",
61394
+ deleteFileDialogTitle: "Delete Resource",
61395
+ deleteFileConfirmation: "Are you sure you want to delete {name}? This action cannot be undone.",
61396
+ chooseFile: "Choose file",
61397
+ upload: "Upload",
61398
+ download: "Download",
61399
+ resourcesItemLabel: "resources"
61440
61400
  };
61441
61401
  var clawSandboxHelpers$3 = {
61442
61402
  unknown: "Unknown",
@@ -63701,7 +63661,7 @@ var safetyTabLabels$3 = {
63701
63661
  };
63702
63662
  var screenshareTabLabels$3 = {
63703
63663
  header: {
63704
- title: "Screen Share",
63664
+ title: "Screen",
63705
63665
  description: "How your agent behaves when a user shares their screen during a voice call."
63706
63666
  },
63707
63667
  capability: {
@@ -65340,6 +65300,19 @@ var platformNavbar$3 = {
65340
65300
  placementExamsHeader: "Placement exams",
65341
65301
  placementExamFallback: "Placement exam"
65342
65302
  };
65303
+ var slashSkillPicker$3 = {
65304
+ listLabel: "Agent skills",
65305
+ resultsAnnouncement: "{count} skills available. Use arrow keys to browse and Enter to select.",
65306
+ loading: "Loading..."
65307
+ };
65308
+ var skillsTabLabels$3 = {
65309
+ header: {
65310
+ title: "Skills",
65311
+ 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."
65312
+ },
65313
+ notBaseAgent: "Skills are only available to Base Agents.",
65314
+ loading: "Loading..."
65315
+ };
65343
65316
  var placementExam$3 = {
65344
65317
  title: "Placement exam",
65345
65318
  back: "Back"
@@ -65636,6 +65609,118 @@ var profileApplicationsQuestionsEditor$3 = {
65636
65609
  collapseSection: "Collapse section",
65637
65610
  expandSection: "Expand section"
65638
65611
  };
65612
+ var graderTabLabels$3 = {
65613
+ header: {
65614
+ title: "Grader",
65615
+ description: "Set up how your agent grades work against a rubric you define."
65616
+ },
65617
+ capability: {
65618
+ title: "Grading",
65619
+ 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.",
65620
+ 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."
65621
+ },
65622
+ subTabs: {
65623
+ setup: "Grading setup",
65624
+ rubric: "Rubric"
65625
+ },
65626
+ denied: {
65627
+ title: "No access to grading settings",
65628
+ description: "You don't have permission to view this agent's grading setup. Ask an administrator for access."
65629
+ },
65630
+ warnings: {
65631
+ 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.",
65632
+ 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."
65633
+ },
65634
+ config: {
65635
+ sectionTitle: "Grading setup",
65636
+ gradingMode: {
65637
+ label: "What gets graded",
65638
+ options: {
65639
+ submission: "A submission",
65640
+ conversation: "The conversation"
65641
+ },
65642
+ help: {
65643
+ submission: "The agent grades a piece of work the person hands in, like an essay or answer.",
65644
+ conversation: "The agent grades how the whole conversation went."
65645
+ }
65646
+ },
65647
+ feedbackMode: {
65648
+ label: "Feedback shared with the person",
65649
+ options: {
65650
+ overall: "Overall feedback only",
65651
+ perCriteria: "Feedback per criterion",
65652
+ both: "Overall + per criterion"
65653
+ },
65654
+ help: "The overall score is always calculated — this only controls how much detail is shared back."
65655
+ },
65656
+ instructions: {
65657
+ label: "Grading instructions",
65658
+ 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.'",
65659
+ help: "Required. This is the context the agent uses every time it grades."
65660
+ },
65661
+ saveButton: "Save",
65662
+ savingButton: "Saving…"
65663
+ },
65664
+ criteria: {
65665
+ sectionTitle: "Rubric",
65666
+ 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.",
65667
+ needsConfigHint: "Save your grading setup first, then add rubric criteria here.",
65668
+ emptyState: "No criteria yet. Add your first one — for example \"Clarity\", 10 points.",
65669
+ addButton: "Add criterion",
65670
+ columns: {
65671
+ name: "Name",
65672
+ criteria: "Criteria",
65673
+ points: "Points"
65674
+ },
65675
+ actionsAria: "Actions for {name}",
65676
+ edit: "Edit",
65677
+ "delete": "Delete",
65678
+ totalPoints: "Total possible points: {total}",
65679
+ scoreHint: "Overall score = points earned ÷ {total}.",
65680
+ lastCriterionHint: "A rubric needs at least one criterion — add another before removing this one.",
65681
+ modal: {
65682
+ addTitle: "Add criterion",
65683
+ editTitle: "Edit criterion",
65684
+ name: {
65685
+ label: "Name",
65686
+ placeholder: "e.g. Clarity",
65687
+ required: "Name is required"
65688
+ },
65689
+ criteria: {
65690
+ label: "Criteria",
65691
+ placeholder: "e.g. The argument is easy to follow and each paragraph makes one clear point.",
65692
+ required: "Criteria is required"
65693
+ },
65694
+ points: {
65695
+ label: "Points",
65696
+ placeholder: "10",
65697
+ positive: "Points must be a positive number"
65698
+ },
65699
+ save: "Save",
65700
+ saving: "Saving…",
65701
+ cancel: "Cancel"
65702
+ },
65703
+ deleteModal: {
65704
+ title: "Delete criterion",
65705
+ confirmationPrefix: "Are you sure you want to remove",
65706
+ confirmationSuffix: " from the rubric?",
65707
+ cancel: "Cancel",
65708
+ "delete": "Delete",
65709
+ deleting: "Deleting…"
65710
+ }
65711
+ },
65712
+ toasts: {
65713
+ toggleOn: "Grading turned on",
65714
+ toggleOff: "Grading turned off — your rubric is kept for next time",
65715
+ toggleError: "Couldn't update grading",
65716
+ configSaved: "Grading setup saved",
65717
+ configError: "Couldn't save grading setup",
65718
+ criterionAdded: "Criterion added",
65719
+ criterionUpdated: "Criterion updated",
65720
+ criterionDeleted: "Criterion deleted",
65721
+ criterionError: "Couldn't update the rubric"
65722
+ }
65723
+ };
65639
65724
  var en = {
65640
65725
  accessTabAddAccess: accessTabAddAccess$3,
65641
65726
  accessTabLabels: accessTabLabels$3,
@@ -65690,7 +65775,6 @@ var en = {
65690
65775
  careerEducationDialog: careerEducationDialog$3,
65691
65776
  careerEducationTab: careerEducationTab$3,
65692
65777
  gradebookGradebookTab: gradebookGradebookTab$3,
65693
- graderTabLabels: graderTabLabels$3,
65694
65778
  careerExperienceDialog: careerExperienceDialog$3,
65695
65779
  careerExperienceTab: careerExperienceTab$3,
65696
65780
  careerInstitutionDialog: careerInstitutionDialog$3,
@@ -65884,10 +65968,13 @@ var en = {
65884
65968
  benchmarksAddItemsModal: benchmarksAddItemsModal$3,
65885
65969
  platformSidebar: platformSidebar$3,
65886
65970
  platformNavbar: platformNavbar$3,
65971
+ slashSkillPicker: slashSkillPicker$3,
65972
+ skillsTabLabels: skillsTabLabels$3,
65887
65973
  placementExam: placementExam$3,
65888
65974
  applyApplyWizard: applyApplyWizard$3,
65889
65975
  profileApplicationsTab: profileApplicationsTab$3,
65890
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$3
65976
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$3,
65977
+ graderTabLabels: graderTabLabels$3
65891
65978
  };
65892
65979
 
65893
65980
  var accessTabAddAccess$2 = {
@@ -67557,7 +67644,57 @@ var clawSandboxAgentSkills$2 = {
67557
67644
  fieldVersionPlaceholder: "ex. 1.0.0",
67558
67645
  fieldDescription: "Description",
67559
67646
  fieldDescriptionPlaceholder: "ex. Rechercher des informations sur le web",
67560
- fieldInstruction: "Instruction"
67647
+ fieldInstruction: "Instruction",
67648
+ 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.",
67649
+ effectiveHeading: "Compétences de cet agent",
67650
+ catalogHeading: "Compétences disponibles",
67651
+ noEffectiveSkills: "Cet agent n'a pas encore de compétences activées. Ajoutez-en une depuis les compétences disponibles.",
67652
+ addToAgent: "Ajouter",
67653
+ addToAgentLabel: "Ajouter {name} à cet agent",
67654
+ removeFromAgent: "Retirer de l'agent",
67655
+ skillAdded: "{name} ajoutée",
67656
+ skillRemoved: "{name} retirée",
67657
+ featuredBadge: "En vedette",
67658
+ nativeBadge: "Native",
67659
+ privateBadge: "Cet agent uniquement",
67660
+ fieldCategory: "Catégorie",
67661
+ fieldCategoryPlaceholder: "p. ex. web, code, données",
67662
+ privateToAgent: "Cet agent uniquement",
67663
+ 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.",
67664
+ 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.",
67665
+ 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.",
67666
+ filesAfterCreateHint: "Vous pouvez joindre des ressources à cette compétence après sa création (rouvrez-la avec Modifier).",
67667
+ noFiles: "Aucune ressource jointe pour le moment.",
67668
+ loadingFiles: "Chargement des ressources...",
67669
+ fileTypeLabel: "Type",
67670
+ fileTypeReference: "Référence",
67671
+ fileTypeScript: "Script",
67672
+ fileTypeAsset: "Ressource",
67673
+ fileNameLabel: "Nom du fichier",
67674
+ fileNamePlaceholder: "p. ex. grille.md",
67675
+ fileContentLabel: "Contenu",
67676
+ fileContentPlaceholder: "Le contenu texte du fichier",
67677
+ addFileButton: "Ajouter la ressource",
67678
+ adding: "Ajout...",
67679
+ uploading: "Téléversement...",
67680
+ fileAdded: "Ressource ajoutée",
67681
+ fileUploaded: "Ressource téléversée",
67682
+ fileSaved: "Ressource enregistrée",
67683
+ fileDeleted: "Ressource supprimée",
67684
+ failedToSaveFile: "Impossible d'enregistrer la ressource",
67685
+ failedToUploadFile: "Impossible de téléverser la ressource",
67686
+ failedToDeleteFile: "Impossible de supprimer la ressource",
67687
+ detailsTab: "Général",
67688
+ filesTab: "Ressources",
67689
+ newFile: "Nouvelle ressource",
67690
+ newFileDialogTitle: "Nouvelle ressource",
67691
+ editFileDialogTitle: "Modifier la ressource",
67692
+ deleteFileDialogTitle: "Supprimer la ressource",
67693
+ deleteFileConfirmation: "Voulez-vous vraiment supprimer {name} ? Cette action est irréversible.",
67694
+ chooseFile: "Choisir un fichier",
67695
+ upload: "Téléverser",
67696
+ download: "Télécharger",
67697
+ resourcesItemLabel: "ressources"
67561
67698
  };
67562
67699
  var clawSandboxHelpers$2 = {
67563
67700
  unknown: "Inconnu",
@@ -69822,7 +69959,7 @@ var safetyTabLabels$2 = {
69822
69959
  };
69823
69960
  var screenshareTabLabels$2 = {
69824
69961
  header: {
69825
- title: "Partage d’écran",
69962
+ title: "Écran",
69826
69963
  description: "Comment votre agent se comporte lorsqu’un utilisateur partage son écran pendant un appel vocal."
69827
69964
  },
69828
69965
  capability: {
@@ -71757,6 +71894,19 @@ var profileApplicationsQuestionsEditor$2 = {
71757
71894
  collapseSection: "Réduire la section",
71758
71895
  expandSection: "Développer la section"
71759
71896
  };
71897
+ var slashSkillPicker$2 = {
71898
+ listLabel: "Compétences de l'agent",
71899
+ resultsAnnouncement: "{count} compétences disponibles. Utilisez les flèches pour parcourir et Entrée pour sélectionner.",
71900
+ loading: "Chargement..."
71901
+ };
71902
+ var skillsTabLabels$2 = {
71903
+ header: {
71904
+ title: "Compétences",
71905
+ 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."
71906
+ },
71907
+ notBaseAgent: "Les compétences ne sont disponibles que pour les agents de base.",
71908
+ loading: "Chargement..."
71909
+ };
71760
71910
  var fr = {
71761
71911
  accessTabAddAccess: accessTabAddAccess$2,
71762
71912
  accessTabLabels: accessTabLabels$2,
@@ -72008,7 +72158,9 @@ var fr = {
72008
72158
  placementExam: placementExam$2,
72009
72159
  applyApplyWizard: applyApplyWizard$2,
72010
72160
  profileApplicationsTab: profileApplicationsTab$2,
72011
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$2
72161
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$2,
72162
+ slashSkillPicker: slashSkillPicker$2,
72163
+ skillsTabLabels: skillsTabLabels$2
72012
72164
  };
72013
72165
 
72014
72166
  var accessTabAddAccess$1 = {
@@ -73678,7 +73830,57 @@ var clawSandboxAgentSkills$1 = {
73678
73830
  fieldVersionPlaceholder: "ej. 1.0.0",
73679
73831
  fieldDescription: "Descripción",
73680
73832
  fieldDescriptionPlaceholder: "ej. Buscar información en la web",
73681
- fieldInstruction: "Instrucción"
73833
+ fieldInstruction: "Instrucción",
73834
+ 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.",
73835
+ effectiveHeading: "Habilidades de este agente",
73836
+ catalogHeading: "Habilidades disponibles",
73837
+ noEffectiveSkills: "Este agente aún no tiene habilidades habilitadas. Añade una desde las habilidades disponibles.",
73838
+ addToAgent: "Añadir",
73839
+ addToAgentLabel: "Añadir {name} a este agente",
73840
+ removeFromAgent: "Quitar del agente",
73841
+ skillAdded: "{name} añadida",
73842
+ skillRemoved: "{name} eliminada",
73843
+ featuredBadge: "Destacada",
73844
+ nativeBadge: "Nativa",
73845
+ privateBadge: "Solo este agente",
73846
+ fieldCategory: "Categoría",
73847
+ fieldCategoryPlaceholder: "p. ej. web, código, datos",
73848
+ privateToAgent: "Solo este agente",
73849
+ privateToAgentHint: "Las habilidades privadas solo están disponibles para este agente y tienen prioridad sobre las habilidades de la plataforma con el mismo slug.",
73850
+ instructionHint: "La guía que sigue el agente cuando se usa la habilidad. Los cambios se aplican de inmediato, incluso en conversaciones en curso.",
73851
+ 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.",
73852
+ filesAfterCreateHint: "Puedes adjuntar recursos a esta habilidad después de crearla (vuelve a abrirla con Editar).",
73853
+ noFiles: "Aún no hay recursos adjuntos.",
73854
+ loadingFiles: "Cargando recursos...",
73855
+ fileTypeLabel: "Tipo",
73856
+ fileTypeReference: "Referencia",
73857
+ fileTypeScript: "Script",
73858
+ fileTypeAsset: "Recurso",
73859
+ fileNameLabel: "Nombre del archivo",
73860
+ fileNamePlaceholder: "p. ej. rubrica.md",
73861
+ fileContentLabel: "Contenido",
73862
+ fileContentPlaceholder: "El contenido de texto del archivo",
73863
+ addFileButton: "Añadir recurso",
73864
+ adding: "Añadiendo...",
73865
+ uploading: "Subiendo...",
73866
+ fileAdded: "Recurso añadido",
73867
+ fileUploaded: "Recurso subido",
73868
+ fileSaved: "Recurso guardado",
73869
+ fileDeleted: "Recurso eliminado",
73870
+ failedToSaveFile: "No se pudo guardar el recurso",
73871
+ failedToUploadFile: "No se pudo subir el recurso",
73872
+ failedToDeleteFile: "No se pudo eliminar el recurso",
73873
+ detailsTab: "General",
73874
+ filesTab: "Recursos",
73875
+ newFile: "Nuevo recurso",
73876
+ newFileDialogTitle: "Nuevo recurso",
73877
+ editFileDialogTitle: "Editar recurso",
73878
+ deleteFileDialogTitle: "Eliminar recurso",
73879
+ deleteFileConfirmation: "¿Seguro que quieres eliminar {name}? Esta acción no se puede deshacer.",
73880
+ chooseFile: "Elegir archivo",
73881
+ upload: "Subir",
73882
+ download: "Descargar",
73883
+ resourcesItemLabel: "recursos"
73682
73884
  };
73683
73885
  var clawSandboxHelpers$1 = {
73684
73886
  unknown: "Desconocido",
@@ -75943,7 +76145,7 @@ var safetyTabLabels$1 = {
75943
76145
  };
75944
76146
  var screenshareTabLabels$1 = {
75945
76147
  header: {
75946
- title: "Pantalla compartida",
76148
+ title: "Pantalla",
75947
76149
  description: "Cómo se comporta tu agente cuando un usuario comparte su pantalla durante una llamada de voz."
75948
76150
  },
75949
76151
  capability: {
@@ -77878,6 +78080,19 @@ var profileApplicationsQuestionsEditor$1 = {
77878
78080
  collapseSection: "Contraer sección",
77879
78081
  expandSection: "Expandir sección"
77880
78082
  };
78083
+ var slashSkillPicker$1 = {
78084
+ listLabel: "Habilidades del agente",
78085
+ resultsAnnouncement: "{count} habilidades disponibles. Usa las flechas para navegar y Enter para seleccionar.",
78086
+ loading: "Cargando..."
78087
+ };
78088
+ var skillsTabLabels$1 = {
78089
+ header: {
78090
+ title: "Habilidades",
78091
+ 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."
78092
+ },
78093
+ notBaseAgent: "Las habilidades solo están disponibles para los agentes base.",
78094
+ loading: "Cargando..."
78095
+ };
77881
78096
  var es = {
77882
78097
  accessTabAddAccess: accessTabAddAccess$1,
77883
78098
  accessTabLabels: accessTabLabels$1,
@@ -78129,7 +78344,9 @@ var es = {
78129
78344
  placementExam: placementExam$1,
78130
78345
  applyApplyWizard: applyApplyWizard$1,
78131
78346
  profileApplicationsTab: profileApplicationsTab$1,
78132
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$1
78347
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor$1,
78348
+ slashSkillPicker: slashSkillPicker$1,
78349
+ skillsTabLabels: skillsTabLabels$1
78133
78350
  };
78134
78351
 
78135
78352
  var accessTabAddAccess = {
@@ -79799,7 +80016,57 @@ var clawSandboxAgentSkills = {
79799
80016
  fieldVersionPlaceholder: "例如:1.0.0",
79800
80017
  fieldDescription: "描述",
79801
80018
  fieldDescriptionPlaceholder: "例如:在网络上搜索信息",
79802
- fieldInstruction: "指令"
80019
+ fieldInstruction: "指令",
80020
+ sessionNote: "在此添加或移除的技能仅对新的聊天会话生效。技能指令的修改会立即生效,包括正在进行的对话。",
80021
+ effectiveHeading: "此智能体的技能",
80022
+ catalogHeading: "可用技能",
80023
+ noEffectiveSkills: "此智能体尚未启用任何技能。请从下方的可用技能中添加。",
80024
+ addToAgent: "添加",
80025
+ addToAgentLabel: "将 {name} 添加到此智能体",
80026
+ removeFromAgent: "从智能体中移除",
80027
+ skillAdded: "已添加 {name}",
80028
+ skillRemoved: "已移除 {name}",
80029
+ featuredBadge: "精选",
80030
+ nativeBadge: "原生",
80031
+ privateBadge: "仅此智能体",
80032
+ fieldCategory: "分类",
80033
+ fieldCategoryPlaceholder: "例如 web、代码、数据",
80034
+ privateToAgent: "仅此智能体",
80035
+ privateToAgentHint: "私有技能仅对此智能体可用,并优先于具有相同 slug 的平台技能。",
80036
+ instructionHint: "使用该技能时智能体遵循的操作指南。修改会立即生效,包括正在进行的对话。",
80037
+ filesHint: "智能体在使用此技能时可参考的可选资源。参考资料和脚本是文本文件;资产是上传的文件。",
80038
+ filesAfterCreateHint: "创建技能后即可附加资源(通过“编辑”重新打开)。",
80039
+ noFiles: "尚未附加任何资源。",
80040
+ loadingFiles: "正在加载资源...",
80041
+ fileTypeLabel: "类型",
80042
+ fileTypeReference: "参考资料",
80043
+ fileTypeScript: "脚本",
80044
+ fileTypeAsset: "资源",
80045
+ fileNameLabel: "文件名",
80046
+ fileNamePlaceholder: "例如 rubric.md",
80047
+ fileContentLabel: "内容",
80048
+ fileContentPlaceholder: "文件的文本内容",
80049
+ addFileButton: "添加资源",
80050
+ adding: "添加中...",
80051
+ uploading: "上传中...",
80052
+ fileAdded: "资源已添加",
80053
+ fileUploaded: "资源已上传",
80054
+ fileSaved: "资源已保存",
80055
+ fileDeleted: "资源已删除",
80056
+ failedToSaveFile: "保存资源失败",
80057
+ failedToUploadFile: "上传资源失败",
80058
+ failedToDeleteFile: "删除资源失败",
80059
+ detailsTab: "常规",
80060
+ filesTab: "资源",
80061
+ newFile: "新建资源",
80062
+ newFileDialogTitle: "新建资源",
80063
+ editFileDialogTitle: "编辑资源",
80064
+ deleteFileDialogTitle: "删除资源",
80065
+ deleteFileConfirmation: "确定要删除 {name} 吗?此操作无法撤销。",
80066
+ chooseFile: "选择文件",
80067
+ upload: "上传",
80068
+ download: "下载",
80069
+ resourcesItemLabel: "资源"
79803
80070
  };
79804
80071
  var clawSandboxHelpers = {
79805
80072
  unknown: "未知",
@@ -82064,7 +82331,7 @@ var safetyTabLabels = {
82064
82331
  };
82065
82332
  var screenshareTabLabels = {
82066
82333
  header: {
82067
- title: "屏幕共享",
82334
+ title: "屏幕",
82068
82335
  description: "当用户在语音通话中共享屏幕时,您的智能体的表现方式。"
82069
82336
  },
82070
82337
  capability: {
@@ -83999,6 +84266,19 @@ var profileApplicationsQuestionsEditor = {
83999
84266
  collapseSection: "折叠板块",
84000
84267
  expandSection: "展开板块"
84001
84268
  };
84269
+ var slashSkillPicker = {
84270
+ listLabel: "智能体技能",
84271
+ resultsAnnouncement: "{count} 个技能可用。使用方向键浏览,按 Enter 选择。",
84272
+ loading: "加载中..."
84273
+ };
84274
+ var skillsTabLabels = {
84275
+ header: {
84276
+ title: "技能",
84277
+ description: "可附加到此智能体的可复用操作指南——每个技能都是完成一项任务的指令集。在聊天中输入 / 即可使用。"
84278
+ },
84279
+ notBaseAgent: "技能仅适用于基础智能体。",
84280
+ loading: "加载中..."
84281
+ };
84002
84282
  var zh = {
84003
84283
  accessTabAddAccess: accessTabAddAccess,
84004
84284
  accessTabLabels: accessTabLabels,
@@ -84250,7 +84530,9 @@ var zh = {
84250
84530
  placementExam: placementExam,
84251
84531
  applyApplyWizard: applyApplyWizard,
84252
84532
  profileApplicationsTab: profileApplicationsTab,
84253
- profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor
84533
+ profileApplicationsQuestionsEditor: profileApplicationsQuestionsEditor,
84534
+ slashSkillPicker: slashSkillPicker,
84535
+ skillsTabLabels: skillsTabLabels
84254
84536
  };
84255
84537
 
84256
84538
  /**
@@ -181384,10 +181666,13 @@ function TopBanner({ parentContainerSelector, bannerText = '', loading = false,
181384
181666
  * getSessionUuid={() => getCurrentSessionId()}
181385
181667
  * getTenantKey={() => localStorage.getItem('tenant') || ''}
181386
181668
  * getMentorId={() => extractMentorIdFromUrl()}
181669
+ * // Course/unit context is parsed from the URL the time was spent on:
181670
+ * getCourseId={(url) => parseCourseId(url)}
181671
+ * getBlockId={(url) => parseUnitId(url)}
181387
181672
  * />
181388
181673
  * ```
181389
181674
  */
181390
- function TimeTrackingProvider({ intervalSeconds = 30, enabled = true, sessionUuid, getSessionUuid, getTenantKey, getMentorId, getCurrentUrl, onRouteChange, }) {
181675
+ function TimeTrackingProvider({ intervalSeconds = 30, enabled = true, sessionUuid, getSessionUuid, getTenantKey, getMentorId, getCourseId, getBlockId, getCurrentUrl, onRouteChange, }) {
181391
181676
  // Initialize time tracking
181392
181677
  useTimeTracking({
181393
181678
  intervalSeconds,
@@ -181396,6 +181681,8 @@ function TimeTrackingProvider({ intervalSeconds = 30, enabled = true, sessionUui
181396
181681
  getSessionUuid,
181397
181682
  getTenantKey,
181398
181683
  getMentorId,
181684
+ getCourseId,
181685
+ getBlockId,
181399
181686
  getCurrentUrl,
181400
181687
  onRouteChange,
181401
181688
  });
@@ -227076,27 +227363,192 @@ function AgentConfigPrompts({ platformKey, mentorUniqueId }) {
227076
227363
  }) }), editingField && (jsx(EditFieldModal, { isOpen: !!editingField, onClose: () => setEditingField(null), label: editingField.label, value: editingField.value, onSave: handleSaveField, isSaving: isUpdating }))] }));
227077
227364
  }
227078
227365
 
227366
+ /** Page size for the resources list inside the Edit Skill dialog. */
227367
+ const RESOURCES_PAGE_SIZE = 20;
227368
+ const EMPTY_RESOURCE_FORM = {
227369
+ file_type: 'reference',
227370
+ filename: '',
227371
+ content: '',
227372
+ };
227373
+ /**
227374
+ * File attachments for a skill (agent-skill-resources). `reference`/`script`
227375
+ * files are text (filename + content); `asset` files are binary uploads.
227376
+ * Rendered as the Files tab of the Edit Skill dialog: a list with row
227377
+ * actions, a New File popup for add/edit, and a delete confirmation.
227378
+ */
227379
+ function SkillResourcesSection({ platformKey, skillId }) {
227380
+ var _a, _b, _c;
227381
+ const t = useT();
227382
+ const [page, setPage] = useState(1);
227383
+ const { data: resourcePage, isLoading } = useGetAgentSkillResourcesQuery({
227384
+ org: platformKey,
227385
+ skill: skillId,
227386
+ limit: RESOURCES_PAGE_SIZE,
227387
+ offset: (page - 1) * RESOURCES_PAGE_SIZE,
227388
+ });
227389
+ const resources = (_a = resourcePage === null || resourcePage === void 0 ? void 0 : resourcePage.results) !== null && _a !== void 0 ? _a : [];
227390
+ const totalCount = (_b = resourcePage === null || resourcePage === void 0 ? void 0 : resourcePage.count) !== null && _b !== void 0 ? _b : 0;
227391
+ const totalPages = Math.max(1, Math.ceil(totalCount / RESOURCES_PAGE_SIZE));
227392
+ // Deleting the last item of the last page leaves the page out of range —
227393
+ // snap back to the new last page.
227394
+ useEffect(() => {
227395
+ if (page > totalPages)
227396
+ setPage(totalPages);
227397
+ }, [page, totalPages]);
227398
+ const [createResource, { isLoading: isCreating }] = useCreateAgentSkillResourceMutation();
227399
+ const [updateResource, { isLoading: isUpdating }] = useUpdateAgentSkillResourceMutation();
227400
+ const [uploadAsset, { isLoading: isUploading }] = useUploadAgentSkillResourceAssetMutation();
227401
+ const [deleteResource, { isLoading: isDeleting }] = useDeleteAgentSkillResourceMutation();
227402
+ const [showFileDialog, setShowFileDialog] = useState(false);
227403
+ const [editingResource, setEditingResource] = useState(null);
227404
+ const [deletingResource, setDeletingResource] = useState(null);
227405
+ const [form, setForm] = useState(EMPTY_RESOURCE_FORM);
227406
+ const [assetFile, setAssetFile] = useState(null);
227407
+ const fileInputRef = useRef(null);
227408
+ const isSaving = isCreating || isUpdating || isUploading;
227409
+ const isAssetForm = form.file_type === 'asset' && !editingResource;
227410
+ const canSubmitFile = isAssetForm ? !!assetFile : !!form.filename && !!form.content;
227411
+ const typeLabel = (fileType) => {
227412
+ switch (fileType) {
227413
+ case 'script':
227414
+ return t('clawSandboxAgentSkills.fileTypeScript');
227415
+ case 'asset':
227416
+ return t('clawSandboxAgentSkills.fileTypeAsset');
227417
+ default:
227418
+ return t('clawSandboxAgentSkills.fileTypeReference');
227419
+ }
227420
+ };
227421
+ const openNewFileDialog = () => {
227422
+ setForm(EMPTY_RESOURCE_FORM);
227423
+ setAssetFile(null);
227424
+ setEditingResource(null);
227425
+ setShowFileDialog(true);
227426
+ };
227427
+ const openEditFileDialog = (resource) => {
227428
+ var _a, _b;
227429
+ setForm({
227430
+ file_type: (_a = resource.file_type) !== null && _a !== void 0 ? _a : 'reference',
227431
+ filename: resource.filename,
227432
+ content: (_b = resource.content) !== null && _b !== void 0 ? _b : '',
227433
+ });
227434
+ setAssetFile(null);
227435
+ setEditingResource(resource);
227436
+ setShowFileDialog(true);
227437
+ };
227438
+ const closeFileDialog = () => {
227439
+ setShowFileDialog(false);
227440
+ setEditingResource(null);
227441
+ setForm(EMPTY_RESOURCE_FORM);
227442
+ setAssetFile(null);
227443
+ };
227444
+ const handleSubmitFile = async () => {
227445
+ try {
227446
+ if (editingResource) {
227447
+ await updateResource({
227448
+ org: platformKey,
227449
+ id: editingResource.id,
227450
+ filename: form.filename,
227451
+ content: form.content,
227452
+ }).unwrap();
227453
+ toast.success(t('clawSandboxAgentSkills.fileSaved'));
227454
+ }
227455
+ else if (isAssetForm) {
227456
+ if (!assetFile)
227457
+ return;
227458
+ await uploadAsset({
227459
+ org: platformKey,
227460
+ skill: skillId,
227461
+ file: assetFile,
227462
+ filename: assetFile.name,
227463
+ }).unwrap();
227464
+ toast.success(t('clawSandboxAgentSkills.fileUploaded'));
227465
+ }
227466
+ else {
227467
+ await createResource({
227468
+ org: platformKey,
227469
+ skill: skillId,
227470
+ file_type: form.file_type,
227471
+ filename: form.filename,
227472
+ content: form.content,
227473
+ }).unwrap();
227474
+ toast.success(t('clawSandboxAgentSkills.fileAdded'));
227475
+ }
227476
+ closeFileDialog();
227477
+ }
227478
+ catch (_a) {
227479
+ toast.error(t(isAssetForm
227480
+ ? 'clawSandboxAgentSkills.failedToUploadFile'
227481
+ : 'clawSandboxAgentSkills.failedToSaveFile'));
227482
+ }
227483
+ };
227484
+ const handleDeleteFile = async () => {
227485
+ if (!deletingResource)
227486
+ return;
227487
+ try {
227488
+ await deleteResource({ org: platformKey, id: deletingResource.id }).unwrap();
227489
+ toast.success(t('clawSandboxAgentSkills.fileDeleted'));
227490
+ setDeletingResource(null);
227491
+ }
227492
+ catch (_a) {
227493
+ toast.error(t('clawSandboxAgentSkills.failedToDeleteFile'));
227494
+ }
227495
+ };
227496
+ const submitLabel = () => {
227497
+ if (editingResource) {
227498
+ return isUpdating ? t('clawSandboxAgentSkills.saving') : t('clawSandboxAgentSkills.save');
227499
+ }
227500
+ if (isAssetForm) {
227501
+ return isUploading
227502
+ ? t('clawSandboxAgentSkills.uploading')
227503
+ : t('clawSandboxAgentSkills.upload');
227504
+ }
227505
+ return isCreating ? t('clawSandboxAgentSkills.adding') : t('clawSandboxAgentSkills.addFileButton');
227506
+ };
227507
+ 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', {
227508
+ name: resource.filename,
227509
+ }), 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
227510
+ ? 'clawSandboxAgentSkills.editFileDialogTitle'
227511
+ : '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', {
227512
+ name: (_c = deletingResource === null || deletingResource === void 0 ? void 0 : deletingResource.filename) !== null && _c !== void 0 ? _c : '',
227513
+ }) }), 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
227514
+ ? t('clawSandboxAgentSkills.deleting')
227515
+ : t('clawSandboxAgentSkills.delete') })] })] })] }));
227516
+ }
227517
+
227079
227518
  const EMPTY_SKILL_FORM = {
227080
227519
  name: '',
227081
227520
  slug: '',
227082
227521
  description: '',
227083
227522
  version: '1.0.0',
227523
+ category: '',
227084
227524
  instruction: '',
227525
+ privateToAgent: false,
227085
227526
  };
227527
+ // The builder resolves the effective skill set client-side, which needs the
227528
+ // complete catalog and assignment lists. Request one explicit large page so
227529
+ // the result is deterministic even if the backend later configures a default
227530
+ // page size (the list endpoints unwrap paginated envelopes to `results`).
227531
+ const FULL_LIST_LIMIT = 1000;
227086
227532
  function AgentSkills({ platformKey, mentorUniqueId }) {
227087
227533
  var _a;
227088
227534
  const t = useT();
227089
227535
  // Skills are managed independently of the sandbox connection — org-level
227090
227536
  // skills and the mentor's assignments both resolve without a wired Claw
227091
227537
  // instance, so we always fetch and let admins add/assign skills freely.
227538
+ // Always fetch — the backend enforces read access; RBAC here only gates
227539
+ // the write affordances (a partial permissions map must not blank the UI).
227092
227540
  const { data: availableSkills, isLoading: isLoadingSkills } = useGetAgentSkillsQuery({
227093
227541
  org: platformKey,
227542
+ limit: FULL_LIST_LIMIT,
227543
+ offset: 0,
227094
227544
  });
227095
227545
  const { data: assignments, isLoading: isLoadingAssignments } = useGetMentorSkillAssignmentsQuery({
227096
227546
  org: platformKey,
227097
227547
  mentorUniqueId,
227548
+ limit: FULL_LIST_LIMIT,
227549
+ offset: 0,
227098
227550
  });
227099
- // Assignment mutations (toggle on mentor)
227551
+ // Assignment mutations (attach/detach/toggle on the agent)
227100
227552
  const [createAssignment, { isLoading: isCreatingAssignment }] = useCreateMentorSkillAssignmentMutation();
227101
227553
  const [updateAssignment, { isLoading: isUpdatingAssignment }] = useUpdateMentorSkillAssignmentMutation();
227102
227554
  const [deleteAssignment, { isLoading: isDeletingAssignment }] = useDeleteMentorSkillAssignmentMutation();
@@ -227109,59 +227561,95 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227109
227561
  const [deletingSkill, setDeletingSkill] = useState(null);
227110
227562
  const [form, setForm] = useState(EMPTY_SKILL_FORM);
227111
227563
  const isLoading = isLoadingSkills || isLoadingAssignments;
227112
- const isTogglingMentorSkill = isCreatingAssignment || isUpdatingAssignment || isDeletingAssignment;
227113
- const skills = (availableSkills !== null && availableSkills !== void 0 ? availableSkills : []).filter((s) => s.enabled);
227114
- // Skill assignments are now keyed by skill UUID (the new stable identifier).
227115
- const assignmentsBySkillUniqueId = new Map((assignments !== null && assignments !== void 0 ? assignments : []).map((a) => [a.skill, a]));
227564
+ const isMutatingAgentSkill = isCreatingAssignment || isUpdatingAssignment || isDeletingAssignment || isUpdatingSkill;
227565
+ const allSkills = availableSkills !== null && availableSkills !== void 0 ? availableSkills : [];
227566
+ const effectiveSkills = resolveEffectiveAgentSkills(allSkills, assignments !== null && assignments !== void 0 ? assignments : [], mentorUniqueId);
227567
+ const effectiveUniqueIds = new Set(effectiveSkills.map((s) => s.unique_id));
227568
+ const effectiveSlugs = new Set(effectiveSkills.map((s) => s.slug));
227569
+ // Catalog skills this agent could still attach: enabled, platform-wide
227570
+ // (never another agent's private skills), and not already effective. A
227571
+ // skill whose slug is already effective (e.g. shadowed by a private skill)
227572
+ // would dedupe away after attaching — don't offer an Add that does nothing.
227573
+ const attachableSkills = allSkills.filter((skill) => skill.enabled &&
227574
+ !skill.mentor &&
227575
+ !effectiveUniqueIds.has(skill.unique_id) &&
227576
+ !effectiveSlugs.has(skill.slug));
227577
+ // Featured skills from the `main` platform are read-only for tenants — the
227578
+ // API 404s writes against them, so hide the edit/delete affordances.
227579
+ const isSkillEditable = (skill) => {
227580
+ if (!skill)
227581
+ return false;
227582
+ return skill.platform_key ? skill.platform_key === platformKey : !skill.is_featured;
227583
+ };
227116
227584
  const resetForm = () => setForm(EMPTY_SKILL_FORM);
227117
- const handleToggle = async (skill, shouldEnable) => {
227118
- const existing = assignmentsBySkillUniqueId.get(skill.unique_id);
227585
+ const handleToggleEffective = async (effective, shouldEnable) => {
227119
227586
  try {
227120
- if (shouldEnable) {
227121
- if (existing) {
227122
- await updateAssignment({
227123
- org: platformKey,
227124
- mentorUniqueId,
227125
- assignmentPk: existing.id,
227126
- enabled: true,
227127
- }).unwrap();
227128
- }
227129
- else {
227130
- await createAssignment({
227131
- org: platformKey,
227132
- mentorUniqueId,
227133
- skill: skill.unique_id,
227134
- enabled: true,
227135
- }).unwrap();
227136
- }
227137
- toast.success(t('clawSandboxAgentSkills.skillEnabled', { name: skill.name }));
227587
+ if (effective.origin === 'private' && effective.skill) {
227588
+ await updateSkill({
227589
+ org: platformKey,
227590
+ id: effective.skill.id,
227591
+ enabled: shouldEnable,
227592
+ }).unwrap();
227138
227593
  }
227139
- else {
227140
- if (!existing)
227141
- return;
227142
- await deleteAssignment({
227594
+ else if (effective.assignmentId !== undefined) {
227595
+ await updateAssignment({
227143
227596
  org: platformKey,
227144
227597
  mentorUniqueId,
227145
- assignmentPk: existing.id,
227598
+ assignmentPk: effective.assignmentId,
227599
+ enabled: shouldEnable,
227146
227600
  }).unwrap();
227147
- toast.success(t('clawSandboxAgentSkills.skillDisabled', { name: skill.name }));
227148
227601
  }
227602
+ toast.success(t(shouldEnable
227603
+ ? 'clawSandboxAgentSkills.skillEnabled'
227604
+ : 'clawSandboxAgentSkills.skillDisabled', { name: effective.name }));
227605
+ }
227606
+ catch (_a) {
227607
+ toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: effective.name }));
227608
+ }
227609
+ };
227610
+ const handleAttach = async (skill) => {
227611
+ try {
227612
+ await createAssignment({
227613
+ org: platformKey,
227614
+ mentorUniqueId,
227615
+ skill: skill.unique_id,
227616
+ enabled: true,
227617
+ }).unwrap();
227618
+ toast.success(t('clawSandboxAgentSkills.skillAdded', { name: skill.name }));
227149
227619
  }
227150
227620
  catch (_a) {
227151
227621
  toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: skill.name }));
227152
227622
  }
227153
227623
  };
227624
+ const handleDetach = async (effective) => {
227625
+ if (effective.assignmentId === undefined)
227626
+ return;
227627
+ try {
227628
+ await deleteAssignment({
227629
+ org: platformKey,
227630
+ mentorUniqueId,
227631
+ assignmentPk: effective.assignmentId,
227632
+ }).unwrap();
227633
+ toast.success(t('clawSandboxAgentSkills.skillRemoved', { name: effective.name }));
227634
+ }
227635
+ catch (_a) {
227636
+ toast.error(t('clawSandboxAgentSkills.failedToUpdateSkill', { name: effective.name }));
227637
+ }
227638
+ };
227154
227639
  const openNewSkillDialog = () => {
227155
227640
  resetForm();
227156
227641
  setShowNewDialog(true);
227157
227642
  };
227158
227643
  const openEditSkillDialog = (skill) => {
227644
+ var _a;
227159
227645
  setForm({
227160
227646
  name: skill.name,
227161
227647
  slug: skill.slug,
227162
227648
  description: skill.description,
227163
227649
  version: skill.version,
227650
+ category: (_a = skill.category) !== null && _a !== void 0 ? _a : '',
227164
227651
  instruction: skill.instruction,
227652
+ privateToAgent: skill.mentor === mentorUniqueId,
227165
227653
  });
227166
227654
  setEditingSkill(skill);
227167
227655
  };
@@ -227182,6 +227670,8 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227182
227670
  slug: form.slug,
227183
227671
  description: form.description,
227184
227672
  version: form.version || '1.0.0',
227673
+ ...(form.category && { category: form.category }),
227674
+ ...(form.privateToAgent && { mentor: mentorUniqueId }),
227185
227675
  instruction: form.instruction,
227186
227676
  enabled: true,
227187
227677
  }).unwrap();
@@ -227207,6 +227697,7 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227207
227697
  slug: form.slug,
227208
227698
  description: form.description,
227209
227699
  version: form.version,
227700
+ category: form.category,
227210
227701
  instruction: form.instruction,
227211
227702
  }).unwrap();
227212
227703
  toast.success(t('clawSandboxAgentSkills.skillUpdated'));
@@ -227228,32 +227719,169 @@ function AgentSkills({ platformKey, mentorUniqueId }) {
227228
227719
  toast.error(t('clawSandboxAgentSkills.failedToDeleteSkill'));
227229
227720
  }
227230
227721
  };
227722
+ const renderBadges = (skill, effective) => {
227723
+ var _a, _b, _c;
227724
+ 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;
227725
+ 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;
227726
+ 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;
227727
+ 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') }))] }));
227728
+ };
227729
+ const renderSkillMenu = (skill, effective) => {
227730
+ var _a, _b;
227731
+ const editable = isSkillEditable(skill);
227732
+ const showEdit = editable;
227733
+ const showDelete = editable;
227734
+ const detachable = (effective === null || effective === void 0 ? void 0 : effective.origin) === 'assignment';
227735
+ if (!showEdit && !showDelete && !detachable)
227736
+ return null;
227737
+ 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 : '';
227738
+ 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')] }))] })] }));
227739
+ };
227231
227740
  if (isLoading) {
227232
227741
  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') })] }));
227233
227742
  }
227234
- return (jsxs("div", { className: "space-y-4", "data-testid": "agent-skills-content", children: [jsx("div", { className: "flex items-center justify-end", children: jsxs(Button$1, { onClick: openNewSkillDialog, size: "sm", className: "cursor-pointer bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: [jsx(Plus, { className: "h-4 w-4" }), t('clawSandboxAgentSkills.newSkill')] }) }), skills.length === 0 ? (jsx("div", { className: "flex items-center justify-center rounded-lg border p-6", children: jsx("p", { className: "text-sm text-gray-500", children: t('clawSandboxAgentSkills.noSkillsAvailable') }) })) : (jsx("div", { className: "space-y-6", children: skills.map((skill) => {
227235
- var _a;
227236
- const assignment = assignmentsBySkillUniqueId.get(skill.unique_id);
227237
- const isEnabled = (_a = assignment === null || assignment === void 0 ? void 0 : assignment.enabled) !== null && _a !== void 0 ? _a : false;
227238
- return (jsxs("div", { className: "flex items-center justify-between rounded-lg border p-6", children: [jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: skill.name }), skill.description && (jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('clawSandboxAgentSkills.moreInfoAbout', {
227239
- name: skill.name,
227240
- }), children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "ibl-tooltip-content", children: jsx("p", { children: skill.description }) })] }) })), jsxs("span", { className: "hidden sm:inline text-xs text-gray-400", children: ["v", skill.version] })] }), jsxs("div", { className: "flex items-center gap-2", children: [jsx(Switch, { checked: isEnabled, onCheckedChange: (checked) => handleToggle(skill, checked), disabled: isTogglingMentorSkill, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": t(isEnabled
227241
- ? 'clawSandboxAgentSkills.skillEnabledLabel'
227242
- : 'clawSandboxAgentSkills.skillDisabledLabel', { name: skill.name }) }), jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsx(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxAgentSkills.skillActions', {
227243
- name: skill.name,
227244
- }), 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));
227245
- }) })), 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
227246
- ? t('clawSandboxAgentSkills.creating')
227247
- : 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
227248
- ? t('clawSandboxAgentSkills.saving')
227249
- : 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
227743
+ 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) => {
227744
+ var _a;
227745
+ 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
227746
+ ? 'clawSandboxAgentSkills.skillEnabledLabel'
227747
+ : 'clawSandboxAgentSkills.skillDisabledLabel', { name: effective.name }) }), renderSkillMenu(effective.skill, effective)] })] }, effective.unique_id));
227748
+ }) }))] }), 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
227749
+ ? t('clawSandboxAgentSkills.creating')
227750
+ : 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
227751
+ ? t('clawSandboxAgentSkills.saving')
227752
+ : 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
227250
227753
  ? t('clawSandboxAgentSkills.deleting')
227251
227754
  : t('clawSandboxAgentSkills.delete') })] })] })] }));
227252
227755
  }
227253
227756
  // ── Shared Skill Form ────────────────────────────────────────────────────────
227254
- function SkillForm({ form, onChange, }) {
227757
+ function SkillForm({ form, onChange, showPrivateToggle = false, }) {
227758
+ const t = useT();
227759
+ 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 }) })] })] }));
227760
+ }
227761
+
227762
+ /** Distance (px) from the list bottom at which the next page is requested. */
227763
+ const LOAD_MORE_THRESHOLD_PX = 48;
227764
+ /**
227765
+ * Listbox half of the chat `/` skill combobox. The composer textarea owns
227766
+ * focus and keyboard handling (see `useSlashSkillPicker`); options here are
227767
+ * referenced via `aria-activedescendant` and selected on click. Scrolling
227768
+ * near the bottom lazily loads the next page of skills.
227769
+ */
227770
+ function SlashSkillPicker({ skills, activeIndex, listboxId, onSelect, onActiveIndexChange, isLoading = false, isFetchingMore = false, hasMore = false, onLoadMore, }) {
227255
227771
  const t = useT();
227256
- 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 }) })] })] }));
227772
+ const listRef = useRef(null);
227773
+ // Keep the active option scrolled into view during arrow-key browsing.
227774
+ useEffect(() => {
227775
+ var _a;
227776
+ const option = (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.children[activeIndex];
227777
+ option === null || option === void 0 ? void 0 : option.scrollIntoView({ block: 'nearest' });
227778
+ }, [activeIndex]);
227779
+ if (skills.length === 0 && !isLoading)
227780
+ return null;
227781
+ const handleScroll = (event) => {
227782
+ if (!hasMore || isFetchingMore || !onLoadMore)
227783
+ return;
227784
+ const el = event.currentTarget;
227785
+ if (el.scrollTop + el.clientHeight >= el.scrollHeight - LOAD_MORE_THRESHOLD_PX) {
227786
+ onLoadMore();
227787
+ }
227788
+ };
227789
+ 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
227790
+ ? t('slashSkillPicker.loading')
227791
+ : 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),
227792
+ // onMouseDown so selection wins over the textarea losing focus.
227793
+ onMouseDown: (e) => {
227794
+ e.preventDefault();
227795
+ onSelect(skill);
227796
+ }, 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') })] }))] }))] }));
227797
+ }
227798
+
227799
+ /** Matches a composer value that is a single `/`-prefixed token (no whitespace). */
227800
+ const SLASH_TOKEN_RE = /^\/\S*$/;
227801
+ /** Whether the composer text is a `/` skill token (single word, leading slash). */
227802
+ function isSlashCommandToken(value) {
227803
+ return SLASH_TOKEN_RE.test(value);
227804
+ }
227805
+ /**
227806
+ * State machine for the chat `/` skill picker. Opens while the composer holds
227807
+ * a single `/`-prefixed token and at least one enabled skill matches; `Esc`
227808
+ * dismisses until the token is cleared, so plain text starting with `/` is
227809
+ * never blocked.
227810
+ */
227811
+ function useSlashSkillPicker({ inputValue, setInputValue, skills, isLoading = false, }) {
227812
+ const listboxId = useId$2();
227813
+ const [dismissed, setDismissed] = useState(false);
227814
+ const [activeIndex, setActiveIndex] = useState(0);
227815
+ const isSlashToken = SLASH_TOKEN_RE.test(inputValue);
227816
+ const query = isSlashToken ? inputValue.slice(1) : '';
227817
+ const filteredSkills = useMemo(() => (isSlashToken ? filterSlashSkills(skills, query) : []), [isSlashToken, skills, query]);
227818
+ // Loading keeps the picker open (with a loading row) so the user knows
227819
+ // something is coming; once loaded, zero matches closes it.
227820
+ const open = isSlashToken && !dismissed && (filteredSkills.length > 0 || isLoading);
227821
+ // Re-arm the picker once the slash token is gone (text sent or cleared).
227822
+ useEffect(() => {
227823
+ if (!isSlashToken && dismissed)
227824
+ setDismissed(false);
227825
+ }, [isSlashToken, dismissed]);
227826
+ // Keep the active option valid as the query narrows the list.
227827
+ const filteredLength = filteredSkills.length;
227828
+ const previousLength = useRef(filteredLength);
227829
+ useEffect(() => {
227830
+ if (previousLength.current !== filteredLength) {
227831
+ previousLength.current = filteredLength;
227832
+ setActiveIndex(0);
227833
+ }
227834
+ }, [filteredLength]);
227835
+ const selectSkill = (skill) => {
227836
+ setInputValue(`/${skill.slug} `);
227837
+ setActiveIndex(0);
227838
+ };
227839
+ const handleKeyDown = (event) => {
227840
+ if (!open)
227841
+ return false;
227842
+ switch (event.key) {
227843
+ case 'ArrowDown':
227844
+ if (!filteredSkills.length)
227845
+ return false;
227846
+ event.preventDefault();
227847
+ setActiveIndex((index) => (index + 1) % filteredSkills.length);
227848
+ return true;
227849
+ case 'ArrowUp':
227850
+ if (!filteredSkills.length)
227851
+ return false;
227852
+ event.preventDefault();
227853
+ setActiveIndex((index) => (index - 1 + filteredSkills.length) % filteredSkills.length);
227854
+ return true;
227855
+ case 'Enter':
227856
+ if (event.shiftKey || !filteredSkills.length)
227857
+ return false;
227858
+ event.preventDefault();
227859
+ selectSkill(filteredSkills[activeIndex]);
227860
+ return true;
227861
+ case 'Tab':
227862
+ if (!filteredSkills.length)
227863
+ return false;
227864
+ event.preventDefault();
227865
+ selectSkill(filteredSkills[activeIndex]);
227866
+ return true;
227867
+ case 'Escape':
227868
+ event.preventDefault();
227869
+ setDismissed(true);
227870
+ return true;
227871
+ default:
227872
+ return false;
227873
+ }
227874
+ };
227875
+ return {
227876
+ open,
227877
+ filteredSkills,
227878
+ activeIndex,
227879
+ setActiveIndex,
227880
+ listboxId,
227881
+ activeOptionId: open && filteredSkills.length > 0 ? `${listboxId}-option-${activeIndex}` : undefined,
227882
+ selectSkill,
227883
+ handleKeyDown,
227884
+ };
227257
227885
  }
227258
227886
 
227259
227887
  /**
@@ -228718,7 +229346,7 @@ const CSS_CLASS_NAMES = {
228718
229346
  STOP_STREAMING_BUTTON: 'chat-stop-streaming-button',
228719
229347
  }};
228720
229348
 
228721
- const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmit, disabled = false, placeholder = '', sessionId = null, isPreviewMode = false, textAreaRows = 3, className = '', style = {}, allowAnonymousAccess = false, embedMode = false, ...props }) => {
229349
+ const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmit, onComposerKeyDown, disabled = false, placeholder = '', sessionId = null, isPreviewMode = false, textAreaRows = 3, className = '', style = {}, allowAnonymousAccess = false, embedMode = false, ...props }) => {
228722
229350
  const textareaRef = useRef(null);
228723
229351
  const [isResizing, setIsResizing] = useState(false);
228724
229352
  const numberOfMessages = useSelector(selectNumberOfActiveChatMessages);
@@ -228766,6 +229394,8 @@ const AutoResizeTextarea = ({ allowEmptySubmit = false, value, onChange, onSubmi
228766
229394
  const handleKeyDown = (e) => {
228767
229395
  if (isPreviewMode && !allowAnonymousAccess)
228768
229396
  return;
229397
+ if (onComposerKeyDown === null || onComposerKeyDown === void 0 ? void 0 : onComposerKeyDown(e))
229398
+ return;
228769
229399
  if (e.key === 'Enter' && !e.shiftKey) {
228770
229400
  e.preventDefault();
228771
229401
  if (value.trim() || allowEmptySubmit) {
@@ -229655,7 +230285,7 @@ function SubmitMessageButton({ isPreviewMode, allowAnonymousAccess, isUploading,
229655
230285
  const PromptGalleryModal$1 = dynamic(() => Promise.resolve().then(function () { return promptGalleryModal; }).then((mod) => mod.PromptGalleryModal), {
229656
230286
  ssr: false,
229657
230287
  });
229658
- 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, }) {
230288
+ 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, }) {
229659
230289
  var _a, _b, _c, _d, _e;
229660
230290
  const t = useT();
229661
230291
  const dispatch = useDispatch();
@@ -229709,6 +230339,15 @@ function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpe
229709
230339
  const setInputValue = (input) => {
229710
230340
  dispatch(chatInputSliceActions.setTextareaInput(input));
229711
230341
  };
230342
+ // `/` skill picker — active only when the host supplies the agent's
230343
+ // effective skills (or reports them loading). No fetching happens here.
230344
+ const effectiveSlashSkills = slashSkills !== null && slashSkills !== void 0 ? slashSkills : [];
230345
+ const slashPicker = useSlashSkillPicker({
230346
+ inputValue,
230347
+ setInputValue,
230348
+ skills: effectiveSlashSkills,
230349
+ isLoading: slashSkillsLoading,
230350
+ });
229712
230351
  const handleSelectPrompt = (promptText) => {
229713
230352
  setInputValue(promptText);
229714
230353
  setIsPromptGalleryOpen(false);
@@ -229773,9 +230412,18 @@ function ChatInputForm({ onSubmit, onScreenSharingClick, isScreenSharingModalOpe
229773
230412
  }
229774
230413
  return persistentChatInputLabel ? '' : t('chatInputForm.askAnything');
229775
230414
  };
229776
- 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
230415
+ 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
229777
230416
  ? 'block px-[18.5px] pt-3 text-xs font-medium text-gray-600'
229778
- : 'sr-only'), children: t('chatInputForm.askAnything') }), jsx(AutoResizeTextarea, { id: "chat-input-textarea", "aria-labelledby": "chat-input-label", "aria-describedby": ((_e = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.data) === null || _e === void 0 ? void 0 : _e.disclaimer) ? 'chat-input-disclaimer' : undefined, value: inputValue, onChange: handleInputChange, onSubmit: handleSubmit, sessionId: sessionId, isPreviewMode: isPreviewMode, textAreaRows: textAreaRows, placeholder: isChatDisabledByRbac ? t('chatInputForm.noChatPermission') : textAreaPlaceholder(), disabled: isChatDisabledByRbac || hasUploadingFiles, allowEmptySubmit: attachedFiles.length > 0, allowAnonymousAccess: isMentorViewableByAnyone || showingSharedChat || !!userIsVisiting, embedMode: embedMode }), jsxs("div", { className: "flex items-center gap-2 px-2", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(UploadMenu, { onFileInputTrigger: () => executeWithTrialCheck(triggerFileInput), disabled: isChatDisabledByRbac || !sessionId, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(InsideButtons, { containerWidth: containerWidth, activeOptions: activeTools, onOptionClick: updateSessionTools, deepResearch: deepResearch, artifactsEnabled: artifactsEnabled, disabled: isChatDisabledByRbac, onOpenPromptGallery: openPromptGallery, embedMode: embedMode, promptsIsEnabled: promptsIsEnabled, studyMode: studyMode, memoryEnabled: mentorSettings.data.memoryEnabled, mentorId: mentorId, tenantKey: tenantKey, username: username })), jsxs("div", { className: "ml-auto flex", children: [visibleToLoggedInUsersOnly && !compactMode && (jsx(ScreenSharingButton, { onClick: onScreenSharingClick, isScreenSharingModalOpen: isScreenSharingModalOpen, screenSharing: screenSharing, isPreviewMode: isPreviewMode, disabled: isChatDisabledByRbac })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceChatButton, { isPreviewMode: isPreviewMode, handleMicrophoneBtnClick: () => executeWithTrialCheck(handleMicrophoneBtnClick), processing: processing, recording: recording, disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), visibleToLoggedInUsersOnly && !compactMode && (jsx(VoiceCallButton, { isPreviewMode: isPreviewMode, onClick: () => executeWithTrialCheck(onPhoneCallClick), disabled: isChatDisabledByRbac, mentorId: mentorId, tenantKey: tenantKey, isPublicRoute: isPublicRoute })), isStreaming ? (jsx(StopStreamingButton, { ref: stopStreamingButtonRef, stopGenerating: stopGenerating })) : (jsx(SubmitMessageButton, { isPreviewMode: isPreviewMode, allowAnonymousAccess: isMentorViewableByAnyone, isUploading: hasUploadingFiles, disabled: isChatDisabledByRbac || !sessionId, isConnecting: isConnecting }))] })] })] }), jsx("input", { type: "file", ref: fileUploadInputRef, className: "hidden", onChange: handleFileInputChange, accept: fileUploadCapabilities.allSupportedTypes.length > 0
230417
+ : '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) && {
230418
+ role: 'combobox',
230419
+ 'aria-expanded': slashPicker.open,
230420
+ 'aria-haspopup': 'listbox',
230421
+ 'aria-controls': slashPicker.open && slashPicker.filteredSkills.length > 0
230422
+ ? slashPicker.listboxId
230423
+ : undefined,
230424
+ 'aria-activedescendant': slashPicker.activeOptionId,
230425
+ 'aria-autocomplete': 'list',
230426
+ }), 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
229779
230427
  ? fileUploadCapabilities.allSupportedTypes.join(',')
229780
230428
  : 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 }))] }));
229781
230429
  }
@@ -233912,5 +234560,5 @@ var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
233912
234560
  TrainOrDeleteModal: TrainOrDeleteModal
233913
234561
  });
233914
234562
 
233915
- 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, 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, 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, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
234563
+ 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 };
233916
234564
  //# sourceMappingURL=index.esm.js.map