@strapi/admin 5.53.0 → 5.55.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.
Files changed (183) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/DismissibleBanner.js +60 -0
  6. package/dist/admin/admin/src/components/DismissibleBanner.js.map +1 -0
  7. package/dist/admin/admin/src/components/DismissibleBanner.mjs +58 -0
  8. package/dist/admin/admin/src/components/DismissibleBanner.mjs.map +1 -0
  9. package/dist/admin/admin/src/components/Form.js +11 -2
  10. package/dist/admin/admin/src/components/Form.js.map +1 -1
  11. package/dist/admin/admin/src/components/Form.mjs +11 -2
  12. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/FormInputs/DateTime.js +1 -1
  14. package/dist/admin/admin/src/components/FormInputs/DateTime.js.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs +1 -1
  16. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Time.js +1 -1
  18. package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
  19. package/dist/admin/admin/src/components/FormInputs/Time.mjs +1 -1
  20. package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/LanguageProvider.js +35 -1
  22. package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
  23. package/dist/admin/admin/src/components/LanguageProvider.mjs +17 -2
  24. package/dist/admin/admin/src/components/LanguageProvider.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/MainNav/NavUser.js +1 -2
  26. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  27. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +1 -2
  28. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/MediaLibraryBanner.js +85 -0
  30. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -0
  31. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +83 -0
  32. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -0
  33. package/dist/admin/admin/src/components/Providers.js +6 -6
  34. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  35. package/dist/admin/admin/src/components/Providers.mjs +6 -6
  36. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/SubNav.js +113 -35
  38. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  39. package/dist/admin/admin/src/components/SubNav.mjs +115 -37
  40. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/SubNavFolder.js +188 -0
  42. package/dist/admin/admin/src/components/SubNavFolder.js.map +1 -0
  43. package/dist/admin/admin/src/components/SubNavFolder.mjs +186 -0
  44. package/dist/admin/admin/src/components/SubNavFolder.mjs.map +1 -0
  45. package/dist/admin/admin/src/components/UpsellBanner.js +56 -86
  46. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  47. package/dist/admin/admin/src/components/UpsellBanner.mjs +58 -88
  48. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  49. package/dist/admin/admin/src/core/store/configure.js +14 -2
  50. package/dist/admin/admin/src/core/store/configure.js.map +1 -1
  51. package/dist/admin/admin/src/core/store/configure.mjs +14 -2
  52. package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
  53. package/dist/admin/admin/src/core/store/hooks.mjs +1 -1
  54. package/dist/admin/admin/src/features/Auth.js +162 -46
  55. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  56. package/dist/admin/admin/src/features/Auth.mjs +164 -48
  57. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  58. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  59. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  60. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js +19 -0
  61. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js.map +1 -0
  62. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs +17 -0
  63. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs.map +1 -0
  64. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.js → useSessionKeepalive.js} +34 -27
  65. package/dist/admin/admin/src/hooks/useSessionKeepalive.js.map +1 -0
  66. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.mjs → useSessionKeepalive.mjs} +34 -27
  67. package/dist/admin/admin/src/hooks/useSessionKeepalive.mjs.map +1 -0
  68. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +2 -0
  69. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  70. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +2 -0
  71. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  72. package/dist/admin/admin/src/pages/SessionsPage.js +2 -5
  73. package/dist/admin/admin/src/pages/SessionsPage.js.map +1 -1
  74. package/dist/admin/admin/src/pages/SessionsPage.mjs +2 -5
  75. package/dist/admin/admin/src/pages/SessionsPage.mjs.map +1 -1
  76. package/dist/admin/admin/src/render.js +6 -1
  77. package/dist/admin/admin/src/render.js.map +1 -1
  78. package/dist/admin/admin/src/render.mjs +6 -1
  79. package/dist/admin/admin/src/render.mjs.map +1 -1
  80. package/dist/admin/admin/src/translations/en.json.js +16 -0
  81. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  82. package/dist/admin/admin/src/translations/en.json.mjs +16 -0
  83. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  84. package/dist/admin/admin/src/utils/baseQuery.js +3 -13
  85. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  86. package/dist/admin/admin/src/utils/baseQuery.mjs +3 -13
  87. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  88. package/dist/admin/admin/src/utils/getFetchClient.js +34 -5
  89. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  90. package/dist/admin/admin/src/utils/getFetchClient.mjs +34 -6
  91. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  92. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js +25 -0
  93. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js.map +1 -0
  94. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs +22 -0
  95. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs.map +1 -0
  96. package/dist/admin/admin/tests/utils.js +14 -14
  97. package/dist/admin/admin/tests/utils.js.map +1 -1
  98. package/dist/admin/admin/tests/utils.mjs +14 -14
  99. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  100. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +1 -6
  101. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -1
  102. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +1 -6
  103. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -1
  104. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +7 -1
  105. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  106. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +7 -1
  107. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  108. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +9 -1
  109. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  110. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +9 -1
  111. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  112. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +0 -4
  113. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  114. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +0 -4
  115. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  116. package/dist/admin/index.js +1 -0
  117. package/dist/admin/index.js.map +1 -1
  118. package/dist/admin/index.mjs +1 -1
  119. package/dist/admin/src/components/DismissibleBanner.d.ts +8 -0
  120. package/dist/admin/src/components/MediaLibraryBanner.d.ts +2 -0
  121. package/dist/admin/src/components/SubNav.d.ts +27 -8
  122. package/dist/admin/src/components/SubNavFolder.d.ts +15 -0
  123. package/dist/admin/src/features/Tracking.d.ts +2 -1
  124. package/dist/admin/src/hooks/useRegisterUnsavedChanges.d.ts +6 -0
  125. package/dist/admin/src/hooks/useSessionKeepalive.d.ts +88 -0
  126. package/dist/admin/src/services/admin.d.ts +1 -0
  127. package/dist/admin/src/utils/getFetchClient.d.ts +14 -6
  128. package/dist/admin/src/utils/unsavedChangesRegistry.d.ts +11 -0
  129. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +8 -0
  130. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  131. package/dist/ee/server/src/index.d.ts.map +1 -1
  132. package/dist/server/ee/server/src/controllers/admin.js +1 -5
  133. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  134. package/dist/server/ee/server/src/controllers/admin.mjs +1 -5
  135. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  136. package/dist/server/ee/server/src/index.js +2 -0
  137. package/dist/server/ee/server/src/index.js.map +1 -1
  138. package/dist/server/ee/server/src/index.mjs +2 -0
  139. package/dist/server/ee/server/src/index.mjs.map +1 -1
  140. package/dist/server/server/src/ai/controllers/ai.js +3 -3
  141. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  142. package/dist/server/server/src/ai/controllers/ai.mjs +3 -3
  143. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  144. package/dist/server/server/src/ai/services/ai.js +37 -12
  145. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  146. package/dist/server/server/src/ai/services/ai.mjs +37 -12
  147. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  148. package/dist/server/server/src/audit-logs/tokens.js +106 -0
  149. package/dist/server/server/src/audit-logs/tokens.js.map +1 -0
  150. package/dist/server/server/src/audit-logs/tokens.mjs +99 -0
  151. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -0
  152. package/dist/server/server/src/controllers/admin.js +10 -1
  153. package/dist/server/server/src/controllers/admin.js.map +1 -1
  154. package/dist/server/server/src/controllers/admin.mjs +10 -1
  155. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  156. package/dist/server/server/src/services/api-token.js +106 -4
  157. package/dist/server/server/src/services/api-token.js.map +1 -1
  158. package/dist/server/server/src/services/api-token.mjs +107 -5
  159. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  160. package/dist/server/server/src/services/transfer/token.js +56 -4
  161. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  162. package/dist/server/server/src/services/transfer/token.mjs +57 -5
  163. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  164. package/dist/server/src/ai/services/ai.d.ts +3 -1
  165. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  166. package/dist/server/src/audit-logs/tokens.d.ts +86 -0
  167. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -0
  168. package/dist/server/src/controllers/admin.d.ts +1 -0
  169. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  170. package/dist/server/src/controllers/index.d.ts +1 -0
  171. package/dist/server/src/controllers/index.d.ts.map +1 -1
  172. package/dist/server/src/index.d.ts +1 -0
  173. package/dist/server/src/index.d.ts.map +1 -1
  174. package/dist/server/src/services/api-token.d.ts.map +1 -1
  175. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  176. package/dist/shared/contracts/admin.d.ts +1 -0
  177. package/dist/shared/contracts/admin.d.ts.map +1 -1
  178. package/dist/shared/contracts/shared.d.ts +1 -0
  179. package/dist/shared/contracts/shared.d.ts.map +1 -1
  180. package/package.json +7 -7
  181. package/dist/admin/admin/src/hooks/useIdleSessionLogout.js.map +0 -1
  182. package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs.map +0 -1
  183. package/dist/admin/src/hooks/useIdleSessionLogout.d.ts +0 -87
