@burdenoff/microfe-admin 2026.511.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/admin/AdminRoot.d.ts +31 -0
- package/dist/admin/AdminRoot.d.ts.map +1 -0
- package/dist/admin/AdminRoot.js +175 -0
- package/dist/admin/AdminRoot.js.map +1 -0
- package/dist/admin/AdminRoutes.d.ts +29 -0
- package/dist/admin/AdminRoutes.d.ts.map +1 -0
- package/dist/admin/AdminRoutes.js +143 -0
- package/dist/admin/AdminRoutes.js.map +1 -0
- package/dist/admin/components/AccessDenied.d.ts +8 -0
- package/dist/admin/components/AccessDenied.d.ts.map +1 -0
- package/dist/admin/components/AccessDenied.js +28 -0
- package/dist/admin/components/AccessDenied.js.map +1 -0
- package/dist/admin/components/ActivityFeed.d.ts +20 -0
- package/dist/admin/components/ActivityFeed.d.ts.map +1 -0
- package/dist/admin/components/ActivityFeed.js +91 -0
- package/dist/admin/components/ActivityFeed.js.map +1 -0
- package/dist/admin/components/Charts.d.ts +33 -0
- package/dist/admin/components/Charts.d.ts.map +1 -0
- package/dist/admin/components/Charts.js +37 -0
- package/dist/admin/components/Charts.js.map +1 -0
- package/dist/admin/components/ConfirmDialog.d.ts +45 -0
- package/dist/admin/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/admin/components/ConfirmDialog.js +4 -0
- package/dist/admin/components/DataTable.d.ts +64 -0
- package/dist/admin/components/DataTable.d.ts.map +1 -0
- package/dist/admin/components/DataTable.js +127 -0
- package/dist/admin/components/DataTable.js.map +1 -0
- package/dist/admin/components/FormSheet.d.ts +79 -0
- package/dist/admin/components/FormSheet.d.ts.map +1 -0
- package/dist/admin/components/FormSheet.js +111 -0
- package/dist/admin/components/FormSheet.js.map +1 -0
- package/dist/admin/components/MetricCard.d.ts +40 -0
- package/dist/admin/components/MetricCard.d.ts.map +1 -0
- package/dist/admin/components/MetricCard.js +57 -0
- package/dist/admin/components/MetricCard.js.map +1 -0
- package/dist/admin/components/PageLayout.d.ts +34 -0
- package/dist/admin/components/PageLayout.d.ts.map +1 -0
- package/dist/admin/components/PageLayout.js +31 -0
- package/dist/admin/components/PageLayout.js.map +1 -0
- package/dist/admin/components/PermissionGuard.d.ts +12 -0
- package/dist/admin/components/PermissionGuard.d.ts.map +1 -0
- package/dist/admin/components/PermissionGuard.js +18 -0
- package/dist/admin/components/PermissionGuard.js.map +1 -0
- package/dist/admin/components/RowActions.d.ts +41 -0
- package/dist/admin/components/RowActions.d.ts.map +1 -0
- package/dist/admin/components/RowActions.js +93 -0
- package/dist/admin/components/RowActions.js.map +1 -0
- package/dist/admin/components/StatusBadge.d.ts +35 -0
- package/dist/admin/components/StatusBadge.d.ts.map +1 -0
- package/dist/admin/components/StatusBadge.js +41 -0
- package/dist/admin/components/StatusBadge.js.map +1 -0
- package/dist/admin/components/Toast.d.ts +26 -0
- package/dist/admin/components/Toast.d.ts.map +1 -0
- package/dist/admin/components/Toast.js +133 -0
- package/dist/admin/components/Toast.js.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts +57 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.js +299 -0
- package/dist/admin/components/forms/SubscriptionForm.js.map +1 -0
- package/dist/admin/components/forms/TenantForm.d.ts +68 -0
- package/dist/admin/components/forms/TenantForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TenantForm.js +346 -0
- package/dist/admin/components/forms/TenantForm.js.map +1 -0
- package/dist/admin/components/forms/TicketForm.d.ts +67 -0
- package/dist/admin/components/forms/TicketForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TicketForm.js +55 -0
- package/dist/admin/components/forms/TicketForm.js.map +1 -0
- package/dist/admin/components/forms/UserForm.d.ts +57 -0
- package/dist/admin/components/forms/UserForm.d.ts.map +1 -0
- package/dist/admin/components/forms/UserForm.js +253 -0
- package/dist/admin/components/forms/UserForm.js.map +1 -0
- package/dist/admin/components/forms/index.d.ts +5 -0
- package/dist/admin/components/forms/index.d.ts.map +1 -0
- package/dist/admin/components/forms/index.js +4 -0
- package/dist/admin/components/index.d.ts +15 -0
- package/dist/admin/components/index.d.ts.map +1 -0
- package/dist/admin/components/index.js +17 -0
- package/dist/admin/components/ui.d.ts +52 -0
- package/dist/admin/components/ui.d.ts.map +1 -0
- package/dist/admin/components/ui.js +140 -0
- package/dist/admin/components/ui.js.map +1 -0
- package/dist/admin/constants/index.d.ts +75 -0
- package/dist/admin/constants/index.d.ts.map +1 -0
- package/dist/admin/constants/index.js +90 -0
- package/dist/admin/constants/index.js.map +1 -0
- package/dist/admin/constants/permissions.d.ts +27 -0
- package/dist/admin/constants/permissions.d.ts.map +1 -0
- package/dist/admin/constants/permissions.js +23 -0
- package/dist/admin/constants/permissions.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +30 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +56 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/index.d.ts +31 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +9 -0
- package/dist/admin/pages/AuditLogsPage.d.ts +5 -0
- package/dist/admin/pages/AuditLogsPage.d.ts.map +1 -0
- package/dist/admin/pages/AuditLogsPage.js +209 -0
- package/dist/admin/pages/AuditLogsPage.js.map +1 -0
- package/dist/admin/pages/BillingPage.d.ts +2 -0
- package/dist/admin/pages/BillingPage.d.ts.map +1 -0
- package/dist/admin/pages/BillingPage.js +164 -0
- package/dist/admin/pages/BillingPage.js.map +1 -0
- package/dist/admin/pages/CommunicationsPage.d.ts +2 -0
- package/dist/admin/pages/CommunicationsPage.d.ts.map +1 -0
- package/dist/admin/pages/CommunicationsPage.js +118 -0
- package/dist/admin/pages/CommunicationsPage.js.map +1 -0
- package/dist/admin/pages/DashboardPage.d.ts +5 -0
- package/dist/admin/pages/DashboardPage.d.ts.map +1 -0
- package/dist/admin/pages/DashboardPage.js +121 -0
- package/dist/admin/pages/DashboardPage.js.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts +2 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.js +116 -0
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts +2 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.js +112 -0
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -0
- package/dist/admin/pages/ProductsPage.d.ts +5 -0
- package/dist/admin/pages/ProductsPage.d.ts.map +1 -0
- package/dist/admin/pages/ProductsPage.js +392 -0
- package/dist/admin/pages/ProductsPage.js.map +1 -0
- package/dist/admin/pages/ReferralsPage.d.ts +2 -0
- package/dist/admin/pages/ReferralsPage.d.ts.map +1 -0
- package/dist/admin/pages/ReferralsPage.js +272 -0
- package/dist/admin/pages/ReferralsPage.js.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts +2 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.js +145 -0
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -0
- package/dist/admin/pages/SREPage.d.ts +5 -0
- package/dist/admin/pages/SREPage.d.ts.map +1 -0
- package/dist/admin/pages/SREPage.js +405 -0
- package/dist/admin/pages/SREPage.js.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts +7 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.js +497 -0
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -0
- package/dist/admin/pages/SettingsPage.d.ts +5 -0
- package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SettingsPage.js +279 -0
- package/dist/admin/pages/SettingsPage.js.map +1 -0
- package/dist/admin/pages/TenantDetailPage.d.ts +5 -0
- package/dist/admin/pages/TenantDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantDetailPage.js +274 -0
- package/dist/admin/pages/TenantDetailPage.js.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts +6 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.js +136 -0
- package/dist/admin/pages/TenantFormRoutePage.js.map +1 -0
- package/dist/admin/pages/TenantsListPage.d.ts +5 -0
- package/dist/admin/pages/TenantsListPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantsListPage.js +339 -0
- package/dist/admin/pages/TenantsListPage.js.map +1 -0
- package/dist/admin/pages/UsersListPage.d.ts +5 -0
- package/dist/admin/pages/UsersListPage.d.ts.map +1 -0
- package/dist/admin/pages/UsersListPage.js +250 -0
- package/dist/admin/pages/UsersListPage.js.map +1 -0
- package/dist/admin/pages/WaitlistPage.d.ts +2 -0
- package/dist/admin/pages/WaitlistPage.d.ts.map +1 -0
- package/dist/admin/pages/WaitlistPage.js +241 -0
- package/dist/admin/pages/WaitlistPage.js.map +1 -0
- package/dist/admin/pages/WorkflowsPage.d.ts +2 -0
- package/dist/admin/pages/WorkflowsPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkflowsPage.js +126 -0
- package/dist/admin/pages/WorkflowsPage.js.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.js +100 -0
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -0
- package/dist/admin/pages/index.d.ts +20 -0
- package/dist/admin/pages/index.d.ts.map +1 -0
- package/dist/admin/pages/index.js +19 -0
- package/dist/admin/providers/AdminProvider.d.ts +13 -0
- package/dist/admin/providers/AdminProvider.d.ts.map +1 -0
- package/dist/admin/providers/AdminProvider.js +43 -0
- package/dist/admin/providers/AdminProvider.js.map +1 -0
- package/dist/admin/schemas/index.d.ts +409 -0
- package/dist/admin/schemas/index.d.ts.map +1 -0
- package/dist/admin/schemas/index.js +111 -0
- package/dist/admin/schemas/index.js.map +1 -0
- package/dist/admin/store/adminStore.d.ts +28 -0
- package/dist/admin/store/adminStore.d.ts.map +1 -0
- package/dist/admin/store/adminStore.js +48 -0
- package/dist/admin/store/adminStore.js.map +1 -0
- package/dist/admin/types/index.d.ts +325 -0
- package/dist/admin/types/index.d.ts.map +1 -0
- package/dist/admin/utils/cn.d.ts +7 -0
- package/dist/admin/utils/cn.d.ts.map +1 -0
- package/dist/admin/utils/cn.js +10 -0
- package/dist/admin/utils/cn.js.map +1 -0
- package/dist/admin/utils/directActivityGraphql.d.ts +11 -0
- package/dist/admin/utils/directActivityGraphql.d.ts.map +1 -0
- package/dist/admin/utils/directActivityGraphql.js +25 -0
- package/dist/admin/utils/directActivityGraphql.js.map +1 -0
- package/dist/admin/utils/formatters.d.ts +33 -0
- package/dist/admin/utils/formatters.d.ts.map +1 -0
- package/dist/admin/utils/formatters.js +54 -0
- package/dist/admin/utils/formatters.js.map +1 -0
- package/dist/admin/utils/gatewayGraphql.d.ts +9 -0
- package/dist/admin/utils/gatewayGraphql.d.ts.map +1 -0
- package/dist/admin/utils/i18n.d.ts +6 -0
- package/dist/admin/utils/i18n.d.ts.map +1 -0
- package/dist/admin/utils/i18n.js +15 -0
- package/dist/admin/utils/i18n.js.map +1 -0
- package/dist/admin/utils/mappers.d.ts +15 -0
- package/dist/admin/utils/mappers.d.ts.map +1 -0
- package/dist/admin/utils/mappers.js +73 -0
- package/dist/admin/utils/mappers.js.map +1 -0
- package/dist/admin/utils/navigation.d.ts +9 -0
- package/dist/admin/utils/navigation.d.ts.map +1 -0
- package/dist/admin/utils/navigation.js +8 -0
- package/dist/admin/utils/navigation.js.map +1 -0
- package/dist/admin/utils/tenantEvents.d.ts +11 -0
- package/dist/admin/utils/tenantEvents.d.ts.map +1 -0
- package/dist/admin/utils/tenantEvents.js +8 -0
- package/dist/admin/utils/tenantEvents.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2749 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +907 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20773 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/global-types.js +12 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +132 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +65 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +34 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +118 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js +8 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js +9 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js +384 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js +45 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js +42 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js +11 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js +10 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js +10 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js +25 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js.map +1 -0
- package/dist/node_modules/date-fns/compareAsc.js +10 -0
- package/dist/node_modules/date-fns/compareAsc.js.map +1 -0
- package/dist/node_modules/date-fns/constants.js +8 -0
- package/dist/node_modules/date-fns/constants.js.map +1 -0
- package/dist/node_modules/date-fns/constructFrom.js +9 -0
- package/dist/node_modules/date-fns/constructFrom.js.map +1 -0
- package/dist/node_modules/date-fns/constructNow.js +9 -0
- package/dist/node_modules/date-fns/constructNow.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js +13 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js +10 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js +9 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMonths.js +18 -0
- package/dist/node_modules/date-fns/differenceInMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js +11 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js.map +1 -0
- package/dist/node_modules/date-fns/endOfDay.js +10 -0
- package/dist/node_modules/date-fns/endOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/endOfMonth.js +10 -0
- package/dist/node_modules/date-fns/endOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/format.js +61 -0
- package/dist/node_modules/date-fns/format.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistance.js +39 -0
- package/dist/node_modules/date-fns/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js +10 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js.map +1 -0
- package/dist/node_modules/date-fns/getDayOfYear.js +12 -0
- package/dist/node_modules/date-fns/getDayOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeek.js +13 -0
- package/dist/node_modules/date-fns/getISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js +16 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/getWeek.js +13 -0
- package/dist/node_modules/date-fns/getWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getWeekYear.js +17 -0
- package/dist/node_modules/date-fns/getWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/isDate.js +8 -0
- package/dist/node_modules/date-fns/isDate.js.map +1 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js +12 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/isValid.js +10 -0
- package/dist/node_modules/date-fns/isValid.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +19 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js +24 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +20 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +71 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js +34 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +13 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js +204 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js +126 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US.js +22 -0
- package/dist/node_modules/date-fns/locale/en-US.js.map +1 -0
- package/dist/node_modules/date-fns/parseISO.js +119 -0
- package/dist/node_modules/date-fns/parseISO.js.map +1 -0
- package/dist/node_modules/date-fns/startOfDay.js +10 -0
- package/dist/node_modules/date-fns/startOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeek.js +11 -0
- package/dist/node_modules/date-fns/startOfWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js +13 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfYear.js +10 -0
- package/dist/node_modules/date-fns/startOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/toDate.js +9 -0
- package/dist/node_modules/date-fns/toDate.js.map +1 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js +1210 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/node_modules/zod/v3/ZodError.js +82 -0
- package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
- package/dist/node_modules/zod/v3/errors.js +10 -0
- package/dist/node_modules/zod/v3/errors.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/util.js +76 -0
- package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
- package/dist/node_modules/zod/v3/locales/en.js +62 -0
- package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
- package/dist/node_modules/zod/v3/types.js +2459 -0
- package/dist/node_modules/zod/v3/types.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +35 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +24 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +29 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +20 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { useToast as e } from "../components/Toast.js";
|
|
2
|
+
import { useAdmin as t } from "../providers/AdminProvider.js";
|
|
3
|
+
import { useAdminPermissions as n } from "../hooks/useAdminPermissions.js";
|
|
4
|
+
import { Button as r, Card as i, CardContent as a, CardDescription as o, CardHeader as s, CardTitle as c, Input as l, Separator as u } from "../components/ui.js";
|
|
5
|
+
import { PageLayout as d } from "../components/PageLayout.js";
|
|
6
|
+
import { MetricCard as f, MetricsGrid as p } from "../components/MetricCard.js";
|
|
7
|
+
import { PermissionGuard as m } from "../components/PermissionGuard.js";
|
|
8
|
+
import "../components/index.js";
|
|
9
|
+
import { useCallback as h, useEffect as g, useState as _ } from "react";
|
|
10
|
+
import { Box as v, CheckSquare as y, Cpu as b, MemoryStick as x, Save as S, Timer as C, Users as w } from "lucide-react";
|
|
11
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
12
|
+
//#region src/admin/pages/SandboxSettingsPage.tsx
|
|
13
|
+
var D = [
|
|
14
|
+
"VIBECONTROLS",
|
|
15
|
+
"AI_BUILDER",
|
|
16
|
+
"WORKFLOW_MULTI_NODE",
|
|
17
|
+
"MISC_SHELL",
|
|
18
|
+
"CUSTOM"
|
|
19
|
+
], O = [
|
|
20
|
+
{
|
|
21
|
+
label: "30 minutes",
|
|
22
|
+
value: 1800
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: "1 hour",
|
|
26
|
+
value: 3600
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
label: "2 hours",
|
|
30
|
+
value: 7200
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "4 hours",
|
|
34
|
+
value: 14400
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
label: "8 hours",
|
|
38
|
+
value: 28800
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: "24 hours",
|
|
42
|
+
value: 86400
|
|
43
|
+
}
|
|
44
|
+
], k = {
|
|
45
|
+
totalActive: 12,
|
|
46
|
+
totalQueued: 3,
|
|
47
|
+
totalCompleted: 847,
|
|
48
|
+
totalFailed: 14
|
|
49
|
+
};
|
|
50
|
+
function A(e) {
|
|
51
|
+
return e ? e.includes("localhost:4000") ? e.replace("localhost:4000", "localhost:4003").replace("/global/", "/workspaces/") : e.includes("/global/") ? e.replace(/\/\/graphql\./, "//graphqlworkspaces.").replace(/\/\/alphagraphql\./, "//alphagraphqlworkspaces.").replace("/global/", "/workspaces/") : "http://localhost:4003/workspaces/graphql" : "http://localhost:4003/workspaces/graphql";
|
|
52
|
+
}
|
|
53
|
+
function j() {
|
|
54
|
+
let { canManageSandbox: j, isLoading: P } = n(), F = e(), { apiGatewayUrl: I, authToken: L, tenantId: R } = t(), z = A(I), [B, V] = _({
|
|
55
|
+
defaultTtl: 3600,
|
|
56
|
+
maxTtl: 14400,
|
|
57
|
+
allowedSandboxTypes: [
|
|
58
|
+
"VIBECONTROLS",
|
|
59
|
+
"AI_BUILDER",
|
|
60
|
+
"WORKFLOW_MULTI_NODE",
|
|
61
|
+
"MISC_SHELL",
|
|
62
|
+
"CUSTOM"
|
|
63
|
+
],
|
|
64
|
+
maxConcurrentPerUser: 3,
|
|
65
|
+
maxConcurrentPerWorkspace: 10,
|
|
66
|
+
defaultCpuRequest: "500m",
|
|
67
|
+
defaultCpuLimit: "2",
|
|
68
|
+
defaultMemoryRequest: "512Mi",
|
|
69
|
+
defaultMemoryLimit: "4Gi"
|
|
70
|
+
}), [H, U] = _(!1), [W, G] = _(!1);
|
|
71
|
+
g(() => {
|
|
72
|
+
if (!R || P || !j) return;
|
|
73
|
+
let e = { "Content-Type": "application/json" };
|
|
74
|
+
L && (e.Authorization = `Bearer ${L}`), R && (e["X-Workspace-ID"] = R), G(!0), fetch(z, {
|
|
75
|
+
method: "POST",
|
|
76
|
+
headers: e,
|
|
77
|
+
body: JSON.stringify({
|
|
78
|
+
query: "query GetSandboxConfig($context: ContextInput!) {\n getSandboxConfig(context: $context) {\n id\n defaultTtlSeconds\n maxTtlSeconds\n allowedTemplates\n maxConcurrentPerUser\n maxConcurrentPerWorkspace\n defaultCpuRequest\n defaultCpuLimit\n defaultMemoryRequest\n defaultMemoryLimit\n }\n }",
|
|
79
|
+
variables: { context: { workspaceId: R } }
|
|
80
|
+
})
|
|
81
|
+
}).then((e) => e.json()).then((e) => {
|
|
82
|
+
if (e.data?.getSandboxConfig) {
|
|
83
|
+
let t = e.data.getSandboxConfig;
|
|
84
|
+
V({
|
|
85
|
+
defaultTtl: t.defaultTtlSeconds,
|
|
86
|
+
maxTtl: t.maxTtlSeconds,
|
|
87
|
+
allowedSandboxTypes: t.allowedTemplates,
|
|
88
|
+
maxConcurrentPerUser: t.maxConcurrentPerUser,
|
|
89
|
+
maxConcurrentPerWorkspace: t.maxConcurrentPerWorkspace,
|
|
90
|
+
defaultCpuRequest: t.defaultCpuRequest,
|
|
91
|
+
defaultCpuLimit: t.defaultCpuLimit,
|
|
92
|
+
defaultMemoryRequest: t.defaultMemoryRequest,
|
|
93
|
+
defaultMemoryLimit: t.defaultMemoryLimit
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}).catch((e) => {
|
|
97
|
+
console.error("Failed to load sandbox config:", e), F.error("Load Failed", "Failed to load sandbox configuration.");
|
|
98
|
+
}).finally(() => G(!1));
|
|
99
|
+
}, [
|
|
100
|
+
R,
|
|
101
|
+
L,
|
|
102
|
+
z,
|
|
103
|
+
P,
|
|
104
|
+
j
|
|
105
|
+
]);
|
|
106
|
+
let K = h((e, t) => {
|
|
107
|
+
V((n) => ({
|
|
108
|
+
...n,
|
|
109
|
+
[e]: t
|
|
110
|
+
}));
|
|
111
|
+
}, []), q = h((e) => {
|
|
112
|
+
V((t) => {
|
|
113
|
+
let n = t.allowedSandboxTypes.includes(e) ? t.allowedSandboxTypes.filter((t) => t !== e) : [...t.allowedSandboxTypes, e];
|
|
114
|
+
return {
|
|
115
|
+
...t,
|
|
116
|
+
allowedSandboxTypes: n
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}, []), J = h(async () => {
|
|
120
|
+
if (B.maxTtl < B.defaultTtl) {
|
|
121
|
+
F.error("Validation Error", "Max TTL must be greater than or equal to Default TTL.");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (B.allowedSandboxTypes.length === 0) {
|
|
125
|
+
F.error("Validation Error", "At least one sandbox type must be allowed.");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
U(!0);
|
|
129
|
+
try {
|
|
130
|
+
let e = { "Content-Type": "application/json" };
|
|
131
|
+
L && (e.Authorization = `Bearer ${L}`), R && (e["X-Workspace-ID"] = R);
|
|
132
|
+
let t = await (await fetch(z, {
|
|
133
|
+
method: "POST",
|
|
134
|
+
headers: e,
|
|
135
|
+
body: JSON.stringify({
|
|
136
|
+
query: "mutation UpdateSandboxConfig($input: UpdateSandboxConfigInput!) {\n updateSandboxConfig(input: $input) {\n id\n defaultTtlSeconds\n maxTtlSeconds\n allowedTemplates\n maxConcurrentPerUser\n maxConcurrentPerWorkspace\n defaultCpuRequest\n defaultCpuLimit\n defaultMemoryRequest\n defaultMemoryLimit\n }\n }",
|
|
137
|
+
variables: { input: {
|
|
138
|
+
defaultTtlSeconds: B.defaultTtl,
|
|
139
|
+
maxTtlSeconds: B.maxTtl,
|
|
140
|
+
allowedTemplates: B.allowedSandboxTypes,
|
|
141
|
+
maxConcurrentPerUser: B.maxConcurrentPerUser,
|
|
142
|
+
maxConcurrentPerWorkspace: B.maxConcurrentPerWorkspace,
|
|
143
|
+
defaultCpuRequest: B.defaultCpuRequest,
|
|
144
|
+
defaultCpuLimit: B.defaultCpuLimit,
|
|
145
|
+
defaultMemoryRequest: B.defaultMemoryRequest,
|
|
146
|
+
defaultMemoryLimit: B.defaultMemoryLimit,
|
|
147
|
+
context: { workspaceId: R }
|
|
148
|
+
} }
|
|
149
|
+
})
|
|
150
|
+
})).json();
|
|
151
|
+
if (t.errors) throw Error(t.errors[0]?.message || "Failed to save sandbox configuration");
|
|
152
|
+
F.success("Settings Saved", "Sandbox configuration has been updated successfully.");
|
|
153
|
+
} catch (e) {
|
|
154
|
+
F.error("Save Failed", e instanceof Error ? e.message : "Failed to update sandbox configuration. Please try again.");
|
|
155
|
+
} finally {
|
|
156
|
+
U(!1);
|
|
157
|
+
}
|
|
158
|
+
}, [
|
|
159
|
+
B,
|
|
160
|
+
F,
|
|
161
|
+
L,
|
|
162
|
+
R,
|
|
163
|
+
z
|
|
164
|
+
]), Y = "h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm";
|
|
165
|
+
return /* @__PURE__ */ T(m, {
|
|
166
|
+
allowed: j,
|
|
167
|
+
isLoading: P,
|
|
168
|
+
pageTitle: "Sandbox Settings",
|
|
169
|
+
denyMessage: "You don't have permission to manage sandbox settings.",
|
|
170
|
+
children: /* @__PURE__ */ E(d, {
|
|
171
|
+
title: "Sandbox Settings",
|
|
172
|
+
description: "Configure platform-wide sandbox defaults and resource limits",
|
|
173
|
+
children: [/* @__PURE__ */ E(i, {
|
|
174
|
+
className: "mb-6",
|
|
175
|
+
children: [/* @__PURE__ */ E(s, { children: [/* @__PURE__ */ E("div", {
|
|
176
|
+
className: "flex items-center gap-2",
|
|
177
|
+
children: [/* @__PURE__ */ T(v, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
178
|
+
className: "text-lg",
|
|
179
|
+
children: "Sandbox Stats"
|
|
180
|
+
})]
|
|
181
|
+
}), /* @__PURE__ */ T(o, { children: "Current sandbox usage across the platform" })] }), /* @__PURE__ */ T(a, { children: /* @__PURE__ */ E(p, { children: [
|
|
182
|
+
/* @__PURE__ */ T(f, {
|
|
183
|
+
title: "Active Sandboxes",
|
|
184
|
+
value: k.totalActive,
|
|
185
|
+
trend: "up"
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ T(f, {
|
|
188
|
+
title: "Queued",
|
|
189
|
+
value: k.totalQueued
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ T(f, {
|
|
192
|
+
title: "Completed (all time)",
|
|
193
|
+
value: k.totalCompleted
|
|
194
|
+
}),
|
|
195
|
+
/* @__PURE__ */ T(f, {
|
|
196
|
+
title: "Failed (all time)",
|
|
197
|
+
value: k.totalFailed,
|
|
198
|
+
trend: "down"
|
|
199
|
+
})
|
|
200
|
+
] }) })]
|
|
201
|
+
}), /* @__PURE__ */ E("div", {
|
|
202
|
+
className: "grid gap-6 lg:grid-cols-3",
|
|
203
|
+
children: [/* @__PURE__ */ E("div", {
|
|
204
|
+
className: "space-y-6 lg:col-span-2",
|
|
205
|
+
children: [
|
|
206
|
+
/* @__PURE__ */ E(i, { children: [/* @__PURE__ */ E(s, { children: [/* @__PURE__ */ E("div", {
|
|
207
|
+
className: "flex items-center gap-2",
|
|
208
|
+
children: [/* @__PURE__ */ T(C, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
209
|
+
className: "text-lg",
|
|
210
|
+
children: "Time-to-Live (TTL)"
|
|
211
|
+
})]
|
|
212
|
+
}), /* @__PURE__ */ T(o, { children: "Control how long sandboxes stay alive before automatic cleanup" })] }), /* @__PURE__ */ T(a, {
|
|
213
|
+
className: "space-y-4",
|
|
214
|
+
children: /* @__PURE__ */ E("div", {
|
|
215
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
216
|
+
children: [/* @__PURE__ */ E("div", {
|
|
217
|
+
className: "space-y-2",
|
|
218
|
+
children: [
|
|
219
|
+
/* @__PURE__ */ T("label", {
|
|
220
|
+
className: "text-sm font-medium",
|
|
221
|
+
children: "Default TTL"
|
|
222
|
+
}),
|
|
223
|
+
/* @__PURE__ */ T("select", {
|
|
224
|
+
className: Y,
|
|
225
|
+
value: B.defaultTtl,
|
|
226
|
+
onChange: (e) => K("defaultTtl", Number(e.target.value)),
|
|
227
|
+
children: O.map((e) => /* @__PURE__ */ T("option", {
|
|
228
|
+
value: e.value,
|
|
229
|
+
children: e.label
|
|
230
|
+
}, e.value))
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ T("p", {
|
|
233
|
+
className: "text-xs text-muted-foreground",
|
|
234
|
+
children: "Default lifetime for new sandboxes"
|
|
235
|
+
})
|
|
236
|
+
]
|
|
237
|
+
}), /* @__PURE__ */ E("div", {
|
|
238
|
+
className: "space-y-2",
|
|
239
|
+
children: [
|
|
240
|
+
/* @__PURE__ */ T("label", {
|
|
241
|
+
className: "text-sm font-medium",
|
|
242
|
+
children: "Max TTL"
|
|
243
|
+
}),
|
|
244
|
+
/* @__PURE__ */ T("select", {
|
|
245
|
+
className: Y,
|
|
246
|
+
value: B.maxTtl,
|
|
247
|
+
onChange: (e) => K("maxTtl", Number(e.target.value)),
|
|
248
|
+
children: O.map((e) => /* @__PURE__ */ T("option", {
|
|
249
|
+
value: e.value,
|
|
250
|
+
children: e.label
|
|
251
|
+
}, e.value))
|
|
252
|
+
}),
|
|
253
|
+
/* @__PURE__ */ T("p", {
|
|
254
|
+
className: "text-xs text-muted-foreground",
|
|
255
|
+
children: "Maximum allowed TTL (must be >= default)"
|
|
256
|
+
})
|
|
257
|
+
]
|
|
258
|
+
})]
|
|
259
|
+
})
|
|
260
|
+
})] }),
|
|
261
|
+
/* @__PURE__ */ E(i, { children: [/* @__PURE__ */ E(s, { children: [/* @__PURE__ */ E("div", {
|
|
262
|
+
className: "flex items-center gap-2",
|
|
263
|
+
children: [/* @__PURE__ */ T(y, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
264
|
+
className: "text-lg",
|
|
265
|
+
children: "Allowed Sandbox Types"
|
|
266
|
+
})]
|
|
267
|
+
}), /* @__PURE__ */ T(o, { children: "Select which sandbox types users are permitted to create" })] }), /* @__PURE__ */ T(a, { children: /* @__PURE__ */ T("div", {
|
|
268
|
+
className: "space-y-3",
|
|
269
|
+
children: D.map((e) => /* @__PURE__ */ E("label", {
|
|
270
|
+
className: "flex items-center gap-3 rounded-lg border border-border p-4 cursor-pointer hover:bg-muted/50 transition-colors",
|
|
271
|
+
children: [/* @__PURE__ */ T("input", {
|
|
272
|
+
type: "checkbox",
|
|
273
|
+
checked: B.allowedSandboxTypes.includes(e),
|
|
274
|
+
onChange: () => q(e),
|
|
275
|
+
className: "h-4 w-4 rounded border-input text-primary focus:ring-primary"
|
|
276
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("div", {
|
|
277
|
+
className: "font-medium text-sm",
|
|
278
|
+
children: M(e)
|
|
279
|
+
}), /* @__PURE__ */ T("div", {
|
|
280
|
+
className: "text-xs text-muted-foreground",
|
|
281
|
+
children: N(e)
|
|
282
|
+
})] })]
|
|
283
|
+
}, e))
|
|
284
|
+
}) })] }),
|
|
285
|
+
/* @__PURE__ */ E(i, { children: [/* @__PURE__ */ E(s, { children: [/* @__PURE__ */ E("div", {
|
|
286
|
+
className: "flex items-center gap-2",
|
|
287
|
+
children: [/* @__PURE__ */ T(b, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
288
|
+
className: "text-lg",
|
|
289
|
+
children: "Default Resource Limits"
|
|
290
|
+
})]
|
|
291
|
+
}), /* @__PURE__ */ T(o, { children: "Kubernetes resource requests and limits applied to new sandboxes" })] }), /* @__PURE__ */ E(a, {
|
|
292
|
+
className: "space-y-4",
|
|
293
|
+
children: [
|
|
294
|
+
/* @__PURE__ */ E("div", {
|
|
295
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
296
|
+
children: [/* @__PURE__ */ E("div", {
|
|
297
|
+
className: "space-y-2",
|
|
298
|
+
children: [
|
|
299
|
+
/* @__PURE__ */ T("label", {
|
|
300
|
+
className: "text-sm font-medium",
|
|
301
|
+
children: "CPU Request"
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ T(l, {
|
|
304
|
+
value: B.defaultCpuRequest,
|
|
305
|
+
onChange: (e) => K("defaultCpuRequest", e.target.value),
|
|
306
|
+
placeholder: "500m"
|
|
307
|
+
}),
|
|
308
|
+
/* @__PURE__ */ T("p", {
|
|
309
|
+
className: "text-xs text-muted-foreground",
|
|
310
|
+
children: "Kubernetes CPU request (e.g. 500m, 1)"
|
|
311
|
+
})
|
|
312
|
+
]
|
|
313
|
+
}), /* @__PURE__ */ E("div", {
|
|
314
|
+
className: "space-y-2",
|
|
315
|
+
children: [
|
|
316
|
+
/* @__PURE__ */ T("label", {
|
|
317
|
+
className: "text-sm font-medium",
|
|
318
|
+
children: "CPU Limit"
|
|
319
|
+
}),
|
|
320
|
+
/* @__PURE__ */ T(l, {
|
|
321
|
+
value: B.defaultCpuLimit,
|
|
322
|
+
onChange: (e) => K("defaultCpuLimit", e.target.value),
|
|
323
|
+
placeholder: "2"
|
|
324
|
+
}),
|
|
325
|
+
/* @__PURE__ */ T("p", {
|
|
326
|
+
className: "text-xs text-muted-foreground",
|
|
327
|
+
children: "Kubernetes CPU limit (e.g. 1, 2, 4)"
|
|
328
|
+
})
|
|
329
|
+
]
|
|
330
|
+
})]
|
|
331
|
+
}),
|
|
332
|
+
/* @__PURE__ */ T(u, {}),
|
|
333
|
+
/* @__PURE__ */ E("div", {
|
|
334
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
335
|
+
children: [/* @__PURE__ */ E("div", {
|
|
336
|
+
className: "space-y-2",
|
|
337
|
+
children: [
|
|
338
|
+
/* @__PURE__ */ T("label", {
|
|
339
|
+
className: "text-sm font-medium",
|
|
340
|
+
children: "Memory Request"
|
|
341
|
+
}),
|
|
342
|
+
/* @__PURE__ */ T(l, {
|
|
343
|
+
value: B.defaultMemoryRequest,
|
|
344
|
+
onChange: (e) => K("defaultMemoryRequest", e.target.value),
|
|
345
|
+
placeholder: "512Mi"
|
|
346
|
+
}),
|
|
347
|
+
/* @__PURE__ */ T("p", {
|
|
348
|
+
className: "text-xs text-muted-foreground",
|
|
349
|
+
children: "Kubernetes memory request (e.g. 512Mi, 1Gi)"
|
|
350
|
+
})
|
|
351
|
+
]
|
|
352
|
+
}), /* @__PURE__ */ E("div", {
|
|
353
|
+
className: "space-y-2",
|
|
354
|
+
children: [
|
|
355
|
+
/* @__PURE__ */ T("label", {
|
|
356
|
+
className: "text-sm font-medium",
|
|
357
|
+
children: "Memory Limit"
|
|
358
|
+
}),
|
|
359
|
+
/* @__PURE__ */ T(l, {
|
|
360
|
+
value: B.defaultMemoryLimit,
|
|
361
|
+
onChange: (e) => K("defaultMemoryLimit", e.target.value),
|
|
362
|
+
placeholder: "4Gi"
|
|
363
|
+
}),
|
|
364
|
+
/* @__PURE__ */ T("p", {
|
|
365
|
+
className: "text-xs text-muted-foreground",
|
|
366
|
+
children: "Kubernetes memory limit (e.g. 2Gi, 4Gi, 8Gi)"
|
|
367
|
+
})
|
|
368
|
+
]
|
|
369
|
+
})]
|
|
370
|
+
})
|
|
371
|
+
]
|
|
372
|
+
})] })
|
|
373
|
+
]
|
|
374
|
+
}), /* @__PURE__ */ E("div", {
|
|
375
|
+
className: "space-y-6",
|
|
376
|
+
children: [
|
|
377
|
+
/* @__PURE__ */ E(i, { children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ E("div", {
|
|
378
|
+
className: "flex items-center gap-2",
|
|
379
|
+
children: [/* @__PURE__ */ T(w, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
380
|
+
className: "text-lg",
|
|
381
|
+
children: "Concurrency"
|
|
382
|
+
})]
|
|
383
|
+
}) }), /* @__PURE__ */ E(a, {
|
|
384
|
+
className: "space-y-4",
|
|
385
|
+
children: [
|
|
386
|
+
/* @__PURE__ */ E("div", {
|
|
387
|
+
className: "space-y-2",
|
|
388
|
+
children: [
|
|
389
|
+
/* @__PURE__ */ T("label", {
|
|
390
|
+
className: "text-sm font-medium",
|
|
391
|
+
children: "Max Per User"
|
|
392
|
+
}),
|
|
393
|
+
/* @__PURE__ */ T(l, {
|
|
394
|
+
type: "number",
|
|
395
|
+
min: 1,
|
|
396
|
+
max: 50,
|
|
397
|
+
value: B.maxConcurrentPerUser,
|
|
398
|
+
onChange: (e) => K("maxConcurrentPerUser", Number(e.target.value))
|
|
399
|
+
}),
|
|
400
|
+
/* @__PURE__ */ T("p", {
|
|
401
|
+
className: "text-xs text-muted-foreground",
|
|
402
|
+
children: "Maximum concurrent sandboxes per user"
|
|
403
|
+
})
|
|
404
|
+
]
|
|
405
|
+
}),
|
|
406
|
+
/* @__PURE__ */ T(u, {}),
|
|
407
|
+
/* @__PURE__ */ E("div", {
|
|
408
|
+
className: "space-y-2",
|
|
409
|
+
children: [
|
|
410
|
+
/* @__PURE__ */ T("label", {
|
|
411
|
+
className: "text-sm font-medium",
|
|
412
|
+
children: "Max Per Workspace"
|
|
413
|
+
}),
|
|
414
|
+
/* @__PURE__ */ T(l, {
|
|
415
|
+
type: "number",
|
|
416
|
+
min: 1,
|
|
417
|
+
max: 200,
|
|
418
|
+
value: B.maxConcurrentPerWorkspace,
|
|
419
|
+
onChange: (e) => K("maxConcurrentPerWorkspace", Number(e.target.value))
|
|
420
|
+
}),
|
|
421
|
+
/* @__PURE__ */ T("p", {
|
|
422
|
+
className: "text-xs text-muted-foreground",
|
|
423
|
+
children: "Maximum concurrent sandboxes per workspace"
|
|
424
|
+
})
|
|
425
|
+
]
|
|
426
|
+
})
|
|
427
|
+
]
|
|
428
|
+
})] }),
|
|
429
|
+
/* @__PURE__ */ E(i, { children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ E("div", {
|
|
430
|
+
className: "flex items-center gap-2",
|
|
431
|
+
children: [/* @__PURE__ */ T(x, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ T(c, {
|
|
432
|
+
className: "text-lg",
|
|
433
|
+
children: "Resource Info"
|
|
434
|
+
})]
|
|
435
|
+
}) }), /* @__PURE__ */ E(a, {
|
|
436
|
+
className: "space-y-3",
|
|
437
|
+
children: [
|
|
438
|
+
/* @__PURE__ */ T("p", {
|
|
439
|
+
className: "text-sm text-muted-foreground",
|
|
440
|
+
children: "Resource defaults are applied to all new sandboxes. Individual sandboxes can override these within the max limits defined by the sandbox type."
|
|
441
|
+
}),
|
|
442
|
+
/* @__PURE__ */ T(u, {}),
|
|
443
|
+
/* @__PURE__ */ E("div", {
|
|
444
|
+
className: "space-y-2 text-xs text-muted-foreground",
|
|
445
|
+
children: [/* @__PURE__ */ E("div", {
|
|
446
|
+
className: "flex justify-between",
|
|
447
|
+
children: [/* @__PURE__ */ T("span", { children: "CPU units" }), /* @__PURE__ */ T("span", {
|
|
448
|
+
className: "font-mono",
|
|
449
|
+
children: "millicores (m)"
|
|
450
|
+
})]
|
|
451
|
+
}), /* @__PURE__ */ E("div", {
|
|
452
|
+
className: "flex justify-between",
|
|
453
|
+
children: [/* @__PURE__ */ T("span", { children: "Memory units" }), /* @__PURE__ */ T("span", {
|
|
454
|
+
className: "font-mono",
|
|
455
|
+
children: "Mi / Gi"
|
|
456
|
+
})]
|
|
457
|
+
})]
|
|
458
|
+
})
|
|
459
|
+
]
|
|
460
|
+
})] }),
|
|
461
|
+
/* @__PURE__ */ T(i, { children: /* @__PURE__ */ T(a, {
|
|
462
|
+
className: "p-6",
|
|
463
|
+
children: /* @__PURE__ */ E(r, {
|
|
464
|
+
className: "w-full",
|
|
465
|
+
onClick: J,
|
|
466
|
+
disabled: H || W,
|
|
467
|
+
children: [/* @__PURE__ */ T(S, { className: "mr-2 h-4 w-4" }), H ? "Saving..." : W ? "Loading..." : "Save Configuration"]
|
|
468
|
+
})
|
|
469
|
+
}) })
|
|
470
|
+
]
|
|
471
|
+
})]
|
|
472
|
+
})]
|
|
473
|
+
})
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
function M(e) {
|
|
477
|
+
return {
|
|
478
|
+
VIBECONTROLS: "VibeControls",
|
|
479
|
+
AI_BUILDER: "AI Builder",
|
|
480
|
+
WORKFLOW_MULTI_NODE: "Workflow (Multi-Node)",
|
|
481
|
+
MISC_SHELL: "Misc Shell",
|
|
482
|
+
CUSTOM: "Custom"
|
|
483
|
+
}[e];
|
|
484
|
+
}
|
|
485
|
+
function N(e) {
|
|
486
|
+
return {
|
|
487
|
+
VIBECONTROLS: "Full VibeControls development environment with pre-configured tooling",
|
|
488
|
+
AI_BUILDER: "AI agent development sandbox with OpenCode SDK and model access",
|
|
489
|
+
WORKFLOW_MULTI_NODE: "Multi-node workflow execution environment for complex pipelines",
|
|
490
|
+
MISC_SHELL: "General-purpose shell environment for ad-hoc tasks",
|
|
491
|
+
CUSTOM: "User-defined sandbox from custom container images"
|
|
492
|
+
}[e];
|
|
493
|
+
}
|
|
494
|
+
//#endregion
|
|
495
|
+
export { j as SandboxSettingsPage };
|
|
496
|
+
|
|
497
|
+
//# sourceMappingURL=SandboxSettingsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxSettingsPage.js","names":[],"sources":["../../../src/admin/pages/SandboxSettingsPage.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { Box, Cpu, MemoryStick, Timer, Users, Building2, CheckSquare, Save } from 'lucide-react';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n MetricsGrid,\n MetricCard,\n useToast,\n PermissionGuard,\n} from '../components';\nimport { useAdmin } from '../providers/AdminProvider';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nconst SANDBOX_TYPES = [\n 'VIBECONTROLS',\n 'AI_BUILDER',\n 'WORKFLOW_MULTI_NODE',\n 'MISC_SHELL',\n 'CUSTOM',\n] as const;\n\ntype SandboxType = (typeof SANDBOX_TYPES)[number];\n\nconst TTL_OPTIONS = [\n { label: '30 minutes', value: 1800 },\n { label: '1 hour', value: 3600 },\n { label: '2 hours', value: 7200 },\n { label: '4 hours', value: 14400 },\n { label: '8 hours', value: 28800 },\n { label: '24 hours', value: 86400 },\n] as const;\n\ninterface SandboxConfig {\n defaultTtl: number;\n maxTtl: number;\n allowedSandboxTypes: SandboxType[];\n maxConcurrentPerUser: number;\n maxConcurrentPerWorkspace: number;\n defaultCpuRequest: string;\n defaultCpuLimit: string;\n defaultMemoryRequest: string;\n defaultMemoryLimit: string;\n}\n\n// ============================================================================\n// Mocked Stats (will be wired to query later)\n// ============================================================================\n\nconst MOCK_STATS = {\n totalActive: 12,\n totalQueued: 3,\n totalCompleted: 847,\n totalFailed: 14,\n};\n\n// ============================================================================\n// Helpers — Gateway URL derivation\n// ============================================================================\n\n/**\n * Derive the workspace gateway URL from the global gateway URL.\n *\n * Convention:\n * global gateway → https://graphql.burdenoff.com/global/graphql\n * wspace gateway → https://graphqlworkspaces.burdenoff.com/workspaces/graphql\n *\n * For local dev the global gateway is at localhost:4000 and the workspace\n * gateway is at localhost:4003, so we swap the port as a fallback.\n */\nfunction deriveWorkspaceGatewayUrl(apiGatewayUrl: string | undefined): string {\n if (!apiGatewayUrl) {\n return 'http://localhost:4003/workspaces/graphql';\n }\n\n // Local port-forward convention: 4000 → 4003\n if (apiGatewayUrl.includes('localhost:4000')) {\n return apiGatewayUrl\n .replace('localhost:4000', 'localhost:4003')\n .replace('/global/', '/workspaces/');\n }\n\n // Alpha / prod convention: alphagraphql → alphagraphqlworkspaces, graphql → graphqlworkspaces\n if (apiGatewayUrl.includes('/global/')) {\n return apiGatewayUrl\n .replace(/\\/\\/graphql\\./, '//graphqlworkspaces.')\n .replace(/\\/\\/alphagraphql\\./, '//alphagraphqlworkspaces.')\n .replace('/global/', '/workspaces/');\n }\n\n // Fallback: assume local dev\n return 'http://localhost:4003/workspaces/graphql';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Sandbox Settings page for superadmin sandbox configuration.\n * Manages platform-wide sandbox defaults including TTLs, resource limits,\n * allowed types, and concurrency caps.\n */\nexport function SandboxSettingsPage() {\n const { canManageSandbox, isLoading: permissionsLoading } = useAdminPermissions();\n const toast = useToast();\n const { apiGatewayUrl, authToken, tenantId } = useAdmin();\n const workspaceGatewayUrl = deriveWorkspaceGatewayUrl(apiGatewayUrl);\n\n const [config, setConfig] = useState<SandboxConfig>({\n defaultTtl: 3600,\n maxTtl: 14400,\n allowedSandboxTypes: [\n 'VIBECONTROLS',\n 'AI_BUILDER',\n 'WORKFLOW_MULTI_NODE',\n 'MISC_SHELL',\n 'CUSTOM',\n ],\n maxConcurrentPerUser: 3,\n maxConcurrentPerWorkspace: 10,\n defaultCpuRequest: '500m',\n defaultCpuLimit: '2',\n defaultMemoryRequest: '512Mi',\n defaultMemoryLimit: '4Gi',\n });\n\n const [isSaving, setIsSaving] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n // ---------------------------------------------------------------------------\n // Load config on mount\n // ---------------------------------------------------------------------------\n useEffect(() => {\n if (!tenantId || permissionsLoading || !canManageSandbox) return;\n\n // Auth tokens go to the gateway (edge) which validates and strips them.\n // X-Workspace-ID is forwarded to downstream subgraphs as workspace context.\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n if (tenantId) headers['X-Workspace-ID'] = tenantId;\n\n setIsLoading(true);\n fetch(workspaceGatewayUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n query: `query GetSandboxConfig($context: ContextInput!) {\n getSandboxConfig(context: $context) {\n id\n defaultTtlSeconds\n maxTtlSeconds\n allowedTemplates\n maxConcurrentPerUser\n maxConcurrentPerWorkspace\n defaultCpuRequest\n defaultCpuLimit\n defaultMemoryRequest\n defaultMemoryLimit\n }\n }`,\n variables: { context: { workspaceId: tenantId } },\n }),\n })\n .then((r) => r.json())\n .then((result) => {\n if (result.data?.getSandboxConfig) {\n const c = result.data.getSandboxConfig;\n setConfig({\n defaultTtl: c.defaultTtlSeconds,\n maxTtl: c.maxTtlSeconds,\n allowedSandboxTypes: c.allowedTemplates,\n maxConcurrentPerUser: c.maxConcurrentPerUser,\n maxConcurrentPerWorkspace: c.maxConcurrentPerWorkspace,\n defaultCpuRequest: c.defaultCpuRequest,\n defaultCpuLimit: c.defaultCpuLimit,\n defaultMemoryRequest: c.defaultMemoryRequest,\n defaultMemoryLimit: c.defaultMemoryLimit,\n });\n }\n })\n .catch((err) => {\n console.error('Failed to load sandbox config:', err);\n toast.error('Load Failed', 'Failed to load sandbox configuration.');\n })\n .finally(() => setIsLoading(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps -- toast excluded to avoid re-fetching when its reference changes\n }, [tenantId, authToken, workspaceGatewayUrl, permissionsLoading, canManageSandbox]);\n\n const updateConfig = useCallback(\n <K extends keyof SandboxConfig>(key: K, value: SandboxConfig[K]) => {\n setConfig((prev) => ({ ...prev, [key]: value }));\n },\n []\n );\n\n const toggleSandboxType = useCallback((type: SandboxType) => {\n setConfig((prev) => {\n const types = prev.allowedSandboxTypes.includes(type)\n ? prev.allowedSandboxTypes.filter((t) => t !== type)\n : [...prev.allowedSandboxTypes, type];\n return { ...prev, allowedSandboxTypes: types };\n });\n }, []);\n\n const handleSave = useCallback(async () => {\n // Validate max TTL >= default TTL\n if (config.maxTtl < config.defaultTtl) {\n toast.error('Validation Error', 'Max TTL must be greater than or equal to Default TTL.');\n return;\n }\n\n if (config.allowedSandboxTypes.length === 0) {\n toast.error('Validation Error', 'At least one sandbox type must be allowed.');\n return;\n }\n\n setIsSaving(true);\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n if (tenantId) headers['X-Workspace-ID'] = tenantId;\n\n const response = await fetch(workspaceGatewayUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n query: `mutation UpdateSandboxConfig($input: UpdateSandboxConfigInput!) {\n updateSandboxConfig(input: $input) {\n id\n defaultTtlSeconds\n maxTtlSeconds\n allowedTemplates\n maxConcurrentPerUser\n maxConcurrentPerWorkspace\n defaultCpuRequest\n defaultCpuLimit\n defaultMemoryRequest\n defaultMemoryLimit\n }\n }`,\n variables: {\n input: {\n defaultTtlSeconds: config.defaultTtl,\n maxTtlSeconds: config.maxTtl,\n allowedTemplates: config.allowedSandboxTypes,\n maxConcurrentPerUser: config.maxConcurrentPerUser,\n maxConcurrentPerWorkspace: config.maxConcurrentPerWorkspace,\n defaultCpuRequest: config.defaultCpuRequest,\n defaultCpuLimit: config.defaultCpuLimit,\n defaultMemoryRequest: config.defaultMemoryRequest,\n defaultMemoryLimit: config.defaultMemoryLimit,\n context: { workspaceId: tenantId },\n },\n },\n }),\n });\n\n const result = await response.json();\n if (result.errors) {\n throw new Error(result.errors[0]?.message || 'Failed to save sandbox configuration');\n }\n\n toast.success('Settings Saved', 'Sandbox configuration has been updated successfully.');\n } catch (err) {\n toast.error(\n 'Save Failed',\n err instanceof Error\n ? err.message\n : 'Failed to update sandbox configuration. Please try again.'\n );\n } finally {\n setIsSaving(false);\n }\n }, [config, toast, authToken, tenantId, workspaceGatewayUrl]);\n\n const selectClasses =\n 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm';\n\n return (\n <PermissionGuard\n allowed={canManageSandbox}\n isLoading={permissionsLoading}\n pageTitle=\"Sandbox Settings\"\n denyMessage=\"You don't have permission to manage sandbox settings.\"\n >\n <PageLayout\n title=\"Sandbox Settings\"\n description=\"Configure platform-wide sandbox defaults and resource limits\"\n >\n {/* Sandbox Stats */}\n <Card className=\"mb-6\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Box className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Sandbox Stats</CardTitle>\n </div>\n <CardDescription>Current sandbox usage across the platform</CardDescription>\n </CardHeader>\n <CardContent>\n <MetricsGrid>\n <MetricCard title=\"Active Sandboxes\" value={MOCK_STATS.totalActive} trend=\"up\" />\n <MetricCard title=\"Queued\" value={MOCK_STATS.totalQueued} />\n <MetricCard title=\"Completed (all time)\" value={MOCK_STATS.totalCompleted} />\n <MetricCard title=\"Failed (all time)\" value={MOCK_STATS.totalFailed} trend=\"down\" />\n </MetricsGrid>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* TTL Configuration */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Timer className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Time-to-Live (TTL)</CardTitle>\n </div>\n <CardDescription>\n Control how long sandboxes stay alive before automatic cleanup\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Default TTL</label>\n <select\n className={selectClasses}\n value={config.defaultTtl}\n onChange={(e) => updateConfig('defaultTtl', Number(e.target.value))}\n >\n {TTL_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n Default lifetime for new sandboxes\n </p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Max TTL</label>\n <select\n className={selectClasses}\n value={config.maxTtl}\n onChange={(e) => updateConfig('maxTtl', Number(e.target.value))}\n >\n {TTL_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n Maximum allowed TTL (must be >= default)\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Allowed Sandbox Types */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Allowed Sandbox Types</CardTitle>\n </div>\n <CardDescription>\n Select which sandbox types users are permitted to create\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {SANDBOX_TYPES.map((type) => (\n <label\n key={type}\n className=\"flex items-center gap-3 rounded-lg border border-border p-4 cursor-pointer hover:bg-muted/50 transition-colors\"\n >\n <input\n type=\"checkbox\"\n checked={config.allowedSandboxTypes.includes(type)}\n onChange={() => toggleSandboxType(type)}\n className=\"h-4 w-4 rounded border-input text-primary focus:ring-primary\"\n />\n <div>\n <div className=\"font-medium text-sm\">{formatSandboxType(type)}</div>\n <div className=\"text-xs text-muted-foreground\">\n {getSandboxTypeDescription(type)}\n </div>\n </div>\n </label>\n ))}\n </div>\n </CardContent>\n </Card>\n\n {/* Resource Limits */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Cpu className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Default Resource Limits</CardTitle>\n </div>\n <CardDescription>\n Kubernetes resource requests and limits applied to new sandboxes\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">CPU Request</label>\n <Input\n value={config.defaultCpuRequest}\n onChange={(e) => updateConfig('defaultCpuRequest', e.target.value)}\n placeholder=\"500m\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Kubernetes CPU request (e.g. 500m, 1)\n </p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">CPU Limit</label>\n <Input\n value={config.defaultCpuLimit}\n onChange={(e) => updateConfig('defaultCpuLimit', e.target.value)}\n placeholder=\"2\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Kubernetes CPU limit (e.g. 1, 2, 4)\n </p>\n </div>\n </div>\n <Separator />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Memory Request</label>\n <Input\n value={config.defaultMemoryRequest}\n onChange={(e) => updateConfig('defaultMemoryRequest', e.target.value)}\n placeholder=\"512Mi\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Kubernetes memory request (e.g. 512Mi, 1Gi)\n </p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Memory Limit</label>\n <Input\n value={config.defaultMemoryLimit}\n onChange={(e) => updateConfig('defaultMemoryLimit', e.target.value)}\n placeholder=\"4Gi\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Kubernetes memory limit (e.g. 2Gi, 4Gi, 8Gi)\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Concurrency Limits */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Users className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Concurrency</CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Max Per User</label>\n <Input\n type=\"number\"\n min={1}\n max={50}\n value={config.maxConcurrentPerUser}\n onChange={(e) => updateConfig('maxConcurrentPerUser', Number(e.target.value))}\n />\n <p className=\"text-xs text-muted-foreground\">\n Maximum concurrent sandboxes per user\n </p>\n </div>\n <Separator />\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Max Per Workspace</label>\n <Input\n type=\"number\"\n min={1}\n max={200}\n value={config.maxConcurrentPerWorkspace}\n onChange={(e) =>\n updateConfig('maxConcurrentPerWorkspace', Number(e.target.value))\n }\n />\n <p className=\"text-xs text-muted-foreground\">\n Maximum concurrent sandboxes per workspace\n </p>\n </div>\n </CardContent>\n </Card>\n\n {/* Resource Presets Info */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <MemoryStick className=\"h-5 w-5 text-muted-foreground\" />\n <CardTitle className=\"text-lg\">Resource Info</CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n Resource defaults are applied to all new sandboxes. Individual sandboxes can\n override these within the max limits defined by the sandbox type.\n </p>\n <Separator />\n <div className=\"space-y-2 text-xs text-muted-foreground\">\n <div className=\"flex justify-between\">\n <span>CPU units</span>\n <span className=\"font-mono\">millicores (m)</span>\n </div>\n <div className=\"flex justify-between\">\n <span>Memory units</span>\n <span className=\"font-mono\">Mi / Gi</span>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Save Button */}\n <Card>\n <CardContent className=\"p-6\">\n <Button className=\"w-full\" onClick={handleSave} disabled={isSaving || isLoading}>\n <Save className=\"mr-2 h-4 w-4\" />\n {isSaving ? 'Saving...' : isLoading ? 'Loading...' : 'Save Configuration'}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatSandboxType(type: SandboxType): string {\n const labels: Record<SandboxType, string> = {\n VIBECONTROLS: 'VibeControls',\n AI_BUILDER: 'AI Builder',\n WORKFLOW_MULTI_NODE: 'Workflow (Multi-Node)',\n MISC_SHELL: 'Misc Shell',\n CUSTOM: 'Custom',\n };\n return labels[type];\n}\n\nfunction getSandboxTypeDescription(type: SandboxType): string {\n const descriptions: Record<SandboxType, string> = {\n VIBECONTROLS: 'Full VibeControls development environment with pre-configured tooling',\n AI_BUILDER: 'AI agent development sandbox with OpenCode SDK and model access',\n WORKFLOW_MULTI_NODE: 'Multi-node workflow execution environment for complex pipelines',\n MISC_SHELL: 'General-purpose shell environment for ad-hoc tasks',\n CUSTOM: 'User-defined sandbox from custom container images',\n };\n return descriptions[type];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/SettingsPage.tsx"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAgB,YAAY,4CAkT3B"}
|