@iblai/iblai-js 2.6.1 → 2.7.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.
@@ -3,7 +3,7 @@ import React__default, { useRef, useEffect, useState, useCallback, useLayoutEffe
3
3
  import { useDispatch, useSelector } from 'react-redux';
4
4
  import { selectSessionId, selectActiveChatMessages, useCachedSessionId, chatActions, LOCAL_STORAGE_KEYS, TimeTracker, getInitials, useTenantMetadata, useCurrentTenant, selectRbacPermissions, isPureWatcher, WithPermissions, canWriteField, useStripeUpgrade, openExternalUrl, CHAT_AREA_SIZE, isAlphaNumeric32, checkRbacPermission, getTimeAgo, REQUIRED_ACTIONS_FOR_GROUPS, getVisibleAnalyticsTabs, formatRelativeTime as formatRelativeTime$2, ANONYMOUS_USERNAME, combineCSVData, WATCHER_HIDDEN_REPORTS, canViewPlatformAuditLogs, redirectToAuthSpaJoinTenant, redirectToAuthSpa, getAuthSpaJoinUrl, useOS, selectNumberOfActiveChatMessages, useUsername, selectStreaming, isLoggedIn, TOOLS, hasRemoteAiConfig, isSafariBrowser, useShowAttachment, useShowVoiceCall, useShowVoiceRecorder, useMentorSettings, selectShowingSharedChat, useShowFreeTrialDialog, useEmbedMode, chatInputSliceSelectors, useResponsive, useAccessingPublicRoute, useVisitingTenant, useModelFileUploadCapabilities, useChatFileUpload, useVoiceChat, selectAttachedFiles, MENTOR_CHAT_DOCUMENTS_EXTENSIONS, chatInputSliceActions, removeFile, WithFormPermissions, MENTOR_VISIBILITY } from '@iblai/web-utils';
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, useUpdateGlobalMemoryMutation, useUpdateMentorMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useGetAllMentorMemoriesQuery, useDeleteGlobalMemoryMutation, useDeleteMentorMemoryMutation, useGetAiSearchMentorsQuery, useGetUserChatHistoryReportsQuery, USER_CHAT_HISTORY_REPORT_ACTIVE_STATES, useCreateUserChatHistoryReportMutation, useLazyGetDownloadReportFromURLQuery, useGetUserChatHistoryReportStatusQuery, userChatHistoryApiSlice, USER_CHAT_HISTORY_QUERY_KEYS, useGetUserChatHistoryQuery, useGetUserChatHistoryFilterQuery, useGetMentorsQuery, useGetUserChatHistorySessionQuery, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, useGetAccessibleUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useGetTenantMetadataQuery, useUpdateTenantMetadataMutation, useLazyGetTenantMetadataQuery, useDeleteApiKeyMutation, useGetApiKeyQuery, useGetApiKeyFieldPermissionsQuery, useUpdateApiKeyMutation, useGetApiKeysQuery, unwrapApiTokenList, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useGetAgentSpendCapQuery, useGetTenantSpendCapQuery, useListAgentUserSpendCapsQuery, useUpsertAgentSpendCapMutation, useDeleteAgentSpendCapMutation, useUpsertTenantSpendCapMutation, useDeleteTenantSpendCapMutation, useUpsertUserSpendCapMutation, useDeleteUserSpendCapMutation, useGetFinancialStatsQuery, useListAgentSpendCapsQuery, useGetCreditTransactionsQuery, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, USER_PROGRESS_DATA_POINTS, useResetTemplateMutation, useSendTestTemplateEmailMutation, useUpdateTemplateMutation, useGetTemplateDetailsQuery, USER_PROGRESS_SUMMARY_TYPE, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useGetPlatformAuditLogsQuery, PLATFORM_AUDIT_EVENT_TYPES, PLATFORM_AUDIT_ACTION_CODES, useGetMentorMemoriesListQuery, useGetMentorMemoriesQuery, useGetMemoryCategoriesAdminQuery, 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, useGetMentorSkillAssignmentsQuery, useGetAgentSkillsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, filterSlashSkills, useGetMentorSkillAssignmentsInfiniteQuery, MENTOR_SKILL_ASSIGNMENTS_PAGE_SIZE, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, 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, useUpdateGlobalMemoryMutation, useUpdateMentorMemoryMutation, useGetMemsearchStatusQuery, useGetUserMemorySettingsQuery, useUpdateUserMemorySettingsMutation, useGetGlobalMemoriesQuery, useGetAllMentorMemoriesQuery, useDeleteGlobalMemoryMutation, useDeleteMentorMemoryMutation, useGetAiSearchMentorsQuery, useGetUserChatHistoryReportsQuery, USER_CHAT_HISTORY_REPORT_ACTIVE_STATES, useCreateUserChatHistoryReportMutation, useLazyGetDownloadReportFromURLQuery, useGetUserChatHistoryReportStatusQuery, userChatHistoryApiSlice, USER_CHAT_HISTORY_QUERY_KEYS, useGetUserChatHistoryQuery, useGetUserChatHistoryFilterQuery, useGetMentorsQuery, useGetUserChatHistorySessionQuery, useInviteUserMutation, usePlatformInvitationsQuery, useCreateCatalogInvitationCourseBulkMutation, useGetCatalogInvitationsCourseQuery, useLazyPlatformUsersQuery, useLazyPlatformUserGroupsQuery, useGetPersonnalizedSearchQuery, useCreateCatalogInvitationProgramBulkMutation, useGetCatalogInvitationsProgramQuery, useUpdateUserRoleMutation, useUpdateUserStatusMutation, useUpdatePlatformUserRoleWithPoliciesMutation, usePlatformUsersQuery, useGetAccessibleUsersQuery, isPoliciesResponse, platformApiSlice, featureTags, useLazyGetRbacTeamsAccessListQuery, useCreateRbacTeamsAccessMutation, useGetRbacGroupsQuery, usePlatformUserGroupsQuery, useCreateRbacGroupMutation, useUpdateRbacGroupMutation, useDeleteRbacGroupMutation, useCreatePlatformUserGroupMutation, useUpdatePlatformUserGroupMutation, useDeletePlatformUserGroupMutation, useGetRbacGroupDetailsQuery, useGetPlatformUserGroupDetailsQuery, useGetRbacPermissionsMutation, useGetRbacRolesQuery, useCreateRbacRoleMutation, useUpdateRbacRoleMutation, useDeleteRbacRoleMutation, useGetRbacRoleDetailsQuery, useGetRbacActionsDefinitionQuery, useGetRbacResourceDiscoveryQuery, useGetRbacResourceListQuery, useGetRbacPoliciesQuery, useCreateRbacPolicyMutation, useUpdateRbacPolicyMutation, useDeleteRbacPolicyMutation, useGetRbacPolicyDetailsQuery, useGetWatchedGroupsQuery, useCreateWatchedGroupMutation, useUpdateWatchedGroupMutation, useDeleteWatchedGroupMutation, useAddWatchedUserMutation, useRemoveWatchedUserMutation, useAddWatcherMutation, useUpdateWatcherMutation, useDeleteWatcherMutation, useGetWatchedUsersQuery, useGetWatchersQuery, WATCHER_NOTIFICATION_EVENTS, WATCHER_NOTIFICATION_EVENT_LABELS, useGetApplicationFormsQuery, useGetApplicationFormDetailQuery, useCreateApplicationFormMutation, useUpdateApplicationFormMutation, useGetApplicationAdminDetailQuery, useInviteApplicationCandidateMutation, useLazyGetApplicationAttachmentFileQuery, useCreateApplicationWaiverMutation, useDeleteApplicationWaiverMutation, useSubmitApplicationOverrideMutation, useUpdateApplicationPlacementMutation, useDeleteApplicationCourseAssignmentMutation, useCreateApplicationNoteMutation, useUpdateApplicationNoteMutation, useDeleteApplicationNoteMutation, useTransitionApplicationMutation, useLinkApplicationCandidateMutation, useCreateApplicationPlacementsMutation, useGetCustomMentorsQuery, useCreateApplicationCourseAssignmentsMutation, useGetApplicationBlocksQuery, useDeleteApplicationBlockMutation, useGetApplicationsPipelineStatsQuery, useGetApplicationsPipelineQuery, useGetTenantMetadataQuery, useUpdateTenantMetadataMutation, useLazyGetTenantMetadataQuery, useDeleteApiKeyMutation, useGetApiKeyQuery, useGetApiKeyFieldPermissionsQuery, useUpdateApiKeyMutation, useGetApiKeysQuery, unwrapApiTokenList, useCreateApiKeyMutation, useCreateLLMCredentialMutation, useGetCredentialsSchemaQuery, useGetMaskedLLMCredentialsQuery, useGetLlmsQuery, useDeleteIntegrationCredentialMutation, useDeleteCredentialMutation, useCreateIntegrationCredentialMutation, useGetIntegrationCredentialsSchemaQuery, useGetMaskedIntegrationCredentialsQuery, useGetAccountBillingInfoQuery, useUpdateAutoRechargeInfoMutation, useTriggerAutoRechargeMutation, useGetAgentSpendCapQuery, useGetTenantSpendCapQuery, useListAgentUserSpendCapsQuery, useUpsertAgentSpendCapMutation, useDeleteAgentSpendCapMutation, useUpsertTenantSpendCapMutation, useDeleteTenantSpendCapMutation, useUpsertUserSpendCapMutation, useDeleteUserSpendCapMutation, useGetFinancialStatsQuery, useListAgentSpendCapsQuery, useGetCreditTransactionsQuery, useCreateStripeCustomerPortalMutation, useSetPlatformConfigurationsMutation, useGetPlatformConfigurationsQuery, useUpdatePlatformMembershipMutation, useGetPlatformMembershipQuery, useGetCustomDomainsQuery, useCreateCustomDomainMutation, useDeleteCustomDomainMutation, useGetStudentMentorCreationStatusQuery, useSetStudentMentorCreationStatusMutation, coreApiSlice, recommendationPromptTypeEnum, useGetRecommendedPromptsListQuery, useCreateRecommendedPromptMutation, useUpdateRecommendedPromptMutation, useDeleteRecommendedPromptMutation, useLazyGetPublicPlatformImageAssetFileUrlQuery, useCreatePlatformImageAssetMutation, useGetProviderConfigQuery, useCreateProviderConfigMutation, useDeleteProviderConfigMutation, useGetExternalMappingQuery, useGetCredentialsListQuery, useCreateExternalMappingMutation, useDeleteExternalMappingMutation, useGetMemsearchConfigQuery, useUpdateMemsearchConfigMutation, useGetStripeConnectStatusQuery, useStartStripeConnectOnboardingMutation, useLazyGetStripeConnectDashboardQuery, useListPaywallsQuery, useListPricesQuery, useCreatePriceMutation, useUpdatePriceMutation, useDeletePriceMutation, useGetPaywallConfigQuery, useEnablePaywallMutation, useUpdatePaywallMutation, useGetNotificationsCountQuery, useLazyGetNotificationsQuery, useMarkAllAsReadMutation, useCreateNotificationPreviewMutation, useSendNotificationMutation, USER_PROGRESS_DATA_POINTS, useResetTemplateMutation, useSendTestTemplateEmailMutation, useUpdateTemplateMutation, useGetTemplateDetailsQuery, USER_PROGRESS_SUMMARY_TYPE, useGetTemplatesQuery, useLazyGetTemplateDetailsQuery, useToggleTemplateMutation, useGetTopicsStatsQuery, useGetUsersStatsQuery, useGetSessionStatsQuery, useGetTopicsDetailsStatsQuery, useGetAccessTimeHeatmapQuery, useGetUserDetailsStatsQuery, useGetTranscriptsConversationHeadlineQuery, useGetAverageRatingQuery, useGetDetailedFinancialStatsQuery, useGetTranscriptsMessagesDetailsQuery, useGetTranscriptsMessagesQuery, useGetReportDetailQuery, useGetMentorPublicSettingsQuery, useGetReportsQuery, useCreateReportMutation, useGetContentAnalyticsQuery, useGetContentAnalyticsDetailsQuery, useGetRevenueQuery, useListSubscribersQuery, useGetAuditLogsQuery, useGetPlatformAuditLogsQuery, PLATFORM_AUDIT_EVENT_TYPES, PLATFORM_AUDIT_ACTION_CODES, useGetMentorMemoriesListQuery, useGetMentorMemoriesQuery, useGetMemoryCategoriesAdminQuery, useLazyGetCourseMetaDataQuery, useLazyGetCourseCompletionOutlinesQuery, useLazyGetCourseEligibilityQuery, useLazyGetUserEnrolledCoursesQuery, useLazyGetUserAssignedCoursesQuery, useLazyGetUserCredentialsQuery, useLazyGetOverTimeActivityQuery, useLazyGetCatalogSearchQuery, useCreateOrUpdateUserReportedSkillMutation, useCreateOrUpdateUserDesiredSkillMutation, useLazyGetPathwayListQuery, useLazyGetUserAssignedPathwaysQuery, useLazyGetUserEnrolledPathwaysQuery, useLazyGetPathwayCompletionQuery, useLazyGetProgramListQuery, useLazyGetProgramCompletionQuery, useLazyGetUserEnrolledProgramsQuery, useLazyGetAssignedProgramsQuery, useLazyGetUserSkillsPointsQuery, useLazyGetUserReportedSkillsQuery, useLazyGetUserDesiredSkillsQuery, useLazyGetUserCatalogPathwaysQuery, useLazyGetPerLearnerInfoQuery, useLazyGetEdxSSOTokenQuery, useCreateCourseEnrollmentMutation, useCreateStripeCheckoutSessionMutation, useLazyGetCourseProgressQuery, useLazyGetCourseCompletionQuery, useLazyGetPersonnalizedSearchQuery, useUpdateExamAttemptMutation, useStartExamMutation, useLazyGetExamInfoQuery, useGetMentorSettingsQuery, useEditMentorMutation, useGetClawMentorConfigQuery, useGetClawInstancesQuery, useGetAgentConfigQuery, useUpdateClawMentorConfigMutation, useCreateClawMentorConfigMutation, useDeleteClawMentorConfigMutation, usePushClawConfigMutation, useCreateClawInstanceMutation, useDeleteClawInstanceMutation, useUpdateAgentConfigMutation, useHealthCheckClawInstanceMutation, useTestConnectivityClawInstanceMutation, useUpdateClawInstanceMutation, useGetAgentSkillResourcesQuery, useCreateAgentSkillResourceMutation, useUpdateAgentSkillResourceMutation, useUploadAgentSkillResourceAssetMutation, useDeleteAgentSkillResourceMutation, useGetMentorSkillAssignmentsQuery, useGetAgentSkillsQuery, useCreateMentorSkillAssignmentMutation, useUpdateMentorSkillAssignmentMutation, useDeleteMentorSkillAssignmentMutation, useCreateAgentSkillMutation, useUpdateAgentSkillMutation, useDeleteAgentSkillMutation, filterSlashSkills, useGetMentorSkillAssignmentsInfiniteQuery, MENTOR_SKILL_ASSIGNMENTS_PAGE_SIZE, useCreateCheckoutMutation, useGetUserProjectsQuery, useUpdateUserProjectMutation, useGetTrainingDocumentsQuery, useGetVectorDocumentsQuery, useCreateMentorMemoryMutation, useLazyGetConnectedServiceAuthUrlQuery, useCreateUserProjectMutation, useDeleteUserProjectMutation, useGetUserProjectDetailsQuery, useEditTrainingDocumentMutation, useAddTrainingDocumentMutation, useLazyGetCredentialsQuery, 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';
@@ -61916,7 +61916,22 @@ var clawSandboxSandboxConfig$3 = {
61916
61916
  saving: "Saving...",
61917
61917
  save: "Save",
61918
61918
  instanceUpdated: "Instance updated",
61919
- failedToUpdateInstance: "Failed to update instance"
61919
+ failedToUpdateInstance: "Failed to update instance",
61920
+ sandboxKindDescription: "Choose how this agent runs code. Only one sandbox type can be enabled at a time.",
61921
+ kindComputationalRuntime: "Computing Runtime",
61922
+ kindComputationalRuntimeShort: "Give this agent a lightweight JavaScript calculator for quick computations — the low-cost option.",
61923
+ kindComputationalRuntimeDetail: "Runs small JavaScript snippets in-process with strict memory and time limits. Great for math, dates and data wrangling at minimal cost. No shell, no Python, no network, no files that outlive the turn — choose the Virtual Machine Shell if you need those.",
61924
+ kindVirtualMachine: "Virtual Machine Shell",
61925
+ kindVirtualMachineShort: "Give this agent a full Linux virtual machine: it can write files and run real shell commands in an isolated sandbox.",
61926
+ kindVirtualMachineDetail: "Gives the agent a full Linux Virtual Machine. A private VM is created only when the agent runs a command and is destroyed when the chat ends; files it saves in /workspace carry over between turns. No network access unless you grant an egress profile. Use for data analysis, code that must actually run, or file generation (PDF, XLSX…). This adds additional costs per usage. Use Computing Runtime if you only need simple computations.",
61927
+ kindClaw: "Claw",
61928
+ kindClawShort: "Power this agent with a dedicated Claw worker — a persistent agent host with its own skills and plugins, billed by usage.",
61929
+ kindClawDetail: "Chat is handled by an OpenClaw-protocol worker instead of the built-in agent. Workers keep long-lived state, install skills and plugins, and report measured token usage that is billed against your credits in near-real-time. Requires a provisioned Claw instance for your tenant; built-in agent features (RAG tools, the VM and JS runtimes) don't apply while Claw is active.",
61930
+ kindInfoAriaLabel: "More info about {kind}",
61931
+ kindToggleAriaLabel: "{kind} {state}",
61932
+ sandboxKindUpdated: "Sandbox type updated",
61933
+ failedToUpdateSandboxKind: "Failed to update sandbox type",
61934
+ sandboxKindTitle: "Sandbox Type"
61920
61935
  };
61921
61936
  var common$3 = {
61922
61937
  close: "Close",
@@ -69039,7 +69054,22 @@ var clawSandboxSandboxConfig$2 = {
69039
69054
  saving: "Enregistrement en cours...",
69040
69055
  save: "Enregistrer",
69041
69056
  instanceUpdated: "Instance mise à jour",
69042
- failedToUpdateInstance: "Échec de la mise à jour de l'instance"
69057
+ failedToUpdateInstance: "Échec de la mise à jour de l'instance",
69058
+ sandboxKindDescription: "Choisissez comment cet agent exécute du code. Un seul type de sandbox peut être activé à la fois.",
69059
+ kindComputationalRuntime: "Environnement de calcul",
69060
+ kindComputationalRuntimeShort: "Donnez à cet agent une calculatrice JavaScript légère pour des calculs rapides — l'option la plus économique.",
69061
+ kindComputationalRuntimeDetail: "Exécute de petits extraits JavaScript dans le processus avec des limites strictes de mémoire et de temps. Idéal pour les mathématiques, les dates et la manipulation de données à coût minimal. Pas de shell, pas de Python, pas de réseau, pas de fichiers qui survivent au tour — choisissez la machine virtuelle si vous en avez besoin.",
69062
+ kindVirtualMachine: "Shell de machine virtuelle",
69063
+ kindVirtualMachineShort: "Donnez à cet agent une machine virtuelle Linux complète : il peut écrire des fichiers et exécuter de vraies commandes shell dans un sandbox isolé.",
69064
+ kindVirtualMachineDetail: "Donne à l'agent une machine virtuelle Linux complète. Une VM privée est créée uniquement lorsque l'agent exécute une commande et détruite à la fin du chat ; les fichiers enregistrés dans /workspace sont conservés entre les tours. Aucun accès réseau sauf si vous accordez un profil de sortie. À utiliser pour l'analyse de données, du code qui doit réellement s'exécuter ou la génération de fichiers (PDF, XLSX…). Cela ajoute des coûts supplémentaires à l'usage. Utilisez l'environnement de calcul si vous n'avez besoin que de calculs simples.",
69065
+ kindClaw: "Claw",
69066
+ kindClawShort: "Propulsez cet agent avec un worker Claw dédié — un hôte d'agent persistant avec ses propres skills et plugins, facturé à l'usage.",
69067
+ kindClawDetail: "Le chat est géré par un worker au protocole OpenClaw au lieu de l'agent intégré. Les workers conservent un état de longue durée, installent des skills et des plugins, et rapportent une consommation de tokens mesurée, facturée sur vos crédits quasiment en temps réel. Nécessite une instance Claw provisionnée pour votre tenant ; les fonctionnalités de l'agent intégré (outils RAG, la VM et les environnements JS) ne s'appliquent pas lorsque Claw est actif.",
69068
+ kindInfoAriaLabel: "Plus d'informations sur {kind}",
69069
+ kindToggleAriaLabel: "{kind} {state}",
69070
+ sandboxKindUpdated: "Type de sandbox mis à jour",
69071
+ failedToUpdateSandboxKind: "Échec de la mise à jour du type de sandbox",
69072
+ sandboxKindTitle: "Type de sandbox"
69043
69073
  };
69044
69074
  var common$2 = {
69045
69075
  close: "Fermer",
@@ -75996,7 +76026,22 @@ var clawSandboxSandboxConfig$1 = {
75996
76026
  saving: "Guardando...",
75997
76027
  save: "Guardar",
75998
76028
  instanceUpdated: "Instancia actualizada",
75999
- failedToUpdateInstance: "Error al actualizar la instancia"
76029
+ failedToUpdateInstance: "Error al actualizar la instancia",
76030
+ sandboxKindDescription: "Elige cómo ejecuta código este agente. Solo se puede habilitar un tipo de sandbox a la vez.",
76031
+ kindComputationalRuntime: "Entorno de cómputo",
76032
+ kindComputationalRuntimeShort: "Dale a este agente una calculadora JavaScript ligera para cálculos rápidos: la opción de menor costo.",
76033
+ kindComputationalRuntimeDetail: "Ejecuta pequeños fragmentos de JavaScript en el proceso con límites estrictos de memoria y tiempo. Ideal para matemáticas, fechas y transformación de datos a un costo mínimo. Sin shell, sin Python, sin red y sin archivos que persistan entre turnos; elige la máquina virtual si los necesitas.",
76034
+ kindVirtualMachine: "Shell de máquina virtual",
76035
+ kindVirtualMachineShort: "Dale a este agente una máquina virtual Linux completa: puede escribir archivos y ejecutar comandos de shell reales en un sandbox aislado.",
76036
+ kindVirtualMachineDetail: "Le da al agente una máquina virtual Linux completa. Se crea una VM privada solo cuando el agente ejecuta un comando y se destruye al terminar el chat; los archivos guardados en /workspace se conservan entre turnos. Sin acceso a la red a menos que concedas un perfil de egreso. Úsala para análisis de datos, código que debe ejecutarse realmente o generación de archivos (PDF, XLSX…). Esto añade costos adicionales por uso. Usa el entorno de cómputo si solo necesitas cálculos simples.",
76037
+ kindClaw: "Claw",
76038
+ kindClawShort: "Impulsa este agente con un worker Claw dedicado: un host de agente persistente con sus propias skills y plugins, facturado por uso.",
76039
+ kindClawDetail: "El chat lo gestiona un worker con protocolo OpenClaw en lugar del agente integrado. Los workers mantienen estado de larga duración, instalan skills y plugins, y reportan el uso de tokens medido, que se factura contra tus créditos casi en tiempo real. Requiere una instancia de Claw aprovisionada para tu tenant; las funciones del agente integrado (herramientas RAG, la VM y los entornos JS) no aplican mientras Claw está activo.",
76040
+ kindInfoAriaLabel: "Más información sobre {kind}",
76041
+ kindToggleAriaLabel: "{kind} {state}",
76042
+ sandboxKindUpdated: "Tipo de sandbox actualizado",
76043
+ failedToUpdateSandboxKind: "No se pudo actualizar el tipo de sandbox",
76044
+ sandboxKindTitle: "Tipo de sandbox"
76000
76045
  };
76001
76046
  var common$1 = {
76002
76047
  close: "Cerrar",
@@ -82953,7 +82998,22 @@ var clawSandboxSandboxConfig = {
82953
82998
  saving: "保存中...",
82954
82999
  save: "保存",
82955
83000
  instanceUpdated: "实例已更新",
82956
- failedToUpdateInstance: "更新实例失败"
83001
+ failedToUpdateInstance: "更新实例失败",
83002
+ sandboxKindDescription: "选择该智能体运行代码的方式。一次只能启用一种沙箱类型。",
83003
+ kindComputationalRuntime: "计算运行时",
83004
+ kindComputationalRuntimeShort: "为该智能体提供轻量级 JavaScript 计算器,用于快速计算——低成本选项。",
83005
+ kindComputationalRuntimeDetail: "在进程内运行小段 JavaScript 代码,并有严格的内存和时间限制。适合以极低成本进行数学、日期和数据处理。没有 shell、没有 Python、没有网络,文件也不会跨轮次保留——如需这些功能请选择虚拟机。",
83006
+ kindVirtualMachine: "虚拟机 Shell",
83007
+ kindVirtualMachineShort: "为该智能体提供完整的 Linux 虚拟机:它可以在隔离沙箱中写入文件并执行真实的 shell 命令。",
83008
+ kindVirtualMachineDetail: "为智能体提供完整的 Linux 虚拟机。仅当智能体执行命令时才会创建专属虚拟机,并在聊天结束时销毁;保存在 /workspace 中的文件会在轮次之间保留。除非授予出站网络配置,否则无网络访问。适用于数据分析、必须真正运行的代码或文件生成(PDF、XLSX 等)。这会按使用量产生额外费用。若只需简单计算,请使用计算运行时。",
83009
+ kindClaw: "Claw",
83010
+ kindClawShort: "使用专用 Claw worker 驱动该智能体——一个拥有自己的技能和插件的持久化智能体主机,按用量计费。",
83011
+ kindClawDetail: "聊天由 OpenClaw 协议的 worker 处理,而不是内置智能体。Worker 保留长期状态、安装技能和插件,并上报实测的 token 用量,几乎实时地从您的额度中扣费。需要为您的租户预配 Claw 实例;Claw 激活期间,内置智能体功能(RAG 工具、虚拟机和 JS 运行时)不适用。",
83012
+ kindInfoAriaLabel: "关于{kind}的更多信息",
83013
+ kindToggleAriaLabel: "{kind}{state}",
83014
+ sandboxKindUpdated: "沙箱类型已更新",
83015
+ failedToUpdateSandboxKind: "更新沙箱类型失败",
83016
+ sandboxKindTitle: "沙箱类型"
82957
83017
  };
82958
83018
  var common = {
82959
83019
  close: "关闭",
@@ -235177,10 +235237,14 @@ function readErrorMessage(err, fallback) {
235177
235237
  return fallback;
235178
235238
  }
235179
235239
  const PAGE_SIZE$1 = 5;
235240
+ function SandboxKindRow({ label, description, detailTooltip, infoAriaLabel, checked, disabled, onToggle, switchAriaLabel, testId, }) {
235241
+ return (jsxs("div", { className: "flex items-center justify-between gap-4", children: [jsxs("div", { className: "min-w-0", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: label }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": infoAriaLabel, children: jsx(Info$3, { className: "h-4 w-4 shrink-0 text-gray-400" }) }), jsx(TooltipContent, { className: "ibl-tooltip-content max-w-[320px]", children: jsx("p", { children: detailTooltip }) })] }) })] }), jsx("p", { className: "text-xs text-gray-500", children: description })] }), jsx(Switch, { checked: checked, disabled: disabled, onCheckedChange: onToggle, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": switchAriaLabel, "data-testid": testId })] }));
235242
+ }
235180
235243
  function parseModelIdentifier(model) {
235181
235244
  if (!model) {
235182
235245
  return { provider: '', llmName: '' };
235183
235246
  }
235247
+ /* istanbul ignore next -- @preserve String.split never yields undefined entries */
235184
235248
  const [provider = '', ...llmParts] = model.split('/');
235185
235249
  return {
235186
235250
  provider,
@@ -235192,6 +235256,7 @@ function getResolvedUsername(username) {
235192
235256
  if (username === null || username === void 0 ? void 0 : username.trim()) {
235193
235257
  return username.trim();
235194
235258
  }
235259
+ /* istanbul ignore if -- @preserve SSR guard; jsdom always has window */
235195
235260
  if (typeof window === 'undefined') {
235196
235261
  return '';
235197
235262
  }
@@ -235206,19 +235271,35 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235206
235271
  var _a, _b, _c, _d, _e, _f, _g;
235207
235272
  const t = useT();
235208
235273
  const resolvedUsername = getResolvedUsername(username);
235274
+ // Sandbox kind flags come from mentor settings; the same update endpoint
235275
+ // persists all three (claw / virtual machine / computational runtime).
235276
+ const { data: mentorSettingsData, isLoading: isLoadingMentorSettings } = useGetMentorSettingsQuery({ mentor: mentorUniqueId, org: platformKey }, { skip: !platformKey || !mentorUniqueId });
235277
+ const [editMentor, { isLoading: isSavingSandboxKind }] = useEditMentorMutation();
235278
+ const sandboxSettings = mentorSettingsData;
235279
+ // Optimistic overrides so switches flip immediately; reverted on failure.
235280
+ const [flagOverrides, setFlagOverrides] = useState({});
235281
+ const sandboxFlags = {
235282
+ enable_computational_runtime: Boolean(sandboxSettings === null || sandboxSettings === void 0 ? void 0 : sandboxSettings.enable_computational_runtime),
235283
+ enable_virtual_machine: Boolean(sandboxSettings === null || sandboxSettings === void 0 ? void 0 : sandboxSettings.enable_virtual_machine),
235284
+ enable_claw: Boolean(sandboxSettings === null || sandboxSettings === void 0 ? void 0 : sandboxSettings.enable_claw),
235285
+ ...flagOverrides,
235286
+ };
235287
+ const clawEnabled = sandboxFlags.enable_claw;
235209
235288
  const { data: mentorConfigData, isLoading: isLoadingConfigs, isError: isMentorConfigError, } = useGetClawMentorConfigQuery({
235210
235289
  org: platformKey,
235211
235290
  mentorUniqueId,
235212
- });
235291
+ },
235292
+ // The claw config/instances only matter while Claw is the selected kind.
235293
+ { skip: !clawEnabled });
235213
235294
  // GET /claw-config/ 404s when no config exists — that's the "not connected"
235214
235295
  // state, not an error. The create/delete mutations write the cache directly
235215
235296
  // (see api-slice onQueryStarted), so we don't need to refetch after either.
235216
235297
  const mentorConfig = isMentorConfigError ? null : (mentorConfigData !== null && mentorConfigData !== void 0 ? mentorConfigData : null);
235217
- const { data: instances, isLoading: isLoadingInstances, refetch: refetchInstances, } = useGetClawInstancesQuery({ org: platformKey });
235298
+ const { data: instances, isLoading: isLoadingInstances, refetch: refetchInstances, } = useGetClawInstancesQuery({ org: platformKey }, { skip: !clawEnabled });
235218
235299
  const { data: agentConfig } = useGetAgentConfigQuery({
235219
235300
  org: platformKey,
235220
235301
  mentorUniqueId,
235221
- });
235302
+ }, { skip: !clawEnabled });
235222
235303
  const { data: llmProviders, isLoading: isLoadingLLMProviders, isError: isLLMProvidersError, } = useGetLlmsQuery({
235223
235304
  org: platformKey,
235224
235305
  userId: resolvedUsername,
@@ -235250,7 +235331,7 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235250
235331
  claw_type: 'openclaw',
235251
235332
  gateway_token: '',
235252
235333
  });
235253
- const isLoading = isLoadingConfigs || isLoadingInstances;
235334
+ const isLoading = isLoadingMentorSettings || isLoadingConfigs || isLoadingInstances;
235254
235335
  const allInstances = instances !== null && instances !== void 0 ? instances : [];
235255
235336
  const availableLLMProviders = useMemo(() => (llmProviders !== null && llmProviders !== void 0 ? llmProviders : []), [llmProviders]);
235256
235337
  const filteredLLMProviders = useMemo(() => availableLLMProviders.filter((provider) => provider.name.toLowerCase().includes(llmSearchQuery.toLowerCase())), [availableLLMProviders, llmSearchQuery]);
@@ -235282,6 +235363,36 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235282
235363
  return (jsx("div", { className: "flex items-center justify-center py-10", children: jsx(LoaderCircle, { className: "h-5 w-5 animate-spin text-blue-500" }) }));
235283
235364
  }
235284
235365
  // ── Handlers ─────────────────────────────────────────────────────────────
235366
+ /** Persist a sandbox-kind change through the mentor-settings endpoint.
235367
+ * The switches flip optimistically and revert if the save fails. */
235368
+ const handleSandboxKindChange = async (patch) => {
235369
+ const previousOverrides = flagOverrides;
235370
+ setFlagOverrides((current) => ({ ...current, ...patch }));
235371
+ try {
235372
+ await editMentor({
235373
+ mentor: mentorUniqueId,
235374
+ org: platformKey,
235375
+ userId: resolvedUsername,
235376
+ // @ts-expect-error the installed MentorSettingsRequest type predates the sandbox flags
235377
+ formData: patch,
235378
+ }).unwrap();
235379
+ toast.success(t('clawSandboxSandboxConfig.sandboxKindUpdated'));
235380
+ }
235381
+ catch (_a) {
235382
+ setFlagOverrides(previousOverrides);
235383
+ toast.error(t('clawSandboxSandboxConfig.failedToUpdateSandboxKind'));
235384
+ }
235385
+ };
235386
+ /** The kinds are mutually exclusive — enabling one turns the other two off
235387
+ * in the same PATCH; toggling the active kind off leaves none enabled. */
235388
+ const handleSelectKind = (flag, value) => handleSandboxKindChange(value
235389
+ ? {
235390
+ enable_claw: false,
235391
+ enable_virtual_machine: false,
235392
+ enable_computational_runtime: false,
235393
+ [flag]: true,
235394
+ }
235395
+ : { [flag]: false });
235285
235396
  const handleConnect = async (instanceId) => {
235286
235397
  setConnectingInstanceId(instanceId);
235287
235398
  try {
@@ -235301,6 +235412,7 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235301
235412
  }
235302
235413
  };
235303
235414
  const handleDisconnect = async () => {
235415
+ /* istanbul ignore if -- @preserve defensive; Disconnect only renders in the connected view */
235304
235416
  if (!mentorConfig)
235305
235417
  return;
235306
235418
  // Close the modal up front — the cache is also optimistically cleared in
@@ -235343,6 +235455,7 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235343
235455
  }
235344
235456
  };
235345
235457
  const handleDeleteInstance = async () => {
235458
+ /* istanbul ignore if -- @preserve defensive; the confirm dialog only opens with an id set */
235346
235459
  if (!deletingInstanceId)
235347
235460
  return;
235348
235461
  try {
@@ -235356,6 +235469,7 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235356
235469
  }
235357
235470
  };
235358
235471
  const handleToggle = async (field, value) => {
235472
+ /* istanbul ignore if -- @preserve defensive; the switch only renders in the connected view */
235359
235473
  if (!mentorConfig)
235360
235474
  return;
235361
235475
  try {
@@ -235368,8 +235482,10 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235368
235482
  };
235369
235483
  const handlePush = async () => {
235370
235484
  var _a, _b;
235485
+ /* istanbul ignore if -- @preserve defensive; Push only renders in the connected view */
235371
235486
  if (!mentorConfig)
235372
235487
  return;
235488
+ /* istanbul ignore if -- @preserve defensive; the Push button is disabled in this state */
235373
235489
  if (!hasAgentConfiguration) {
235374
235490
  toast.error(t('clawSandboxSandboxConfig.setAgentConfigBeforePushing'));
235375
235491
  return;
@@ -235388,6 +235504,7 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235388
235504
  }
235389
235505
  };
235390
235506
  const handleCreateInstance = async () => {
235507
+ /* istanbul ignore if -- @preserve defensive; the Create button is disabled in this state */
235391
235508
  if (!newInstance.name || !newInstance.server_url || !newInstance.gateway_token) {
235392
235509
  toast.error(t('clawSandboxSandboxConfig.nameUrlTokenRequired'));
235393
235510
  return;
@@ -235432,47 +235549,68 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235432
235549
  toast.error(t('clawSandboxSandboxConfig.failedToUpdateModel'));
235433
235550
  }
235434
235551
  };
235552
+ // ── Sandbox kind selection ───────────────────────────────────────────────
235553
+ const sandboxKindsSection = (jsxs("div", { className: "rounded-lg border p-6", children: [jsxs("div", { className: "mb-4", children: [jsx("h4", { className: "text-sm font-medium text-gray-900", children: t('clawSandboxSandboxConfig.sandboxKindTitle') }), jsx("p", { className: "mt-1 text-xs text-gray-500", children: t('clawSandboxSandboxConfig.sandboxKindDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsx(SandboxKindRow, { label: t('clawSandboxSandboxConfig.kindComputationalRuntime'), description: t('clawSandboxSandboxConfig.kindComputationalRuntimeShort'), detailTooltip: t('clawSandboxSandboxConfig.kindComputationalRuntimeDetail'), infoAriaLabel: t('clawSandboxSandboxConfig.kindInfoAriaLabel', {
235554
+ kind: t('clawSandboxSandboxConfig.kindComputationalRuntime'),
235555
+ }), checked: sandboxFlags.enable_computational_runtime, disabled: isSavingSandboxKind, onToggle: (value) => handleSelectKind('enable_computational_runtime', value), switchAriaLabel: t('clawSandboxSandboxConfig.kindToggleAriaLabel', {
235556
+ kind: t('clawSandboxSandboxConfig.kindComputationalRuntime'),
235557
+ state: sandboxFlags.enable_computational_runtime
235558
+ ? t('clawSandboxSandboxConfig.enabled')
235559
+ : t('clawSandboxSandboxConfig.disabled'),
235560
+ }), testId: "sandbox-kind-computational-runtime" }), jsx(SandboxKindRow, { label: t('clawSandboxSandboxConfig.kindVirtualMachine'), description: t('clawSandboxSandboxConfig.kindVirtualMachineShort'), detailTooltip: t('clawSandboxSandboxConfig.kindVirtualMachineDetail'), infoAriaLabel: t('clawSandboxSandboxConfig.kindInfoAriaLabel', {
235561
+ kind: t('clawSandboxSandboxConfig.kindVirtualMachine'),
235562
+ }), checked: sandboxFlags.enable_virtual_machine, disabled: isSavingSandboxKind, onToggle: (value) => handleSelectKind('enable_virtual_machine', value), switchAriaLabel: t('clawSandboxSandboxConfig.kindToggleAriaLabel', {
235563
+ kind: t('clawSandboxSandboxConfig.kindVirtualMachine'),
235564
+ state: sandboxFlags.enable_virtual_machine
235565
+ ? t('clawSandboxSandboxConfig.enabled')
235566
+ : t('clawSandboxSandboxConfig.disabled'),
235567
+ }), testId: "sandbox-kind-virtual-machine" }), jsx(SandboxKindRow, { label: t('clawSandboxSandboxConfig.kindClaw'), description: t('clawSandboxSandboxConfig.kindClawShort'), detailTooltip: t('clawSandboxSandboxConfig.kindClawDetail'), infoAriaLabel: t('clawSandboxSandboxConfig.kindInfoAriaLabel', {
235568
+ kind: t('clawSandboxSandboxConfig.kindClaw'),
235569
+ }), checked: clawEnabled, disabled: isSavingSandboxKind, onToggle: (value) => handleSelectKind('enable_claw', value), switchAriaLabel: t('clawSandboxSandboxConfig.kindToggleAriaLabel', {
235570
+ kind: t('clawSandboxSandboxConfig.kindClaw'),
235571
+ state: clawEnabled
235572
+ ? t('clawSandboxSandboxConfig.enabled')
235573
+ : t('clawSandboxSandboxConfig.disabled'),
235574
+ }), testId: "sandbox-kind-claw" })] })] }));
235435
235575
  // ── Not connected: show instance table ───────────────────────────────────
235436
- if (!mentorConfig) {
235437
- return (jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center", children: [jsxs("div", { className: "relative w-full sm:w-64", children: [jsx(Search, { className: "absolute top-2.5 left-2.5 h-4 w-4 text-gray-500" }), jsx(Input, { id: "instance-search", name: "instance-search", type: "search", placeholder: t('clawSandboxSandboxConfig.searchInstancesPlaceholder'), className: "pl-8", value: instanceSearchQuery, onChange: (e) => {
235438
- setInstanceSearchQuery(e.target.value);
235439
- setCurrentPage(1);
235440
- } })] }), jsxs(Button$1, { onClick: () => setShowNewInstanceForm(true), 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('clawSandboxSandboxConfig.addInstance')] })] }), jsx("div", { className: "overflow-hidden rounded-md border", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colName') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colUrl') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colType') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colStatus') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colHealth') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colVersion') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colLastCheck') }), jsx(TableHead, { className: "p-3 text-right text-sm whitespace-nowrap text-[#646464]" })] }) }), jsx(TableBody, { children: pagedInstances.length === 0 ? (jsx(TableRow, { children: jsx(TableCell, { colSpan: 8, className: "p-6 text-center text-sm text-gray-500", children: instanceSearchQuery
235441
- ? t('clawSandboxSandboxConfig.noInstancesMatchSearch')
235442
- : t('clawSandboxSandboxConfig.noInstancesAvailable') }) })) : (pagedInstances.map((inst) => {
235443
- var _a;
235444
- return (jsxs(TableRow, { className: "border-b last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: inst.name }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464] truncate max-w-[250px]", children: jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { className: "text-blue-600 hover:text-blue-800 cursor-default", children: inst.server_url }) }), jsx(TooltipContent, { className: "bg-gray-700 px-3 py-2 text-sm font-medium text-white shadow-sm", children: jsx("p", { children: inst.server_url }) })] }) }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: inst.claw_type }), jsx(TableCell, { className: "p-3 whitespace-nowrap", children: jsx(StatusDot, { value: inst.status, kind: "status" }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap", children: jsx(StatusDot, { value: inst.last_health_status, kind: "health" }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: (_a = inst.claw_version) !== null && _a !== void 0 ? _a : '—' }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: timeAgo(inst.last_health_check, t('clawSandboxSandboxConfig.never')) }), jsx(TableCell, { className: "p-3 text-right", children: (() => {
235445
- const unhealthy = isInstanceUnhealthy(inst.status);
235446
- const isThisConnecting = connectingInstanceId === inst.id;
235447
- const connectDisabled = unhealthy || isCreating || connectingInstanceId !== null;
235448
- // Surfaced as a first-class button (not tucked in the
235449
- // three-dot menu) so connecting is one click. A
235450
- // disabled button swallows pointer events, so wrap it
235451
- // in a span when we need the unhealthy tooltip to show.
235452
- const connectButton = (jsxs(Button$1, { variant: "outline", size: "sm", className: "cursor-pointer", disabled: connectDisabled, onClick: () => handleConnect(inst.id), "aria-label": isThisConnecting
235453
- ? t('clawSandboxSandboxConfig.connectingInstance')
235454
- : t('clawSandboxSandboxConfig.connect'), "data-testid": `connect-instance-${inst.id}`, children: [isThisConnecting ? (jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" })) : (jsx(Link2, { className: "mr-2 h-4 w-4" })), isThisConnecting
235455
- ? t('clawSandboxSandboxConfig.connecting')
235456
- : t('clawSandboxSandboxConfig.connect')] }));
235457
- return (jsxs("div", { className: "flex items-center justify-end gap-2", children: [unhealthy ? (jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { tabIndex: 0, children: connectButton }) }), jsx(TooltipContent, { side: "left", collisionPadding: 12, className: "max-w-[260px] rounded-lg bg-gray-700 px-3 py-2 text-xs leading-snug font-medium break-words whitespace-normal text-white shadow-sm", children: t('clawSandboxSandboxConfig.instanceUnhealthyTooltip') })] }) })) : (connectButton), jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxSandboxConfig.actions'), children: [jsx(Ellipsis, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('clawSandboxSandboxConfig.actions') })] }) }), jsxs(DropdownMenuContent, { align: "end", children: [jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => runInstanceChecks(inst.id), disabled: checkingInstanceId !== null, children: [checkingInstanceId === inst.id ? (jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" })) : (jsx(Activity, { className: "mr-2 h-4 w-4" })), t('clawSandboxSandboxConfig.runChecks')] }), jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => setEditingInstance(inst), children: [jsx(Pen, { className: "mr-2 h-4 w-4" }), t('clawSandboxSandboxConfig.edit')] }), jsxs(DropdownMenuItem, { variant: "destructive", className: "cursor-pointer", onClick: () => setDeletingInstanceId(inst.id), children: [jsx(Trash2, { className: "mr-2 h-4 w-4" }), t('clawSandboxSandboxConfig.delete')] })] })] })] }));
235458
- })() })] }, inst.id));
235459
- })) })] }) }) }) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: setCurrentPage, disabled: false }), jsx(OverlayModal, { open: showNewInstanceForm, onClose: () => setShowNewInstanceForm(false), title: t('clawSandboxSandboxConfig.newInstanceTitle'), className: "max-w-lg", children: jsxs("div", { className: "grid gap-4", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-name", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldName') }), jsx(Input, { id: "new-instance-name", name: "new-instance-name", value: newInstance.name, onChange: (e) => setNewInstance({ ...newInstance, name: e.target.value }), placeholder: t('clawSandboxSandboxConfig.namePlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-type", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldType') }), jsxs(Select$1, { value: newInstance.claw_type, onValueChange: (value) => setNewInstance({ ...newInstance, claw_type: value }), children: [jsx(SelectTrigger, { id: "new-instance-type", className: "py-6", children: jsx(SelectValue, {}) }), jsxs(SelectContent, { children: [jsx(SelectItem, { value: "openclaw", children: "OpenClaw" }), jsx(SelectItem, { value: "ironclaw", children: "IronClaw" })] })] })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-url", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldServerUrl') }), jsx(Input, { id: "new-instance-url", name: "new-instance-url", value: newInstance.server_url, onChange: (e) => setNewInstance({ ...newInstance, server_url: e.target.value }), placeholder: t('clawSandboxSandboxConfig.serverUrlPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-token", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldGatewayToken') }), jsx(Input, { id: "new-instance-token", name: "new-instance-token", value: newInstance.gateway_token, onChange: (e) => setNewInstance({ ...newInstance, gateway_token: e.target.value }), placeholder: t('clawSandboxSandboxConfig.gatewayTokenPlaceholder'), type: "password", className: "py-6", required: true })] }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setShowNewInstanceForm(false), children: t('clawSandboxSandboxConfig.cancel') }), jsx(Button$1, { onClick: handleCreateInstance, disabled: isCreatingInstance ||
235460
- !newInstance.name ||
235461
- !newInstance.server_url ||
235462
- !newInstance.gateway_token, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isCreatingInstance
235463
- ? t('clawSandboxSandboxConfig.creating')
235464
- : t('clawSandboxSandboxConfig.create') })] })] }) }), editingInstance && (jsx(EditInstanceDialog, { instance: editingInstance, org: platformKey, onClose: () => {
235465
- setEditingInstance(null);
235466
- refetchInstances();
235467
- }, onSaved: (id) => {
235468
- // Re-verify the instance after edit; URL or token may have changed.
235469
- void runInstanceChecks(id, true);
235470
- } })), jsxs(OverlayModal, { open: !!deletingInstanceId, onClose: () => setDeletingInstanceId(null), title: t('clawSandboxSandboxConfig.deleteInstanceTitle'), className: "max-w-md", children: [jsx("p", { className: "text-sm text-gray-600", children: t('clawSandboxSandboxConfig.deleteInstanceConfirm') }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setDeletingInstanceId(null), children: t('clawSandboxSandboxConfig.cancel') }), jsx(Button$1, { onClick: handleDeleteInstance, disabled: isDeletingInstance, className: "bg-red-600 text-white hover:bg-red-700", children: isDeletingInstance
235471
- ? t('clawSandboxSandboxConfig.deleting')
235472
- : t('clawSandboxSandboxConfig.delete') })] })] })] }));
235473
- }
235576
+ const notConnectedSection = (jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center", children: [jsxs("div", { className: "relative w-full sm:w-64", children: [jsx(Search, { className: "absolute top-2.5 left-2.5 h-4 w-4 text-gray-500" }), jsx(Input, { id: "instance-search", name: "instance-search", type: "search", placeholder: t('clawSandboxSandboxConfig.searchInstancesPlaceholder'), className: "pl-8", value: instanceSearchQuery, onChange: (e) => {
235577
+ setInstanceSearchQuery(e.target.value);
235578
+ setCurrentPage(1);
235579
+ } })] }), jsxs(Button$1, { onClick: () => setShowNewInstanceForm(true), 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('clawSandboxSandboxConfig.addInstance')] })] }), jsx("div", { className: "overflow-hidden rounded-md border", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colName') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colUrl') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colType') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colStatus') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colHealth') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colVersion') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('clawSandboxSandboxConfig.colLastCheck') }), jsx(TableHead, { className: "p-3 text-right text-sm whitespace-nowrap text-[#646464]" })] }) }), jsx(TableBody, { children: pagedInstances.length === 0 ? (jsx(TableRow, { children: jsx(TableCell, { colSpan: 8, className: "p-6 text-center text-sm text-gray-500", children: instanceSearchQuery
235580
+ ? t('clawSandboxSandboxConfig.noInstancesMatchSearch')
235581
+ : t('clawSandboxSandboxConfig.noInstancesAvailable') }) })) : (pagedInstances.map((inst) => {
235582
+ var _a;
235583
+ return (jsxs(TableRow, { className: "border-b last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: inst.name }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464] truncate max-w-[250px]", children: jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { className: "text-blue-600 hover:text-blue-800 cursor-default", children: inst.server_url }) }), jsx(TooltipContent, { className: "bg-gray-700 px-3 py-2 text-sm font-medium text-white shadow-sm", children: jsx("p", { children: inst.server_url }) })] }) }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: inst.claw_type }), jsx(TableCell, { className: "p-3 whitespace-nowrap", children: jsx(StatusDot, { value: inst.status, kind: "status" }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap", children: jsx(StatusDot, { value: inst.last_health_status, kind: "health" }) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: (_a = inst.claw_version) !== null && _a !== void 0 ? _a : '—' }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: timeAgo(inst.last_health_check, t('clawSandboxSandboxConfig.never')) }), jsx(TableCell, { className: "p-3 text-right", children: (() => {
235584
+ const unhealthy = isInstanceUnhealthy(inst.status);
235585
+ const isThisConnecting = connectingInstanceId === inst.id;
235586
+ const connectDisabled = unhealthy || isCreating || connectingInstanceId !== null;
235587
+ // Surfaced as a first-class button (not tucked in the
235588
+ // three-dot menu) so connecting is one click. A
235589
+ // disabled button swallows pointer events, so wrap it
235590
+ // in a span when we need the unhealthy tooltip to show.
235591
+ const connectButton = (jsxs(Button$1, { variant: "outline", size: "sm", className: "cursor-pointer", disabled: connectDisabled, onClick: () => handleConnect(inst.id), "aria-label": isThisConnecting
235592
+ ? t('clawSandboxSandboxConfig.connectingInstance')
235593
+ : t('clawSandboxSandboxConfig.connect'), "data-testid": `connect-instance-${inst.id}`, children: [isThisConnecting ? (jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" })) : (jsx(Link2, { className: "mr-2 h-4 w-4" })), isThisConnecting
235594
+ ? t('clawSandboxSandboxConfig.connecting')
235595
+ : t('clawSandboxSandboxConfig.connect')] }));
235596
+ return (jsxs("div", { className: "flex items-center justify-end gap-2", children: [unhealthy ? (jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { tabIndex: 0, children: connectButton }) }), jsx(TooltipContent, { side: "left", collisionPadding: 12, className: "max-w-[260px] rounded-lg bg-gray-700 px-3 py-2 text-xs leading-snug font-medium break-words whitespace-normal text-white shadow-sm", children: t('clawSandboxSandboxConfig.instanceUnhealthyTooltip') })] }) })) : (connectButton), jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, children: jsxs(Button$1, { variant: "ghost", size: "sm", "aria-label": t('clawSandboxSandboxConfig.actions'), children: [jsx(Ellipsis, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('clawSandboxSandboxConfig.actions') })] }) }), jsxs(DropdownMenuContent, { align: "end", children: [jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => runInstanceChecks(inst.id), disabled: checkingInstanceId !== null, children: [checkingInstanceId === inst.id ? (jsx(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" })) : (jsx(Activity, { className: "mr-2 h-4 w-4" })), t('clawSandboxSandboxConfig.runChecks')] }), jsxs(DropdownMenuItem, { className: "cursor-pointer", onClick: () => setEditingInstance(inst), children: [jsx(Pen, { className: "mr-2 h-4 w-4" }), t('clawSandboxSandboxConfig.edit')] }), jsxs(DropdownMenuItem, { variant: "destructive", className: "cursor-pointer", onClick: () => setDeletingInstanceId(inst.id), children: [jsx(Trash2, { className: "mr-2 h-4 w-4" }), t('clawSandboxSandboxConfig.delete')] })] })] })] }));
235597
+ })() })] }, inst.id));
235598
+ })) })] }) }) }) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: setCurrentPage, disabled: false }), jsx(OverlayModal, { open: showNewInstanceForm, onClose: () => setShowNewInstanceForm(false), title: t('clawSandboxSandboxConfig.newInstanceTitle'), className: "max-w-lg", children: jsxs("div", { className: "grid gap-4", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-name", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldName') }), jsx(Input, { id: "new-instance-name", name: "new-instance-name", value: newInstance.name, onChange: (e) => setNewInstance({ ...newInstance, name: e.target.value }), placeholder: t('clawSandboxSandboxConfig.namePlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-type", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldType') }), jsxs(Select$1, { value: newInstance.claw_type, onValueChange: (value) => setNewInstance({ ...newInstance, claw_type: value }), children: [jsx(SelectTrigger, { id: "new-instance-type", className: "py-6", children: jsx(SelectValue, {}) }), jsxs(SelectContent, { children: [jsx(SelectItem, { value: "openclaw", children: "OpenClaw" }), jsx(SelectItem, { value: "ironclaw", children: "IronClaw" })] })] })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-url", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldServerUrl') }), jsx(Input, { id: "new-instance-url", name: "new-instance-url", value: newInstance.server_url, onChange: (e) => setNewInstance({ ...newInstance, server_url: e.target.value }), placeholder: t('clawSandboxSandboxConfig.serverUrlPlaceholder'), className: "py-6" })] }), jsxs("div", { className: "space-y-2", children: [jsx(Label$2, { htmlFor: "new-instance-token", className: "text-sm font-medium text-[#646464]", children: t('clawSandboxSandboxConfig.fieldGatewayToken') }), jsx(Input, { id: "new-instance-token", name: "new-instance-token", value: newInstance.gateway_token, onChange: (e) => setNewInstance({ ...newInstance, gateway_token: e.target.value }), placeholder: t('clawSandboxSandboxConfig.gatewayTokenPlaceholder'), type: "password", className: "py-6", required: true })] }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setShowNewInstanceForm(false), children: t('clawSandboxSandboxConfig.cancel') }), jsx(Button$1, { onClick: handleCreateInstance, disabled: isCreatingInstance ||
235599
+ !newInstance.name ||
235600
+ !newInstance.server_url ||
235601
+ !newInstance.gateway_token, className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isCreatingInstance
235602
+ ? t('clawSandboxSandboxConfig.creating')
235603
+ : t('clawSandboxSandboxConfig.create') })] })] }) }), editingInstance && (jsx(EditInstanceDialog, { instance: editingInstance, org: platformKey, onClose: () => {
235604
+ setEditingInstance(null);
235605
+ refetchInstances();
235606
+ }, onSaved: (id) => {
235607
+ // Re-verify the instance after edit; URL or token may have changed.
235608
+ void runInstanceChecks(id, true);
235609
+ } })), jsxs(OverlayModal, { open: !!deletingInstanceId, onClose: () => setDeletingInstanceId(null), title: t('clawSandboxSandboxConfig.deleteInstanceTitle'), className: "max-w-md", children: [jsx("p", { className: "text-sm text-gray-600", children: t('clawSandboxSandboxConfig.deleteInstanceConfirm') }), jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [jsx(Button$1, { variant: "outline", onClick: () => setDeletingInstanceId(null), children: t('clawSandboxSandboxConfig.cancel') }), jsx(Button$1, { onClick: handleDeleteInstance, disabled: isDeletingInstance, className: "bg-red-600 text-white hover:bg-red-700", children: isDeletingInstance
235610
+ ? t('clawSandboxSandboxConfig.deleting')
235611
+ : t('clawSandboxSandboxConfig.delete') })] })] })] }));
235474
235612
  // ── Connected: show config controls ──────────────────────────────────────