@@ -0,0 +1,88 @@
1
+ declare const SESSION_EXPIRY_BUFFER_MS = 1000;
2
+ /**
3
+ * How long before the access token's `exp` an active tab renews. Renewing
4
+ * ahead of expiry (rather than at it) means the refreshed token is already in
5
+ * shared storage by the time any *other* tab's post-expiry timer fires — so an
6
+ * idle sibling re-syncs instead of racing the refresh.
7
+ */
8
+ declare const SESSION_RENEW_MARGIN_MS = 10000;
9
+ interface UseSessionKeepaliveOptions {
10
+ /**
11
+ * The current admin access JWT (from Redux), or `null` when logged out.
12
+ */
13
+ token: string | null;
14
+ /**
15
+ * Called when a renewal attempt is rejected by the server (the session is
16
+ * truly over: refresh token idle/max window elapsed). This is a
17
+ * server-confirmed end of session, so it SHOULD broadcast a global logout to
18
+ * every tab.
19
+ */
20
+ onSessionDead?: () => void;
21
+ /**
22
+ * Read the access token currently in shared storage (localStorage/cookie).
23
+ * Because every open tab shares the same refresh cookie, an active tab that
24
+ * refreshes writes a newer access token here. When omitted, the hook never
25
+ * re-syncs across tabs.
26
+ */
27
+ getStoredToken?: () => string | null;
28
+ /**
29
+ * Adopt a newer shared token instead of treating this tab's token as stale.
30
+ * Typically dispatches `setToken`, which updates Redux and causes this hook
31
+ * to re-arm against the later `exp`. Only called when `getStoredToken`
32
+ * returns a token whose `exp` is later than the in-memory one.
33
+ */
34
+ onResync?: (token: string) => void;
35
+ /**
36
+ * Epoch ms of the user's last interaction (pointer, key, scroll, …). Used to
37
+ * decide whether to silently renew when the access token is about to expire.
38
+ * Idle tabs must NOT renew — that would defeat the server's
39
+ * `idleSessionLifespan` / `idleRefreshTokenLifespan`. When omitted, the hook
40
+ * never treats the tab as active.
41
+ */
42
+ getLastActivityAt?: () => number;
43
+ /**
44
+ * Silently renew the session (rotate the refresh token + mint a new access
45
+ * token). Resolves `true` on success — the resulting `setToken` re-arms this
46
+ * hook against the new `exp` — or `false` when the server rejects it. Only
47
+ * called when the user was active during the current token's lifetime.
48
+ */
49
+ renewSession?: () => Promise<boolean>;
50
+ /**
51
+ * Escape hatch for tests / dev environments where we don't want the
52
+ * automatic renew / re-sync behavior. Mirrors the existing `_disableRenewToken`
53
+ * prop on `<AuthProvider>`.
54
+ */
55
+ disabled?: boolean;
56
+ }
57
+ /**
58
+ * Keep the admin session alive while the user is active — without one tab
59
+ * tearing down another, and without logging anyone out because a short-lived
60
+ * access token aged out.
61
+ *
62
+ * The access token (`accessTokenLifespan`, e.g. 30 min) is transport plumbing,
63
+ * not the session length; the refresh token's idle/max window is the session.
64
+ * So expiry of the access JWT must never clear auth state or unmount the page:
65
+ * the next user-initiated request 401s, `withTokenRefresh` refreshes and
66
+ * retries, and only a *rejected* refresh ends the session (`onSessionDead`).
67
+ * Two timers are armed per token:
68
+ *
69
+ * - Renew (at `exp` minus a margin): if the user interacted during this token's
70
+ * lifetime, silently renew *ahead* of expiry. The new `setToken` re-arms the
71
+ * hook; a server rejection (`onSessionDead`) ends the session globally.
72
+ * Renewing early guarantees the refreshed token reaches shared storage before
73
+ * any sibling tab's post-expiry timer fires.
74
+ * - Post-expiry (just after `exp`): the fallback when this tab did not renew.
75
+ * It first re-syncs from a token another tab refreshed (so an idle tab rides
76
+ * on an active sibling), then renews if activity arrived late. If the tab is
77
+ * still idle, it does nothing destructive — the stale access token stays in
78
+ * place so form state survives until the next request.
79
+ *
80
+ * Idle tabs must not renew: a tab left open forever must not keep the session
81
+ * alive past the server's idle/max window.
82
+ *
83
+ * If the JWT can't be decoded (malformed, missing `exp`), the timers are skipped
84
+ * silently — the 401 refresh path still covers the next user-initiated request.
85
+ */
86
+ declare const useSessionKeepalive: ({ token, onSessionDead, getStoredToken, onResync, getLastActivityAt, renewSession, disabled, }: UseSessionKeepaliveOptions) => void;
87
+ export { useSessionKeepalive, SESSION_EXPIRY_BUFFER_MS, SESSION_RENEW_MARGIN_MS };
88
+ export type { UseSessionKeepaliveOptions };
@@ -18,6 +18,7 @@ declare const useInitQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks
18
18
  numberOfAllContentTypes: number;