235475
- return (jsxs("div", { className: "space-y-6", children: [jsxs("div", { className: "rounded-lg border p-6", children: [jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mb-4", children: [jsx("h4", { className: "text-sm font-medium text-gray-900", children: t('clawSandboxSandboxConfig.connectedInstance') }), jsxs("div", { className: "flex items-center gap-2", children: [jsxs(Button$1, { variant: "outline", size: "sm", onClick: () => (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) !== undefined && runInstanceChecks(connectedInstance.id), disabled: checkingInstanceId !== null || (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) === undefined, children: [checkingInstanceId === (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) ? (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin mr-1" })) : (jsx(Activity, { className: "h-4 w-4 mr-1" })), t('clawSandboxSandboxConfig.runChecks')] }), jsxs(Button$1, { variant: "ghost", size: "sm", onClick: () => setShowDisconnectConfirm(true), disabled: isDeleting, className: "text-red-500 hover:text-red-700 hover:bg-red-50", children: [isDeleting ? (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin mr-1" })) : (jsx(Trash2, { className: "h-4 w-4 mr-1" })), t('clawSandboxSandboxConfig.disconnect')] })] })] }), jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: [jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.fieldName') }), jsx("p", { className: "text-sm text-gray-700 font-medium", children: (_a = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.name) !== null && _a !== void 0 ? _a : mentorConfig.server_name })] }), jsxs("div", { className: "sm:col-span-2 lg:col-span-2", children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.fieldServerUrl') }), jsx("p", { className: "text-sm text-blue-600 break-all", children: (_b = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.server_url) !== null && _b !== void 0 ? _b : '—' })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colStatus') }), jsx(StatusDot, { value: (_c = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.status) !== null && _c !== void 0 ? _c : mentorConfig.server_status, kind: "status" })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colHealth') }), jsx(StatusDot, { value: (_d = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.last_health_status) !== null && _d !== void 0 ? _d : mentorConfig.server_last_health_status, kind: "health" })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colLastCheck') }), jsx("p", { className: "text-sm text-gray-700", children: timeAgo((_e = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.last_health_check) !== null && _e !== void 0 ? _e : mentorConfig.server_last_health_check, t('clawSandboxSandboxConfig.never')) })] })] })] }), jsxs("div", { className: "flex items-center justify-between rounded-lg border p-6", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: t('clawSandboxSandboxConfig.autoPushOnSave') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('clawSandboxSandboxConfig.autoPushInfoAriaLabel'), children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "ibl-tooltip-content", children: jsx("p", { children: t('clawSandboxSandboxConfig.autoPushTooltip') }) })] }) })] }), jsx(Switch, { checked: mentorConfig.auto_push, onCheckedChange: (v) => handleToggle('auto_push', v), disabled: isUpdating, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": t('clawSandboxSandboxConfig.autoPushAriaLabel', {
235613
+ const connectedSection = mentorConfig ? (jsxs("div", { className: "space-y-6", children: [jsxs("div", { className: "rounded-lg border p-6", children: [jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mb-4", children: [jsx("h4", { className: "text-sm font-medium text-gray-900", children: t('clawSandboxSandboxConfig.connectedInstance') }), jsxs("div", { className: "flex items-center gap-2", children: [jsxs(Button$1, { variant: "outline", size: "sm", onClick: () => (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) !== undefined && runInstanceChecks(connectedInstance.id), disabled: checkingInstanceId !== null || (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) === undefined, children: [checkingInstanceId === (connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.id) ? (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin mr-1" })) : (jsx(Activity, { className: "h-4 w-4 mr-1" })), t('clawSandboxSandboxConfig.runChecks')] }), jsxs(Button$1, { variant: "ghost", size: "sm", onClick: () => setShowDisconnectConfirm(true), disabled: isDeleting, className: "text-red-500 hover:text-red-700 hover:bg-red-50", children: [isDeleting ? (jsx(LoaderCircle, { className: "h-4 w-4 animate-spin mr-1" })) : (jsx(Trash2, { className: "h-4 w-4 mr-1" })), t('clawSandboxSandboxConfig.disconnect')] })] })] }), jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: [jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.fieldName') }), jsx("p", { className: "text-sm text-gray-700 font-medium", children: (_a = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.name) !== null && _a !== void 0 ? _a : mentorConfig.server_name })] }), jsxs("div", { className: "sm:col-span-2 lg:col-span-2", children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.fieldServerUrl') }), jsx("p", { className: "text-sm text-blue-600 break-all", children: (_b = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.server_url) !== null && _b !== void 0 ? _b : '—' })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colStatus') }), jsx(StatusDot, { value: (_c = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.status) !== null && _c !== void 0 ? _c : mentorConfig.server_status, kind: "status" })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colHealth') }), jsx(StatusDot, { value: (_d = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.last_health_status) !== null && _d !== void 0 ? _d : mentorConfig.server_last_health_status, kind: "health" })] }), jsxs("div", { children: [jsx("p", { className: "text-xs text-gray-400 mb-1", children: t('clawSandboxSandboxConfig.colLastCheck') }), jsx("p", { className: "text-sm text-gray-700", children: timeAgo((_e = connectedInstance === null || connectedInstance === void 0 ? void 0 : connectedInstance.last_health_check) !== null && _e !== void 0 ? _e : mentorConfig.server_last_health_check, t('clawSandboxSandboxConfig.never')) })] })] })] }), jsxs("div", { className: "flex items-center justify-between rounded-lg border p-6", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-700", children: t('clawSandboxSandboxConfig.autoPushOnSave') }), jsx(TooltipProvider, { children: jsxs(Tooltip$1, { children: [jsx(TooltipTrigger, { "aria-label": t('clawSandboxSandboxConfig.autoPushInfoAriaLabel'), children: jsx(Info$3, { className: "h-4 w-4 text-gray-400" }) }), jsx(TooltipContent, { className: "ibl-tooltip-content", children: jsx("p", { children: t('clawSandboxSandboxConfig.autoPushTooltip') }) })] }) })] }), jsx(Switch, { checked: mentorConfig.auto_push, onCheckedChange: (v) => handleToggle('auto_push', v), disabled: isUpdating, className: "cursor-pointer data-[state=checked]:bg-blue-500", "aria-label": t('clawSandboxSandboxConfig.autoPushAriaLabel', {
235476
235614
  state: mentorConfig.auto_push
235477
235615
  ? t('clawSandboxSandboxConfig.enabled')
235478
235616
  : t('clawSandboxSandboxConfig.disabled'),
@@ -235514,13 +235652,15 @@ function SandboxConfig({ platformKey, mentorUniqueId, username }) {
235514
235652
  }) }))] })) })), selectedLLMProvider && (jsx(LLMProviderModal, { isOpen: true, onClose: closeLLMPicker, onSelect: handleSelectLLM, llmProvider: selectedLLMProvider, isSelecting: isUpdatingLLM, mentorSettings: {
235515
235653
  llm_name: currentModel.llmName,
235516
235654
  llm_provider: currentModel.provider,
235517
- }, llms: availableLLMProviders }))] }));
235655
+ }, llms: availableLLMProviders }))] })) : null;
235656
+ return (jsxs("div", { className: "space-y-6", children: [sandboxKindsSection, clawEnabled && (mentorConfig ? connectedSection : notConnectedSection)] }));
235518
235657
  }
235519
235658
  // ── Edit Instance Dialog ─────────────────────────────────────────────────────
235520
235659
  function EditInstanceDialog({ instance, org, onClose, onSaved, }) {
235521
235660
  var _a, _b, _c;
235522
235661
  const t = useT();
235523
235662
  const [updateInstance, { isLoading }] = useUpdateClawInstanceMutation();
235663
+ /* istanbul ignore next -- @preserve defensive nullish defaults; instances always carry these fields */
235524
235664
  const [form, setForm] = useState({
235525
235665
  name: (_a = instance.name) !== null && _a !== void 0 ? _a : '',
235526
235666
  server_url: (_b = instance.server_url) !== null && _b !== void 0 ? _b : '',
@@ -235528,6 +235668,7 @@ function EditInstanceDialog({ instance, org, onClose, onSaved, }) {
235528
235668
  gateway_token: '',
235529
235669
  });
235530
235670
  const handleSave = async () => {
235671
+ /* istanbul ignore if -- @preserve defensive; the Save button is disabled in this state */
235531
235672
  if (!form.name || !form.server_url || !form.gateway_token) {
235532
235673
  toast.error(t('clawSandboxSandboxConfig.nameUrlTokenRequired'));
235533
235674
  return;