19
19
  numberOfComponents: number;
20
20
  numberOfDynamicZones: number;
21
+ numberOfContentTypeFolders: number;
21
22
  }, "adminApi">>, useInformationQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError | import("@reduxjs/toolkit").SerializedError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ProjectSettings" | "LicenseLimits" | "LicenseTrialTimeLeft", {
22
23
  currentEnvironment: string;
23
24
  autoReload: boolean;
@@ -15,18 +15,26 @@ export type ApiError = errors.ApplicationError | errors.ForbiddenError | errors.
15
15
  declare const setOnTokenUpdate: (callback: ((token: string) => void) | null) => void;
16
16
  /**
17
17
  * Set the callback that will be called when the active session is no longer
18
- * valid (refresh token rejected by the server, or detected idle on the
19
- * client). This lets the active tab redirect to /auth/login without waiting
20
- * for the next user-initiated request to fail.
18
+ * valid — i.e. the server rejected the refresh token, not merely that the
19
+ * short-lived access token expired. This lets the tab redirect to /auth/login
20
+ * (after any unsaved-changes guard) rather than sitting on a dead session.
21
21
  *
22
22
  * @param callback - Function to call when the session ends, or null to clear
23
23
  */
24
24
  declare const setOnSessionExpired: (callback: (() => void) | null) => void;
25
+ /**
26
+ * Re-arm session-expired notifications after a new access token is stored
27
+ * (silent refresh) or after a successful login.
28
+ */
29
+ declare const resetSessionExpiredNotification: () => void;
25
30
  /**
26
31
  * Trigger the registered session-expired callback, if any. Safe to call from
27
- * non-React code (e.g., the RTK Query baseQuery 401 handler).
32
+ * non-React code (e.g., the RTK Query baseQuery 401 handler). Returns `false`
33
+ * when nothing is listening, so callers can fall back to a hard redirect
34
+ * instead of leaving the user on a dead page. Subsequent calls during the same
35
+ * dead session return `true` without invoking the handler again.
28
36
  */
29
- declare const triggerSessionExpired: () => void;
37
+ declare const triggerSessionExpired: () => boolean;
30
38
  /**
31
39
  * Store the new token in the appropriate storage (localStorage or cookie)
32
40
  * and notify the app to update its state.
@@ -124,5 +132,5 @@ type FetchClient = {
124
132
  * ```
125
133
  */
126
134
  declare const getFetchClient: (defaultOptions?: FetchConfig) => FetchClient;
127
- export { getFetchClient, isFetchError, FetchError, attemptTokenRefresh, refreshAccessToken, storeToken, setOnTokenUpdate, setOnSessionExpired, triggerSessionExpired, ADMIN_REFRESH_LOCK, };
135
+ export { getFetchClient, isFetchError, FetchError, attemptTokenRefresh, refreshAccessToken, storeToken, setOnTokenUpdate, setOnSessionExpired, triggerSessionExpired, resetSessionExpiredNotification, ADMIN_REFRESH_LOCK, };
128
136
  export type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };
@@ -0,0 +1,11 @@
1
+ type UnsavedChangesCheck = () => boolean;
2
+ /**
3
+ * Register a callback that reports whether a form (or other surface) has unsaved
4
+ * edits. Used by the auth layer to warn before session-expiry logout discards
5
+ * in-memory state that route blockers never see (token clear unmounts the form).
6
+ */
7
+ declare const registerUnsavedChangesCheck: (id: string, check: UnsavedChangesCheck) => (() => void);
8
+ declare const hasUnsavedChanges: () => boolean;
9
+ declare const clearUnsavedChangesChecks: () => void;
10
+ export { registerUnsavedChangesCheck, hasUnsavedChanges, clearUnsavedChangesChecks };
11
+ export type { UnsavedChangesCheck };
@@ -36,5 +36,13 @@ export declare const actionTypes: {
36
36
  'release.entry.remove': string;
37
37
  'release.settings.update': string;
38
38
  'audit-log.export': string;
39
+ 'locale.create': string;
40
+ 'locale.update': string;
41
+ 'locale.delete': string;
42
+ 'locale.default.update': string;
43
+ 'token.create': string;
44
+ 'token.update': string;
45
+ 'token.delete': string;
46
+ 'token.regenerate': string;
39
47
  };
40
48
  export declare const getDefaultMessage: (value: keyof typeof actionTypes) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAoEE"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/controllers/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAkEE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAe1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4Be;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;wBAsBxB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAgB1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4Be;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;wBAwBxB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -8,10 +8,6 @@ var admin = {
8
8
  // NOTE: Overrides CE admin controller
9
9
  async getProjectType () {
10
10
  const flags = strapi.config.get('admin.flags', {});
11
- const isAILicense = strapi.ee.features.isEnabled('cms-ai');
12
- const isAIConfigured = strapi.config.get('admin.ai', {
13
- enabled: isAILicense
14
- });
15
11
  try {
16
12
  return {
17
13
  data: {
@@ -22,7 +18,7 @@ var admin = {
22
18
  type: strapi.ee.type,
23
19
  planPriceId: strapi.ee.planPriceId,
24
20
  ai: {
25
- enabled: isAILicense && isAIConfigured.enabled
21
+ enabled: strapi.ai.admin.isStrapiManagedAiEnabled()
26
22
  }
27
23
  }
28
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","planPriceId","ai","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","EE","isTrial","ee","features","list","type","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;;;AAKA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;AACJC,oBAAAA,IAAAA,EAAMJ,OAAOK,EAAE;oBACfC,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUR,MAAAA,CAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCV,oBAAAA,KAAAA;oBACAW,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;oBACpBC,WAAAA,EAAaX,MAAAA,CAAOO,EAAE,CAACI,WAAW;oBAClCC,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASb,MAAAA,CAAOY,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEZ,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;AAAOI,oBAAAA,QAAAA,EAAU,EAAE;AAAET,oBAAAA,KAAAA;oBAAOa,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9E,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBjB,MAAAA,CAAOO,EAAE,CAACW,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,gBAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,gBAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;AAEA,QAAA,IAAI,CAACM,QAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;AAEA,QAAA,IAAI,CAACQ,QAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMjB,IAAAA,GAAO;AACXkB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAU,gBAAAA,EAAkBD,QAAAA,CAAMX,cAAAA,CAAAA,GAAkB,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC5EG,YAAAA,kBAAAA;YACAU,qBAAAA,EAAuBC,SAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUR,OAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEN,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
@@ -6,10 +6,6 @@ var admin = {
6
6
  // NOTE: Overrides CE admin controller
7
7
  async getProjectType () {
8
8
  const flags = strapi.config.get('admin.flags', {});
9
- const isAILicense = strapi.ee.features.isEnabled('cms-ai');
10
- const isAIConfigured = strapi.config.get('admin.ai', {
11
- enabled: isAILicense
12
- });
13
9
  try {
14
10
  return {
15
11
  data: {
@@ -20,7 +16,7 @@ var admin = {
20
16
  type: strapi.ee.type,
21
17
  planPriceId: strapi.ee.planPriceId,
22
18
  ai: {
23
- enabled: isAILicense && isAIConfigured.enabled
19
+ enabled: strapi.ai.admin.isStrapiManagedAiEnabled()
24
20
  }
25
21
  }
26
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n const isAILicense = strapi.ee.features.isEnabled('cms-ai');\n const isAIConfigured = strapi.config.get('admin.ai', { enabled: isAILicense });\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: isAILicense && isAIConfigured.enabled,\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","isAILicense","ee","features","isEnabled","isAIConfigured","enabled","data","isEE","EE","isTrial","list","type","planPriceId","ai","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":"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"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","EE","isTrial","ee","features","list","type","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;AAKA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;AACJC,oBAAAA,IAAAA,EAAMJ,OAAOK,EAAE;oBACfC,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUR,MAAAA,CAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCV,oBAAAA,KAAAA;oBACAW,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;oBACpBC,WAAAA,EAAaX,MAAAA,CAAOO,EAAE,CAACI,WAAW;oBAClCC,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASb,MAAAA,CAAOY,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEZ,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;AAAOI,oBAAAA,QAAAA,EAAU,EAAE;AAAET,oBAAAA,KAAAA;oBAAOa,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9E,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBjB,MAAAA,CAAOO,EAAE,CAACW,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,UAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,UAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;AAEA,QAAA,IAAI,CAACM,KAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;AAEA,QAAA,IAAI,CAACQ,KAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMjB,IAAAA,GAAO;AACXkB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAU,gBAAAA,EAAkBD,KAAAA,CAAMX,cAAAA,CAAAA,GAAkB,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC5EG,YAAAA,kBAAAA;YACAU,qBAAAA,EAAuBC,GAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUR,OAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEN,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
@@ -13,6 +13,7 @@ var auditLogs$2 = require('./audit-logs/services/audit-logs.js');
13
13
  var lifecycles = require('./audit-logs/services/lifecycles.js');
14
14
  var auditLog = require('./audit-logs/content-types/audit-log.js');
15
15
  var auditLogExport = require('../../../shared/utils/audit-log-export.js');
16
+ var tokens = require('../../../server/src/audit-logs/tokens.js');
16
17
 
17
18
  const getAdminEE = ()=>{
18
19
  const eeAdmin = {
@@ -63,6 +64,7 @@ const getAdminEE = ()=>{
63
64
  filters: event?.filters ?? null
64
65
  }
65
66
  }));
67
+ tokens.registerTokenAuditEvents(auditLogsLifecycle);
66
68
  await auditLogsLifecycle.register();
67
69
  }
68
70
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,iBAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,kBAAAA,OAAAA;AACAC,qBAAAA,OAAAA;AACAC,gBAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,kCAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,0CAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,qCAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;AAGF,gBAAA,MAAMT,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,iBAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,kBAAAA,OAAAA;AACAC,qBAAAA,OAAAA;AACAC,gBAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,kCAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,0CAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,qCAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,+BAAAA,CAAyBV,kBAAAA,CAAAA;AAEzB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -11,6 +11,7 @@ import { createAuditLogsService } from './audit-logs/services/audit-logs.mjs';
11
11
  import { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles.mjs';
12
12
  import { auditLog } from './audit-logs/content-types/audit-log.mjs';
13
13
  import { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export.mjs';
14
+ import { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens.mjs';
14
15
 
15
16
  const getAdminEE = ()=>{
16
17
  const eeAdmin = {
@@ -61,6 +62,7 @@ const getAdminEE = ()=>{
61
62
  filters: event?.filters ?? null
62
63
  }
63
64
  }));
65
+ registerTokenAuditEvents(auditLogsLifecycle);
64
66
  await auditLogsLifecycle.register();
65
67
  }
66
68
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters"],"mappings":";;;;;;;;;;;;;;AAeA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,sBAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,sBAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;AAGF,gBAAA,MAAMT,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,sBAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,sBAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,wBAAAA,CAAyBV,kBAAAA,CAAAA;AAEzB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var ai = {
4
4
  async getAiToken (ctx) {
5
- if (strapi.ai.admin.isEnabled() === false) {
5
+ if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {
6
6
  return ctx.notFound();
7
7
  }
8
8
  try {
@@ -22,7 +22,7 @@ var ai = {
22
22
  }
23
23
  },
24
24
  async getAiUsage (ctx) {
25
- if (strapi.ai.admin.isEnabled() === false) {
25
+ if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {
26
26
  return ctx.notFound();
27
27
  }
28
28
  try {
@@ -33,7 +33,7 @@ var ai = {
33
33
  }
34
34
  },
35
35
  async getAiFeatureConfig (ctx) {
36
- if (strapi.ai.admin.isEnabled() === false) {
36
+ if (strapi.ai.admin.isAvailable() === false) {
37
37
  return ctx.notFound();
38
38
  }
39
39
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sources":["../../../../../../server/src/ai/controllers/ai.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { GetAiFeatureConfig, GetAiToken } from '../../../../shared/contracts/ai';\n\nexport default {\n async getAiToken(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n // `admin::isAuthenticatedAdmin` only checks `ctx.state.isAuthenticated`, not `ctx.state.user`.\n // With the current admin JWT strategy, a successful auth run always sets both; this handler\n // still requires `user` because `getAiToken()` needs an admin identity. Keeps us safe if the\n // strategy/policy contract ever diverges or this action is invoked outside the normal pipeline.\n if (!ctx.state.user) {\n return ctx.unauthorized('Authentication required');\n }\n\n const aiToken = await strapi.ai.admin.getAiToken();\n\n ctx.body = {\n data: aiToken,\n } satisfies GetAiToken.Response;\n } catch {\n return ctx.internalServerError('AI token request failed. Check server logs for details.');\n }\n },\n\n async getAiUsage(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const usage = await strapi.ai.admin.getAiUsage();\n ctx.body = usage;\n } catch {\n return ctx.internalServerError(\n 'AI usage data request failed. Check server logs for details.'\n );\n }\n },\n\n async getAiFeatureConfig(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const aiFeatureConfig = await strapi.ai.admin.getAiFeatureConfig();\n\n ctx.body = {\n data: aiFeatureConfig,\n } satisfies GetAiFeatureConfig.Response;\n } catch (error) {\n strapi.log.error('AI feature config request failed', error);\n return ctx.internalServerError(\n 'AI feature config request failed. Check server logs for details.'\n );\n }\n },\n};\n"],"names":["getAiToken","ctx","strapi","ai","admin","isEnabled","notFound","state","user","unauthorized","aiToken","body","data","internalServerError","getAiUsage","usage","getAiFeatureConfig","aiFeatureConfig","error","log"],"mappings":";;AAGA,SAAe;AACb,IAAA,MAAMA,YAAWC,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;;;;;AAKF,YAAA,IAAI,CAACL,GAAAA,CAAIM,KAAK,CAACC,IAAI,EAAE;gBACnB,OAAOP,GAAAA,CAAIQ,YAAY,CAAC,yBAAA,CAAA;AAC1B,YAAA;AAEA,YAAA,MAAMC,UAAU,MAAMR,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACJ,UAAU,EAAA;AAEhDC,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMF;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAOT,GAAAA,CAAIY,mBAAmB,CAAC,yDAAA,CAAA;AACjC,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,YAAWb,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMS,QAAQ,MAAMb,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACU,UAAU,EAAA;AAC9Cb,YAAAA,GAAAA,CAAIU,IAAI,GAAGI,KAAAA;AACb,QAAA,CAAA,CAAE,OAAM;YACN,OAAOd,GAAAA,CAAIY,mBAAmB,CAC5B,8DAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,oBAAmBf,GAAY,EAAA;AACnC,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMW,kBAAkB,MAAMf,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACY,kBAAkB,EAAA;AAEhEf,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMK;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdhB,YAAAA,MAAAA,CAAOiB,GAAG,CAACD,KAAK,CAAC,kCAAA,EAAoCA,KAAAA,CAAAA;YACrD,OAAOjB,GAAAA,CAAIY,mBAAmB,CAC5B,kEAAA,CAAA;AAEJ,QAAA;AACF,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"ai.js","sources":["../../../../../../server/src/ai/controllers/ai.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { GetAiFeatureConfig, GetAiToken } from '../../../../shared/contracts/ai';\n\nexport default {\n async getAiToken(ctx: Context) {\n if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n // `admin::isAuthenticatedAdmin` only checks `ctx.state.isAuthenticated`, not `ctx.state.user`.\n // With the current admin JWT strategy, a successful auth run always sets both; this handler\n // still requires `user` because `getAiToken()` needs an admin identity. Keeps us safe if the\n // strategy/policy contract ever diverges or this action is invoked outside the normal pipeline.\n if (!ctx.state.user) {\n return ctx.unauthorized('Authentication required');\n }\n\n const aiToken = await strapi.ai.admin.getAiToken();\n\n ctx.body = {\n data: aiToken,\n } satisfies GetAiToken.Response;\n } catch {\n return ctx.internalServerError('AI token request failed. Check server logs for details.');\n }\n },\n\n async getAiUsage(ctx: Context) {\n if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const usage = await strapi.ai.admin.getAiUsage();\n ctx.body = usage;\n } catch {\n return ctx.internalServerError(\n 'AI usage data request failed. Check server logs for details.'\n );\n }\n },\n\n async getAiFeatureConfig(ctx: Context) {\n if (strapi.ai.admin.isAvailable() === false) {\n return ctx.notFound();\n }\n\n try {\n const aiFeatureConfig = await strapi.ai.admin.getAiFeatureConfig();\n\n ctx.body = {\n data: aiFeatureConfig,\n } satisfies GetAiFeatureConfig.Response;\n } catch (error) {\n strapi.log.error('AI feature config request failed', error);\n return ctx.internalServerError(\n 'AI feature config request failed. Check server logs for details.'\n );\n }\n },\n};\n"],"names":["getAiToken","ctx","strapi","ai","admin","isStrapiManagedAiEnabled","notFound","state","user","unauthorized","aiToken","body","data","internalServerError","getAiUsage","usage","getAiFeatureConfig","isAvailable","aiFeatureConfig","error","log"],"mappings":";;AAGA,SAAe;AACb,IAAA,MAAMA,YAAWC,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,wBAAwB,OAAO,KAAA,EAAO;AACxD,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;;;;;AAKF,YAAA,IAAI,CAACL,GAAAA,CAAIM,KAAK,CAACC,IAAI,EAAE;gBACnB,OAAOP,GAAAA,CAAIQ,YAAY,CAAC,yBAAA,CAAA;AAC1B,YAAA;AAEA,YAAA,MAAMC,UAAU,MAAMR,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACJ,UAAU,EAAA;AAEhDC,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMF;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAOT,GAAAA,CAAIY,mBAAmB,CAAC,yDAAA,CAAA;AACjC,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,YAAWb,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,wBAAwB,OAAO,KAAA,EAAO;AACxD,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMS,QAAQ,MAAMb,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACU,UAAU,EAAA;AAC9Cb,YAAAA,GAAAA,CAAIU,IAAI,GAAGI,KAAAA;AACb,QAAA,CAAA,CAAE,OAAM;YACN,OAAOd,GAAAA,CAAIY,mBAAmB,CAC5B,8DAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,oBAAmBf,GAAY,EAAA;AACnC,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACa,WAAW,OAAO,KAAA,EAAO;AAC3C,YAAA,OAAOhB,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMY,kBAAkB,MAAMhB,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACY,kBAAkB,EAAA;AAEhEf,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMM;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdjB,YAAAA,MAAAA,CAAOkB,GAAG,CAACD,KAAK,CAAC,kCAAA,EAAoCA,KAAAA,CAAAA;YACrD,OAAOlB,GAAAA,CAAIY,mBAAmB,CAC5B,kEAAA,CAAA;AAEJ,QAAA;AACF,IAAA;AACF,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  var ai = {
2
2
  async getAiToken (ctx) {
3
- if (strapi.ai.admin.isEnabled() === false) {
3
+ if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {
4
4
  return ctx.notFound();
5
5
  }
6
6
  try {
@@ -20,7 +20,7 @@ var ai = {
20
20
  }
21
21
  },
22
22
  async getAiUsage (ctx) {
23
- if (strapi.ai.admin.isEnabled() === false) {
23
+ if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {
24
24
  return ctx.notFound();
25
25
  }
26
26
  try {
@@ -31,7 +31,7 @@ var ai = {
31
31
  }
32
32
  },
33
33
  async getAiFeatureConfig (ctx) {
34
- if (strapi.ai.admin.isEnabled() === false) {
34
+ if (strapi.ai.admin.isAvailable() === false) {
35
35
  return ctx.notFound();
36
36
  }
37
37
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/controllers/ai.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { GetAiFeatureConfig, GetAiToken } from '../../../../shared/contracts/ai';\n\nexport default {\n async getAiToken(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n // `admin::isAuthenticatedAdmin` only checks `ctx.state.isAuthenticated`, not `ctx.state.user`.\n // With the current admin JWT strategy, a successful auth run always sets both; this handler\n // still requires `user` because `getAiToken()` needs an admin identity. Keeps us safe if the\n // strategy/policy contract ever diverges or this action is invoked outside the normal pipeline.\n if (!ctx.state.user) {\n return ctx.unauthorized('Authentication required');\n }\n\n const aiToken = await strapi.ai.admin.getAiToken();\n\n ctx.body = {\n data: aiToken,\n } satisfies GetAiToken.Response;\n } catch {\n return ctx.internalServerError('AI token request failed. Check server logs for details.');\n }\n },\n\n async getAiUsage(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const usage = await strapi.ai.admin.getAiUsage();\n ctx.body = usage;\n } catch {\n return ctx.internalServerError(\n 'AI usage data request failed. Check server logs for details.'\n );\n }\n },\n\n async getAiFeatureConfig(ctx: Context) {\n if (strapi.ai.admin.isEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const aiFeatureConfig = await strapi.ai.admin.getAiFeatureConfig();\n\n ctx.body = {\n data: aiFeatureConfig,\n } satisfies GetAiFeatureConfig.Response;\n } catch (error) {\n strapi.log.error('AI feature config request failed', error);\n return ctx.internalServerError(\n 'AI feature config request failed. Check server logs for details.'\n );\n }\n },\n};\n"],"names":["getAiToken","ctx","strapi","ai","admin","isEnabled","notFound","state","user","unauthorized","aiToken","body","data","internalServerError","getAiUsage","usage","getAiFeatureConfig","aiFeatureConfig","error","log"],"mappings":"AAGA,SAAe;AACb,IAAA,MAAMA,YAAWC,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;;;;;AAKF,YAAA,IAAI,CAACL,GAAAA,CAAIM,KAAK,CAACC,IAAI,EAAE;gBACnB,OAAOP,GAAAA,CAAIQ,YAAY,CAAC,yBAAA,CAAA;AAC1B,YAAA;AAEA,YAAA,MAAMC,UAAU,MAAMR,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACJ,UAAU,EAAA;AAEhDC,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMF;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAOT,GAAAA,CAAIY,mBAAmB,CAAC,yDAAA,CAAA;AACjC,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,YAAWb,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMS,QAAQ,MAAMb,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACU,UAAU,EAAA;AAC9Cb,YAAAA,GAAAA,CAAIU,IAAI,GAAGI,KAAAA;AACb,QAAA,CAAA,CAAE,OAAM;YACN,OAAOd,GAAAA,CAAIY,mBAAmB,CAC5B,8DAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,oBAAmBf,GAAY,EAAA;AACnC,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,SAAS,OAAO,KAAA,EAAO;AACzC,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMW,kBAAkB,MAAMf,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACY,kBAAkB,EAAA;AAEhEf,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMK;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdhB,YAAAA,MAAAA,CAAOiB,GAAG,CAACD,KAAK,CAAC,kCAAA,EAAoCA,KAAAA,CAAAA;YACrD,OAAOjB,GAAAA,CAAIY,mBAAmB,CAC5B,kEAAA,CAAA;AAEJ,QAAA;AACF,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/controllers/ai.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { GetAiFeatureConfig, GetAiToken } from '../../../../shared/contracts/ai';\n\nexport default {\n async getAiToken(ctx: Context) {\n if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n // `admin::isAuthenticatedAdmin` only checks `ctx.state.isAuthenticated`, not `ctx.state.user`.\n // With the current admin JWT strategy, a successful auth run always sets both; this handler\n // still requires `user` because `getAiToken()` needs an admin identity. Keeps us safe if the\n // strategy/policy contract ever diverges or this action is invoked outside the normal pipeline.\n if (!ctx.state.user) {\n return ctx.unauthorized('Authentication required');\n }\n\n const aiToken = await strapi.ai.admin.getAiToken();\n\n ctx.body = {\n data: aiToken,\n } satisfies GetAiToken.Response;\n } catch {\n return ctx.internalServerError('AI token request failed. Check server logs for details.');\n }\n },\n\n async getAiUsage(ctx: Context) {\n if (strapi.ai.admin.isStrapiManagedAiEnabled() === false) {\n return ctx.notFound();\n }\n\n try {\n const usage = await strapi.ai.admin.getAiUsage();\n ctx.body = usage;\n } catch {\n return ctx.internalServerError(\n 'AI usage data request failed. Check server logs for details.'\n );\n }\n },\n\n async getAiFeatureConfig(ctx: Context) {\n if (strapi.ai.admin.isAvailable() === false) {\n return ctx.notFound();\n }\n\n try {\n const aiFeatureConfig = await strapi.ai.admin.getAiFeatureConfig();\n\n ctx.body = {\n data: aiFeatureConfig,\n } satisfies GetAiFeatureConfig.Response;\n } catch (error) {\n strapi.log.error('AI feature config request failed', error);\n return ctx.internalServerError(\n 'AI feature config request failed. Check server logs for details.'\n );\n }\n },\n};\n"],"names":["getAiToken","ctx","strapi","ai","admin","isStrapiManagedAiEnabled","notFound","state","user","unauthorized","aiToken","body","data","internalServerError","getAiUsage","usage","getAiFeatureConfig","isAvailable","aiFeatureConfig","error","log"],"mappings":"AAGA,SAAe;AACb,IAAA,MAAMA,YAAWC,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,wBAAwB,OAAO,KAAA,EAAO;AACxD,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;;;;;AAKF,YAAA,IAAI,CAACL,GAAAA,CAAIM,KAAK,CAACC,IAAI,EAAE;gBACnB,OAAOP,GAAAA,CAAIQ,YAAY,CAAC,yBAAA,CAAA;AAC1B,YAAA;AAEA,YAAA,MAAMC,UAAU,MAAMR,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACJ,UAAU,EAAA;AAEhDC,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMF;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAOT,GAAAA,CAAIY,mBAAmB,CAAC,yDAAA,CAAA;AACjC,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,YAAWb,GAAY,EAAA;AAC3B,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACC,wBAAwB,OAAO,KAAA,EAAO;AACxD,YAAA,OAAOJ,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMS,QAAQ,MAAMb,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACU,UAAU,EAAA;AAC9Cb,YAAAA,GAAAA,CAAIU,IAAI,GAAGI,KAAAA;AACb,QAAA,CAAA,CAAE,OAAM;YACN,OAAOd,GAAAA,CAAIY,mBAAmB,CAC5B,8DAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMG,oBAAmBf,GAAY,EAAA;AACnC,QAAA,IAAIC,OAAOC,EAAE,CAACC,KAAK,CAACa,WAAW,OAAO,KAAA,EAAO;AAC3C,YAAA,OAAOhB,IAAIK,QAAQ,EAAA;AACrB,QAAA;QAEA,IAAI;AACF,YAAA,MAAMY,kBAAkB,MAAMhB,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACY,kBAAkB,EAAA;AAEhEf,YAAAA,GAAAA,CAAIU,IAAI,GAAG;gBACTC,IAAAA,EAAMM;AACR,aAAA;AACF,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACdjB,YAAAA,MAAAA,CAAOkB,GAAG,CAACD,KAAK,CAAC,kCAAA,EAAoCA,KAAAA,CAAAA;YACrD,OAAOlB,GAAAA,CAAIY,mBAAmB,CAC5B,kEAAA,CAAA;AAEJ,QAAA;AACF,IAAA;AACF,CAAA;;;;"}
@@ -10,35 +10,57 @@ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
10
10
  var fs__default = /*#__PURE__*/_interopDefault(fs);
11
11
  var path__default = /*#__PURE__*/_interopDefault(path);
12
12
 
13
+ const STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';
14
+ const CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';
13
15
  const createAiAdminService = ({ strapi })=>{
14
16
  /**
15
17
  * In-memory cache for AI tokens
16
18
  * Key format: `${projectId}:${userId}`
17
19
  */ const aiTokenCache = new Map();
18
- const isEnabled = ()=>{
19
- const configEnabled = strapi.config.get('admin.ai.enabled', true) === true;
20
- const licenseEnabled = strapi.ee?.features?.isEnabled('cms-ai') === true;
21
- return configEnabled && licenseEnabled;
20
+ let isCustomProviderRejected = false;
21
+ const isConfigEnabled = ()=>strapi.config.get('admin.ai.enabled', true) === true;
22
+ const isAvailable = ()=>isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;
23
+ const isStrapiManagedAiEnabled = ()=>isConfigEnabled() && !isCustomProviderRejected && strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;
24
+ const authorizeCustomProvider = ()=>{
25
+ if (!isConfigEnabled()) {
26
+ strapi.log.info('A custom AI provider was ignored: AI is disabled by the "admin.ai.enabled" config.');
27
+ return false;
28
+ }
29
+ if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {
30
+ return true;
31
+ }
32
+ isCustomProviderRejected = true;
33
+ strapi.log.warn(`A custom AI provider was rejected: the Strapi license does not include the "${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}" feature. All AI features are disabled.`);
34
+ return false;
35
+ };
36
+ const isPluginAiFeatureConfigured = async (plugin, service)=>{
37
+ const aiService = strapi.plugin(plugin)?.service(service);
38
+ if (typeof aiService?.isEnabled !== 'function') {
39
+ return false;
40
+ }
41
+ return await aiService.isEnabled() === true;
22
42
  };
23
43
  const getAiFeatureConfig = async ()=>{
24
- if (!isEnabled()) {
44
+ if (!isAvailable()) {
25
45
  return {
26
46
  isAiI18nConfigured: false,
27
47
  isAiMediaLibraryConfigured: false
28
48
  };
29
49
  }
30
- const i18nSettings = await strapi.plugin('i18n').service('settings').getSettings();
31
- const uploadSettings = await strapi.plugin('upload').service('upload').getSettings();
50
+ const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([
51
+ isPluginAiFeatureConfigured('i18n', 'ai-localizations'),
52
+ isPluginAiFeatureConfigured('upload', 'aiMetadata')
53
+ ]);
32
54
  return {
33
- isAiI18nConfigured: Boolean(i18nSettings?.aiLocalizations),
34
- isAiMediaLibraryConfigured: Boolean(uploadSettings?.aiMetadata)
55
+ isAiI18nConfigured,
56
+ isAiMediaLibraryConfigured
35
57
  };
36
58
  };
37
59
  /**
38
60
  * Resolves the shared context required by both getAiToken and getAiUsage:
39
61
  * EE license, project ID, and AI server URL.
40
62
  */ const resolveAiContext = (errorPrefix)=>{
41
- if (!isEnabled()) {
63
+ if (!isStrapiManagedAiEnabled()) {
42
64
  strapi.log.error(`${errorPrefix} AI is not enabled`);
43
65
  throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);
44
66
  }
@@ -226,8 +248,11 @@ const createAiAdminService = ({ strapi })=>{
226
248
  }
227
249
  };
228
250
  return {
229
- isEnabled,
230
- getAiFeatureConfig,
251
+ /* Requires `ai.enabled=true` + license + no failed AI provider registration */ isAvailable,
252
+ /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.
253
+ TODO: once all AI features are migrated to the providers architecture, consider removing this flag */ isStrapiManagedAiEnabled,
254
+ authorizeCustomProvider,
255
+ /* Returns the status of each AI feature, flagging which are enabled. */ getAiFeatureConfig,
231
256
  getAiToken,
232
257
  getAiUsage
233
258
  };