@data-club/ai-hub 0.0.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/dist/auth/passwordPolicy.d.ts +55 -0
- package/dist/auth/passwordPolicy.d.ts.map +1 -0
- package/dist/auth/passwordPolicy.js +63 -0
- package/dist/auth/passwordPolicy.js.map +1 -0
- package/dist/auth/texts.d.ts +815 -0
- package/dist/auth/texts.d.ts.map +1 -0
- package/dist/auth/texts.js +429 -0
- package/dist/auth/texts.js.map +1 -0
- package/dist/client/AIHubClient.d.ts +1058 -0
- package/dist/client/AIHubClient.d.ts.map +1 -0
- package/dist/client/AIHubClient.js +950 -0
- package/dist/client/AIHubClient.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/sseParser.d.ts +41 -0
- package/dist/client/sseParser.d.ts.map +1 -0
- package/dist/client/sseParser.js +153 -0
- package/dist/client/sseParser.js.map +1 -0
- package/dist/client/tokenStorage.d.ts +56 -0
- package/dist/client/tokenStorage.d.ts.map +1 -0
- package/dist/client/tokenStorage.js +116 -0
- package/dist/client/tokenStorage.js.map +1 -0
- package/dist/components/AgentsPicker/index.d.ts +70 -0
- package/dist/components/AgentsPicker/index.d.ts.map +1 -0
- package/dist/components/AgentsPicker/index.js +63 -0
- package/dist/components/AgentsPicker/index.js.map +1 -0
- package/dist/components/AuthGate/index.d.ts +79 -0
- package/dist/components/AuthGate/index.d.ts.map +1 -0
- package/dist/components/AuthGate/index.js +61 -0
- package/dist/components/AuthGate/index.js.map +1 -0
- package/dist/components/CacheBadge/index.d.ts +88 -0
- package/dist/components/CacheBadge/index.d.ts.map +1 -0
- package/dist/components/CacheBadge/index.js +127 -0
- package/dist/components/CacheBadge/index.js.map +1 -0
- package/dist/components/ChangePassword/index.d.ts +109 -0
- package/dist/components/ChangePassword/index.d.ts.map +1 -0
- package/dist/components/ChangePassword/index.js +142 -0
- package/dist/components/ChangePassword/index.js.map +1 -0
- package/dist/components/ChatShell/ShellHeader.d.ts +44 -0
- package/dist/components/ChatShell/ShellHeader.d.ts.map +1 -0
- package/dist/components/ChatShell/ShellHeader.js +14 -0
- package/dist/components/ChatShell/ShellHeader.js.map +1 -0
- package/dist/components/ChatShell/UserMenu.d.ts +48 -0
- package/dist/components/ChatShell/UserMenu.d.ts.map +1 -0
- package/dist/components/ChatShell/UserMenu.js +86 -0
- package/dist/components/ChatShell/UserMenu.js.map +1 -0
- package/dist/components/ChatShell/index.d.ts +98 -0
- package/dist/components/ChatShell/index.d.ts.map +1 -0
- package/dist/components/ChatShell/index.js +124 -0
- package/dist/components/ChatShell/index.js.map +1 -0
- package/dist/components/DataClubAIHub/index.d.ts +132 -0
- package/dist/components/DataClubAIHub/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHub/index.js +124 -0
- package/dist/components/DataClubAIHub/index.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts +89 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js +199 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts +33 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.js +137 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts +50 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.js +93 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts +49 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js +94 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts +37 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js +44 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts +56 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js +158 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts +29 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js +183 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts +38 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js +294 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts +36 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.js +373 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts +47 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.js +233 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/index.d.ts +87 -0
- package/dist/components/DataClubAIHubAdmin/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/index.js +137 -0
- package/dist/components/DataClubAIHubAdmin/index.js.map +1 -0
- package/dist/components/DataClubAIHubLogin/index.d.ts +113 -0
- package/dist/components/DataClubAIHubLogin/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHubLogin/index.js +123 -0
- package/dist/components/DataClubAIHubLogin/index.js.map +1 -0
- package/dist/components/EffortControl/index.d.ts +57 -0
- package/dist/components/EffortControl/index.d.ts.map +1 -0
- package/dist/components/EffortControl/index.js +84 -0
- package/dist/components/EffortControl/index.js.map +1 -0
- package/dist/components/Layout/index.d.ts +63 -0
- package/dist/components/Layout/index.d.ts.map +1 -0
- package/dist/components/Layout/index.js +45 -0
- package/dist/components/Layout/index.js.map +1 -0
- package/dist/components/MainColumn/index.d.ts +69 -0
- package/dist/components/MainColumn/index.d.ts.map +1 -0
- package/dist/components/MainColumn/index.js +47 -0
- package/dist/components/MainColumn/index.js.map +1 -0
- package/dist/components/MarkdownRenderer/index.d.ts +66 -0
- package/dist/components/MarkdownRenderer/index.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer/index.js +153 -0
- package/dist/components/MarkdownRenderer/index.js.map +1 -0
- package/dist/components/MessageInput/index.d.ts +85 -0
- package/dist/components/MessageInput/index.d.ts.map +1 -0
- package/dist/components/MessageInput/index.js +139 -0
- package/dist/components/MessageInput/index.js.map +1 -0
- package/dist/components/MessageList/index.d.ts +156 -0
- package/dist/components/MessageList/index.d.ts.map +1 -0
- package/dist/components/MessageList/index.js +352 -0
- package/dist/components/MessageList/index.js.map +1 -0
- package/dist/components/ReasoningSelector/index.d.ts +77 -0
- package/dist/components/ReasoningSelector/index.d.ts.map +1 -0
- package/dist/components/ReasoningSelector/index.js +156 -0
- package/dist/components/ReasoningSelector/index.js.map +1 -0
- package/dist/components/ReasoningView/index.d.ts +94 -0
- package/dist/components/ReasoningView/index.d.ts.map +1 -0
- package/dist/components/ReasoningView/index.js +83 -0
- package/dist/components/ReasoningView/index.js.map +1 -0
- package/dist/components/ScrollToPresentButton/index.d.ts +54 -0
- package/dist/components/ScrollToPresentButton/index.d.ts.map +1 -0
- package/dist/components/ScrollToPresentButton/index.js +44 -0
- package/dist/components/ScrollToPresentButton/index.js.map +1 -0
- package/dist/components/SessionsPanel/SessionTitleModal.d.ts +79 -0
- package/dist/components/SessionsPanel/SessionTitleModal.d.ts.map +1 -0
- package/dist/components/SessionsPanel/SessionTitleModal.js +102 -0
- package/dist/components/SessionsPanel/SessionTitleModal.js.map +1 -0
- package/dist/components/SessionsPanel/index.d.ts +100 -0
- package/dist/components/SessionsPanel/index.d.ts.map +1 -0
- package/dist/components/SessionsPanel/index.js +176 -0
- package/dist/components/SessionsPanel/index.js.map +1 -0
- package/dist/components/SystemNotice/index.d.ts +66 -0
- package/dist/components/SystemNotice/index.d.ts.map +1 -0
- package/dist/components/SystemNotice/index.js +81 -0
- package/dist/components/SystemNotice/index.js.map +1 -0
- package/dist/components/ThemeSwitcher/index.d.ts +66 -0
- package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
- package/dist/components/ThemeSwitcher/index.js +73 -0
- package/dist/components/ThemeSwitcher/index.js.map +1 -0
- package/dist/components/ToolCallView/formatContent.d.ts +36 -0
- package/dist/components/ToolCallView/formatContent.d.ts.map +1 -0
- package/dist/components/ToolCallView/formatContent.js +53 -0
- package/dist/components/ToolCallView/formatContent.js.map +1 -0
- package/dist/components/ToolCallView/index.d.ts +120 -0
- package/dist/components/ToolCallView/index.d.ts.map +1 -0
- package/dist/components/ToolCallView/index.js +104 -0
- package/dist/components/ToolCallView/index.js.map +1 -0
- package/dist/components/TpmBanner/index.d.ts +53 -0
- package/dist/components/TpmBanner/index.d.ts.map +1 -0
- package/dist/components/TpmBanner/index.js +116 -0
- package/dist/components/TpmBanner/index.js.map +1 -0
- package/dist/components/TurnStatusIndicator/index.d.ts +77 -0
- package/dist/components/TurnStatusIndicator/index.d.ts.map +1 -0
- package/dist/components/TurnStatusIndicator/index.js +122 -0
- package/dist/components/TurnStatusIndicator/index.js.map +1 -0
- package/dist/components/internal/PasswordInput.d.ts +62 -0
- package/dist/components/internal/PasswordInput.d.ts.map +1 -0
- package/dist/components/internal/PasswordInput.js +42 -0
- package/dist/components/internal/PasswordInput.js.map +1 -0
- package/dist/context/AIHubContext.d.ts +220 -0
- package/dist/context/AIHubContext.d.ts.map +1 -0
- package/dist/context/AIHubContext.js +19 -0
- package/dist/context/AIHubContext.js.map +1 -0
- package/dist/context/AIHubProvider.d.ts +75 -0
- package/dist/context/AIHubProvider.d.ts.map +1 -0
- package/dist/context/AIHubProvider.js +954 -0
- package/dist/context/AIHubProvider.js.map +1 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/theme.d.ts +43 -0
- package/dist/context/theme.d.ts.map +1 -0
- package/dist/context/theme.js +70 -0
- package/dist/context/theme.js.map +1 -0
- package/dist/context/useAIHub.d.ts +104 -0
- package/dist/context/useAIHub.d.ts.map +1 -0
- package/dist/context/useAIHub.js +63 -0
- package/dist/context/useAIHub.js.map +1 -0
- package/dist/context/useAIHubAuth.d.ts +44 -0
- package/dist/context/useAIHubAuth.d.ts.map +1 -0
- package/dist/context/useAIHubAuth.js +35 -0
- package/dist/context/useAIHubAuth.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/index.d.ts +99 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +97 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/state/affordances.d.ts +182 -0
- package/dist/state/affordances.d.ts.map +1 -0
- package/dist/state/affordances.js +189 -0
- package/dist/state/affordances.js.map +1 -0
- package/dist/state/stateReducer.d.ts +72 -0
- package/dist/state/stateReducer.d.ts.map +1 -0
- package/dist/state/stateReducer.js +122 -0
- package/dist/state/stateReducer.js.map +1 -0
- package/dist/stories/EffortControl.stories.d.ts +14 -0
- package/dist/stories/EffortControl.stories.d.ts.map +1 -0
- package/dist/stories/EffortControl.stories.js +43 -0
- package/dist/stories/EffortControl.stories.js.map +1 -0
- package/dist/stories/MarkdownRenderer.stories.d.ts +25 -0
- package/dist/stories/MarkdownRenderer.stories.d.ts.map +1 -0
- package/dist/stories/MarkdownRenderer.stories.js +178 -0
- package/dist/stories/MarkdownRenderer.stories.js.map +1 -0
- package/dist/stories/MessageBubble.stories.d.ts +21 -0
- package/dist/stories/MessageBubble.stories.d.ts.map +1 -0
- package/dist/stories/MessageBubble.stories.js +59 -0
- package/dist/stories/MessageBubble.stories.js.map +1 -0
- package/dist/stories/ReasoningView.stories.d.ts +18 -0
- package/dist/stories/ReasoningView.stories.d.ts.map +1 -0
- package/dist/stories/ReasoningView.stories.js +62 -0
- package/dist/stories/ReasoningView.stories.js.map +1 -0
- package/dist/stories/ScrollToPresentButton.stories.d.ts +18 -0
- package/dist/stories/ScrollToPresentButton.stories.d.ts.map +1 -0
- package/dist/stories/ScrollToPresentButton.stories.js +34 -0
- package/dist/stories/ScrollToPresentButton.stories.js.map +1 -0
- package/dist/stories/SystemNotice.stories.d.ts +17 -0
- package/dist/stories/SystemNotice.stories.d.ts.map +1 -0
- package/dist/stories/SystemNotice.stories.js +42 -0
- package/dist/stories/SystemNotice.stories.js.map +1 -0
- package/dist/stories/ThemeSwitcher.stories.d.ts +15 -0
- package/dist/stories/ThemeSwitcher.stories.d.ts.map +1 -0
- package/dist/stories/ThemeSwitcher.stories.js +35 -0
- package/dist/stories/ThemeSwitcher.stories.js.map +1 -0
- package/dist/stories/ToolCallView.stories.d.ts +20 -0
- package/dist/stories/ToolCallView.stories.d.ts.map +1 -0
- package/dist/stories/ToolCallView.stories.js +65 -0
- package/dist/stories/ToolCallView.stories.js.map +1 -0
- package/dist/stories/TpmBanner.stories.d.ts +24 -0
- package/dist/stories/TpmBanner.stories.d.ts.map +1 -0
- package/dist/stories/TpmBanner.stories.js +63 -0
- package/dist/stories/TpmBanner.stories.js.map +1 -0
- package/dist/stories/TurnStatusIndicator.stories.d.ts +25 -0
- package/dist/stories/TurnStatusIndicator.stories.d.ts.map +1 -0
- package/dist/stories/TurnStatusIndicator.stories.js +56 -0
- package/dist/stories/TurnStatusIndicator.stories.js.map +1 -0
- package/dist/stories/_mockProvider.d.ts +44 -0
- package/dist/stories/_mockProvider.d.ts.map +1 -0
- package/dist/stories/_mockProvider.js +84 -0
- package/dist/stories/_mockProvider.js.map +1 -0
- package/dist/types.d.ts +787 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/webcomponent/defineWebComponent.d.ts +106 -0
- package/dist/webcomponent/defineWebComponent.d.ts.map +1 -0
- package/dist/webcomponent/defineWebComponent.js +126 -0
- package/dist/webcomponent/defineWebComponent.js.map +1 -0
- package/dist/webcomponent/index.d.ts +7 -0
- package/dist/webcomponent/index.d.ts.map +1 -0
- package/dist/webcomponent/index.js +7 -0
- package/dist/webcomponent/index.js.map +1 -0
- package/package.json +63 -0
- package/src/__lint-canary__/step1-lint-canary.ts.disabled +28 -0
- package/src/auth/passwordPolicy.ts +75 -0
- package/src/auth/texts.ts +1294 -0
- package/src/client/AIHubClient.ts +1718 -0
- package/src/client/index.ts +30 -0
- package/src/client/sseParser.ts +168 -0
- package/src/client/tokenStorage.ts +131 -0
- package/src/components/AgentsPicker/index.tsx +147 -0
- package/src/components/AuthGate/index.tsx +132 -0
- package/src/components/CacheBadge/index.tsx +245 -0
- package/src/components/ChangePassword/index.tsx +375 -0
- package/src/components/ChatShell/ShellHeader.tsx +80 -0
- package/src/components/ChatShell/UserMenu.tsx +196 -0
- package/src/components/ChatShell/index.tsx +307 -0
- package/src/components/DataClubAIHub/index.tsx +300 -0
- package/src/components/DataClubAIHubAdmin/AgentEditorModal.tsx +505 -0
- package/src/components/DataClubAIHubAdmin/AgentsPage.tsx +342 -0
- package/src/components/DataClubAIHubAdmin/CreateUserModal.tsx +214 -0
- package/src/components/DataClubAIHubAdmin/PasswordRevealModal.tsx +204 -0
- package/src/components/DataClubAIHubAdmin/ResetPasswordModal.tsx +122 -0
- package/src/components/DataClubAIHubAdmin/RotatingMessageEditorModal.tsx +408 -0
- package/src/components/DataClubAIHubAdmin/RotatingMessagesPage.tsx +373 -0
- package/src/components/DataClubAIHubAdmin/SessionsOverviewPage.tsx +639 -0
- package/src/components/DataClubAIHubAdmin/SettingsPage.tsx +979 -0
- package/src/components/DataClubAIHubAdmin/UsersPage.tsx +495 -0
- package/src/components/DataClubAIHubAdmin/index.tsx +277 -0
- package/src/components/DataClubAIHubLogin/index.tsx +282 -0
- package/src/components/EffortControl/index.tsx +138 -0
- package/src/components/Layout/index.tsx +92 -0
- package/src/components/MainColumn/index.tsx +131 -0
- package/src/components/MarkdownRenderer/index.tsx +256 -0
- package/src/components/MessageInput/index.tsx +283 -0
- package/src/components/MessageList/index.tsx +753 -0
- package/src/components/ReasoningSelector/index.tsx +268 -0
- package/src/components/ReasoningView/index.tsx +183 -0
- package/src/components/ScrollToPresentButton/index.tsx +85 -0
- package/src/components/SessionsPanel/SessionTitleModal.tsx +256 -0
- package/src/components/SessionsPanel/index.tsx +406 -0
- package/src/components/SystemNotice/index.tsx +151 -0
- package/src/components/ThemeSwitcher/index.tsx +136 -0
- package/src/components/ToolCallView/formatContent.ts +50 -0
- package/src/components/ToolCallView/index.tsx +274 -0
- package/src/components/TpmBanner/index.tsx +172 -0
- package/src/components/TurnStatusIndicator/index.tsx +203 -0
- package/src/components/internal/PasswordInput.tsx +145 -0
- package/src/context/AIHubContext.ts +249 -0
- package/src/context/AIHubProvider.tsx +1084 -0
- package/src/context/index.ts +9 -0
- package/src/context/theme.ts +76 -0
- package/src/context/useAIHub.ts +151 -0
- package/src/context/useAIHubAuth.ts +65 -0
- package/src/index.ts +275 -0
- package/src/primitives/index.ts +101 -0
- package/src/state/affordances.ts +321 -0
- package/src/state/stateReducer.ts +131 -0
- package/src/stories/EffortControl.stories.tsx +63 -0
- package/src/stories/MarkdownRenderer.stories.tsx +201 -0
- package/src/stories/MessageBubble.stories.tsx +101 -0
- package/src/stories/ReasoningView.stories.tsx +81 -0
- package/src/stories/ScrollToPresentButton.stories.tsx +52 -0
- package/src/stories/SystemNotice.stories.tsx +59 -0
- package/src/stories/ThemeSwitcher.stories.tsx +55 -0
- package/src/stories/ToolCallView.stories.tsx +95 -0
- package/src/stories/TpmBanner.stories.tsx +93 -0
- package/src/stories/TurnStatusIndicator.stories.tsx +86 -0
- package/src/stories/_mockProvider.tsx +116 -0
- package/src/styles/CLASSES.md +356 -0
- package/src/styles/default.css +2937 -0
- package/src/types.ts +867 -0
- package/src/webcomponent/defineWebComponent.tsx +193 -0
- package/src/webcomponent/index.ts +11 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<AdminSettingsPage />` — the super_admin-only Settings sub-page mounted
|
|
4
|
+
* inside `<DataClubAIHubAdmin />` ([08-admin-settings.md]).
|
|
5
|
+
*
|
|
6
|
+
* Five independent sections, each with its own Save button — per the spec,
|
|
7
|
+
* "Don't make the user save all five sections together":
|
|
8
|
+
*
|
|
9
|
+
* 1. **Letta connection** — base URL, ADE URL, API key (masked + replaceable).
|
|
10
|
+
* 2. **Theme** — default theme + switcher-enabled checkbox.
|
|
11
|
+
* 3. **UI feature toggles** — the §8.4 toggle blob.
|
|
12
|
+
* 4. **Signing key** — rotate with `ROTATE`-typing friction. Rotating
|
|
13
|
+
* invalidates every JWT, including the calling super-admin's.
|
|
14
|
+
* 5. **Metrics scrape token** — rotate with the same friction. The new token
|
|
15
|
+
* is shown ONCE via a reveal modal; subsequent settings reads no longer
|
|
16
|
+
* expose it. Does NOT invalidate the calling JWT.
|
|
17
|
+
*
|
|
18
|
+
* Each section owns its own dirty-state and save handler; sibling sections
|
|
19
|
+
* never share state. This means a half-typed Letta URL won't be pushed when
|
|
20
|
+
* the admin clicks `Save toggles` in a different section.
|
|
21
|
+
*
|
|
22
|
+
* Visible to `super_admin` only — the parent shell hides the nav item for
|
|
23
|
+
* other roles and the server returns 403 for any other caller.
|
|
24
|
+
*
|
|
25
|
+
* @see SPECIFICATIONS.md §6.3.4 / §8.3 / §8.4 / §6.7 / §6.10
|
|
26
|
+
* @see ui-sketches/08-admin-settings.md
|
|
27
|
+
*/
|
|
28
|
+
import { useEffect, useState } from "react";
|
|
29
|
+
import { useAIHub } from "../../context/useAIHub.js";
|
|
30
|
+
import { useAIHubAuth } from "../../context/useAIHubAuth.js";
|
|
31
|
+
/** All feature-toggle keys per §8.4. */
|
|
32
|
+
const ALL_TOGGLE_KEYS = [
|
|
33
|
+
"sessions_panel_enabled",
|
|
34
|
+
"sessions_panel_resizable",
|
|
35
|
+
"sessions_panel_collapsible",
|
|
36
|
+
"create_session_button_enabled",
|
|
37
|
+
"user_input_enabled",
|
|
38
|
+
"stop_button_enabled",
|
|
39
|
+
"tool_calls_visible",
|
|
40
|
+
"reasoning_visible",
|
|
41
|
+
"system_messages_visible",
|
|
42
|
+
"tpm_notice_visible",
|
|
43
|
+
"effort_control_visible",
|
|
44
|
+
"scroll_to_present_visible",
|
|
45
|
+
"turn_status_visible",
|
|
46
|
+
];
|
|
47
|
+
/** Toggles grouped by the §8.4 visual grouping (purely organizational). */
|
|
48
|
+
const TOGGLE_GROUPS = [
|
|
49
|
+
{
|
|
50
|
+
groupLabelKey: "settingsTogglesGroupSessions",
|
|
51
|
+
keys: [
|
|
52
|
+
"sessions_panel_enabled",
|
|
53
|
+
"sessions_panel_resizable",
|
|
54
|
+
"sessions_panel_collapsible",
|
|
55
|
+
"create_session_button_enabled",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
groupLabelKey: "settingsTogglesGroupInput",
|
|
60
|
+
keys: ["user_input_enabled", "effort_control_visible"],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
groupLabelKey: "settingsTogglesGroupAffordances",
|
|
64
|
+
keys: [
|
|
65
|
+
"stop_button_enabled",
|
|
66
|
+
"tool_calls_visible",
|
|
67
|
+
"reasoning_visible",
|
|
68
|
+
"system_messages_visible",
|
|
69
|
+
"tpm_notice_visible",
|
|
70
|
+
"scroll_to_present_visible",
|
|
71
|
+
"turn_status_visible",
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
/** Toggle defaults — every toggle is on by default per §8.4. */
|
|
76
|
+
function defaultToggleValue() {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
/** Format ISO date as `YYYY-MM-DD (N days ago)`. */
|
|
80
|
+
function formatRotationStamp(iso) {
|
|
81
|
+
if (iso === null)
|
|
82
|
+
return null;
|
|
83
|
+
const ts = Date.parse(iso);
|
|
84
|
+
if (Number.isNaN(ts))
|
|
85
|
+
return iso;
|
|
86
|
+
const dateOnly = new Date(ts).toISOString().slice(0, 10);
|
|
87
|
+
const diffDays = Math.floor((Date.now() - ts) / (24 * 60 * 60 * 1000));
|
|
88
|
+
if (diffDays <= 0)
|
|
89
|
+
return `${dateOnly} (today)`;
|
|
90
|
+
if (diffDays === 1)
|
|
91
|
+
return `${dateOnly} (1 day ago)`;
|
|
92
|
+
return `${dateOnly} (${diffDays} days ago)`;
|
|
93
|
+
}
|
|
94
|
+
/** Renders the Settings sub-page. */
|
|
95
|
+
export function AdminSettingsPage(props) {
|
|
96
|
+
const { client } = useAIHub();
|
|
97
|
+
const [settings, setSettings] = useState(null);
|
|
98
|
+
const [loadError, setLoadError] = useState(null);
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
let cancelled = false;
|
|
101
|
+
void (async () => {
|
|
102
|
+
try {
|
|
103
|
+
const result = await client.getAdminSettings();
|
|
104
|
+
if (!cancelled) {
|
|
105
|
+
setSettings(result);
|
|
106
|
+
setLoadError(null);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (!cancelled) {
|
|
111
|
+
setLoadError(err instanceof Error && err.message.length > 0
|
|
112
|
+
? err.message
|
|
113
|
+
: props.texts.settingsGenericError);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
})();
|
|
117
|
+
return () => {
|
|
118
|
+
cancelled = true;
|
|
119
|
+
};
|
|
120
|
+
}, [client, props.texts.settingsGenericError]);
|
|
121
|
+
function handleSectionSaved(next) {
|
|
122
|
+
setSettings(next);
|
|
123
|
+
}
|
|
124
|
+
return (_jsxs("div", { className: "data-club-ai-hub-admin__settings-page", "data-testid": "admin-settings-page", children: [_jsx("header", { className: "data-club-ai-hub-admin__page-header", children: _jsx("h1", { className: "data-club-ai-hub-admin__page-heading", "data-testid": "admin-settings-heading", children: props.texts.settingsHeading }) }), loadError !== null ? (_jsx("div", { className: "data-club-ai-hub-admin__error", role: "alert", "data-testid": "admin-settings-error", children: loadError })) : null, settings === null && loadError === null ? (_jsx("p", { className: "data-club-ai-hub-admin__loading", "data-testid": "admin-settings-loading", children: props.texts.settingsLoading })) : null, settings !== null ? (_jsxs(_Fragment, { children: [_jsx(LettaConnectionSection, { settings: settings, texts: props.texts, onSaved: handleSectionSaved }), _jsx(ThemeSection, { settings: settings, texts: props.texts, onSaved: handleSectionSaved }), _jsx(FeatureTogglesSection, { settings: settings, texts: props.texts, onSaved: (toggles) => handleSectionSaved({ ...settings, feature_toggles: toggles }) }), _jsx(SigningKeySection, { settings: settings, texts: props.texts, onRotated: (rotatedAt) => handleSectionSaved({
|
|
125
|
+
...settings,
|
|
126
|
+
signing_key_rotated_at: rotatedAt,
|
|
127
|
+
}) }), _jsx(MetricsTokenSection, { settings: settings, texts: props.texts, onRotated: (rotatedAt) => handleSectionSaved({
|
|
128
|
+
...settings,
|
|
129
|
+
metrics_scrape_token_rotated_at: rotatedAt,
|
|
130
|
+
}) })] })) : null] }));
|
|
131
|
+
}
|
|
132
|
+
function LettaConnectionSection(props) {
|
|
133
|
+
const { client } = useAIHub();
|
|
134
|
+
const [baseUrl, setBaseUrl] = useState(props.settings.letta_base_url ?? "");
|
|
135
|
+
const [adeUrl, setAdeUrl] = useState(props.settings.letta_ade_url ?? "");
|
|
136
|
+
// Empty string = leave-as-is; non-empty = replace.
|
|
137
|
+
const [apiKey, setApiKey] = useState("");
|
|
138
|
+
const [saving, setSaving] = useState(false);
|
|
139
|
+
const [flash, setFlash] = useState(null);
|
|
140
|
+
async function handleSave(event) {
|
|
141
|
+
event.preventDefault();
|
|
142
|
+
setSaving(true);
|
|
143
|
+
setFlash(null);
|
|
144
|
+
try {
|
|
145
|
+
const body = {};
|
|
146
|
+
// Compare against current to avoid stomping the existing value with the
|
|
147
|
+
// identical one. The server treats null + value identically, but the
|
|
148
|
+
// schema forbids `null + ""` so we coerce explicitly.
|
|
149
|
+
if (baseUrl !== (props.settings.letta_base_url ?? "")) {
|
|
150
|
+
body.lettaBaseUrl = baseUrl === "" ? null : baseUrl;
|
|
151
|
+
}
|
|
152
|
+
if (adeUrl !== (props.settings.letta_ade_url ?? "")) {
|
|
153
|
+
body.lettaAdeUrl = adeUrl === "" ? null : adeUrl;
|
|
154
|
+
}
|
|
155
|
+
if (apiKey !== "")
|
|
156
|
+
body.lettaApiKey = apiKey;
|
|
157
|
+
const next = await client.patchAdminSettings(body);
|
|
158
|
+
props.onSaved(next);
|
|
159
|
+
setApiKey("");
|
|
160
|
+
setFlash({ tone: "success", text: props.texts.settingsSaveSuccessFlash });
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
setFlash({
|
|
164
|
+
tone: "error",
|
|
165
|
+
text: err instanceof Error && err.message.length > 0
|
|
166
|
+
? err.message
|
|
167
|
+
: props.texts.settingsSaveGenericError,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
setSaving(false);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Clears the DB column (sends `letta_api_key: ""`), which makes the
|
|
175
|
+
// server fall back to env.LETTA_API_KEY at runtime per the
|
|
176
|
+
// resolveApiKey precedence in letta/client.ts. Same code path as the
|
|
177
|
+
// base/ADE URL nulling — only it targets the API-key column.
|
|
178
|
+
async function handleClearApiKeyOverride() {
|
|
179
|
+
setSaving(true);
|
|
180
|
+
setFlash(null);
|
|
181
|
+
try {
|
|
182
|
+
const next = await client.patchAdminSettings({ lettaApiKey: "" });
|
|
183
|
+
props.onSaved(next);
|
|
184
|
+
setFlash({ tone: "success", text: props.texts.settingsSaveSuccessFlash });
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
setFlash({
|
|
188
|
+
tone: "error",
|
|
189
|
+
text: err instanceof Error && err.message.length > 0
|
|
190
|
+
? err.message
|
|
191
|
+
: props.texts.settingsSaveGenericError,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
setSaving(false);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return (_jsxs("section", { className: "data-club-ai-hub-admin__settings-section", "data-testid": "admin-settings-letta-section", children: [_jsx("h2", { className: "data-club-ai-hub-admin__settings-section-heading", children: props.texts.settingsLettaSectionHeading }), _jsxs("form", { onSubmit: (event) => void handleSave(event), noValidate: true, children: [_jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsLettaBaseUrlLabel }), _jsx("input", { type: "url", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-settings-letta-base-url", value: baseUrl, onChange: (event) => setBaseUrl(event.target.value), disabled: saving })] }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsLettaAdeUrlLabel }), _jsx("input", { type: "url", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-settings-letta-ade-url", value: adeUrl, onChange: (event) => setAdeUrl(event.target.value), disabled: saving }), _jsx("span", { className: "data-club-ai-hub-admin__form-helper", children: props.texts.settingsLettaAdeUrlHelper })] }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsLettaApiKeyLabel }), _jsx("input", { type: "password", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-settings-letta-api-key", value: apiKey, placeholder: props.settings.letta_api_key_source === "db"
|
|
199
|
+
? props.texts.settingsLettaApiKeyPlaceholder
|
|
200
|
+
: "", onChange: (event) => setApiKey(event.target.value), disabled: saving, autoComplete: "new-password" }), _jsx("span", { className: "data-club-ai-hub-admin__form-helper", "data-testid": "admin-settings-letta-api-key-helper", "data-source": props.settings.letta_api_key_source, children: props.settings.letta_api_key_source === "db"
|
|
201
|
+
? props.texts.settingsLettaApiKeyDbHelper
|
|
202
|
+
: props.settings.letta_api_key_source === "env"
|
|
203
|
+
? props.texts.settingsLettaApiKeyEnvHelper
|
|
204
|
+
: props.texts.settingsLettaApiKeyNoneHelper }), props.settings.letta_api_key_source === "db" ? (_jsx("button", { type: "button", className: "data-club-ai-hub-admin__button", "data-testid": "admin-settings-letta-api-key-clear", onClick: () => void handleClearApiKeyOverride(), disabled: saving, children: props.texts.settingsLettaApiKeyClearOverrideButton })) : null] }), flash !== null ? (_jsx("div", { className: flash.tone === "success"
|
|
205
|
+
? "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--success"
|
|
206
|
+
: "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--error", "data-testid": "admin-settings-letta-flash", role: flash.tone === "error" ? "alert" : "status", children: flash.text })) : null, _jsx("button", { type: "submit", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-settings-letta-save", disabled: saving, children: saving
|
|
207
|
+
? props.texts.settingsSaveSavingButton
|
|
208
|
+
: props.texts.settingsSaveLettaButton })] })] }));
|
|
209
|
+
}
|
|
210
|
+
function ThemeSection(props) {
|
|
211
|
+
const { client } = useAIHub();
|
|
212
|
+
const [themeDefault, setThemeDefault] = useState(props.settings.theme.default);
|
|
213
|
+
const [switcherEnabled, setSwitcherEnabled] = useState(props.settings.theme.switcher_enabled);
|
|
214
|
+
const [saving, setSaving] = useState(false);
|
|
215
|
+
const [flash, setFlash] = useState(null);
|
|
216
|
+
async function handleSave(event) {
|
|
217
|
+
event.preventDefault();
|
|
218
|
+
setSaving(true);
|
|
219
|
+
setFlash(null);
|
|
220
|
+
try {
|
|
221
|
+
const next = await client.patchAdminSettings({
|
|
222
|
+
theme: { default: themeDefault, switcherEnabled },
|
|
223
|
+
});
|
|
224
|
+
props.onSaved(next);
|
|
225
|
+
setFlash({ tone: "success", text: props.texts.settingsSaveSuccessFlash });
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
setFlash({
|
|
229
|
+
tone: "error",
|
|
230
|
+
text: err instanceof Error && err.message.length > 0
|
|
231
|
+
? err.message
|
|
232
|
+
: props.texts.settingsSaveGenericError,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
setSaving(false);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return (_jsxs("section", { className: "data-club-ai-hub-admin__settings-section", "data-testid": "admin-settings-theme-section", children: [_jsx("h2", { className: "data-club-ai-hub-admin__settings-section-heading", children: props.texts.settingsThemeSectionHeading }), _jsxs("form", { onSubmit: (event) => void handleSave(event), noValidate: true, children: [_jsxs("fieldset", { className: "data-club-ai-hub-admin__radio-group", children: [_jsx("legend", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsThemeDefaultLabel }), _jsxs("label", { className: "data-club-ai-hub-admin__radio", children: [_jsx("input", { type: "radio", name: "theme-default", value: "light", "data-testid": "admin-settings-theme-default-light", checked: themeDefault === "light", onChange: () => setThemeDefault("light"), disabled: saving }), _jsx("span", { children: props.texts.settingsThemeDefaultLight })] }), _jsxs("label", { className: "data-club-ai-hub-admin__radio", children: [_jsx("input", { type: "radio", name: "theme-default", value: "dark", "data-testid": "admin-settings-theme-default-dark", checked: themeDefault === "dark", onChange: () => setThemeDefault("dark"), disabled: saving }), _jsx("span", { children: props.texts.settingsThemeDefaultDark })] })] }), _jsxs("label", { className: "data-club-ai-hub-admin__checkbox", children: [_jsx("input", { type: "checkbox", "data-testid": "admin-settings-theme-switcher-enabled", checked: switcherEnabled, onChange: (event) => setSwitcherEnabled(event.target.checked), disabled: saving }), _jsx("span", { children: props.texts.settingsThemeSwitcherEnabledLabel })] }), _jsx("p", { className: "data-club-ai-hub-admin__form-helper", children: props.texts.settingsThemeSwitcherEnabledHelper }), flash !== null ? (_jsx("div", { className: flash.tone === "success"
|
|
240
|
+
? "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--success"
|
|
241
|
+
: "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--error", "data-testid": "admin-settings-theme-flash", role: flash.tone === "error" ? "alert" : "status", children: flash.text })) : null, _jsx("button", { type: "submit", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-settings-theme-save", disabled: saving, children: saving
|
|
242
|
+
? props.texts.settingsSaveSavingButton
|
|
243
|
+
: props.texts.settingsSaveThemeButton })] })] }));
|
|
244
|
+
}
|
|
245
|
+
function FeatureTogglesSection(props) {
|
|
246
|
+
const { client } = useAIHub();
|
|
247
|
+
// The server's blob may omit keys (meaning "fall through to defaults"). The
|
|
248
|
+
// UI shows the effective value for the user — fill in defaults for any
|
|
249
|
+
// missing key. Save only sends the keys the user actually has toggled (in
|
|
250
|
+
// our case all of them, since the blob always carries all 13 once saved).
|
|
251
|
+
const [values, setValues] = useState(() => {
|
|
252
|
+
const initial = {};
|
|
253
|
+
for (const key of ALL_TOGGLE_KEYS) {
|
|
254
|
+
const fromServer = props.settings.feature_toggles[key];
|
|
255
|
+
initial[key] = typeof fromServer === "boolean" ? fromServer : defaultToggleValue();
|
|
256
|
+
}
|
|
257
|
+
return initial;
|
|
258
|
+
});
|
|
259
|
+
const [saving, setSaving] = useState(false);
|
|
260
|
+
const [flash, setFlash] = useState(null);
|
|
261
|
+
function toggle(key, value) {
|
|
262
|
+
setValues((prev) => ({ ...prev, [key]: value }));
|
|
263
|
+
}
|
|
264
|
+
async function handleSave(event) {
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
setSaving(true);
|
|
267
|
+
setFlash(null);
|
|
268
|
+
try {
|
|
269
|
+
const body = {};
|
|
270
|
+
for (const key of ALL_TOGGLE_KEYS) {
|
|
271
|
+
body[key] = values[key];
|
|
272
|
+
}
|
|
273
|
+
const next = await client.patchAdminFeatureToggles(body);
|
|
274
|
+
props.onSaved(next);
|
|
275
|
+
setFlash({ tone: "success", text: props.texts.settingsSaveSuccessFlash });
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
setFlash({
|
|
279
|
+
tone: "error",
|
|
280
|
+
text: err instanceof Error && err.message.length > 0
|
|
281
|
+
? err.message
|
|
282
|
+
: props.texts.settingsSaveGenericError,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
setSaving(false);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return (_jsxs("section", { className: "data-club-ai-hub-admin__settings-section", "data-testid": "admin-settings-toggles-section", children: [_jsx("h2", { className: "data-club-ai-hub-admin__settings-section-heading", children: props.texts.settingsTogglesSectionHeading }), _jsxs("form", { onSubmit: (event) => void handleSave(event), noValidate: true, children: [TOGGLE_GROUPS.map((group) => (_jsxs("fieldset", { className: "data-club-ai-hub-admin__toggle-group", children: [_jsx("legend", { className: "data-club-ai-hub-admin__form-label", children: props.texts[group.groupLabelKey] }), group.keys.map((key) => (_jsxs("label", { className: "data-club-ai-hub-admin__checkbox", children: [_jsx("input", { type: "checkbox", "data-testid": `admin-settings-toggle-${key}`, checked: Boolean(values[key]), onChange: (event) => toggle(key, event.target.checked), disabled: saving }), _jsx("code", { className: "data-club-ai-hub-admin__mono", children: key })] }, key)))] }, String(group.groupLabelKey)))), flash !== null ? (_jsx("div", { className: flash.tone === "success"
|
|
290
|
+
? "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--success"
|
|
291
|
+
: "data-club-ai-hub-admin__flash data-club-ai-hub-admin__flash--error", "data-testid": "admin-settings-toggles-flash", role: flash.tone === "error" ? "alert" : "status", children: flash.text })) : null, _jsx("button", { type: "submit", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-settings-toggles-save", disabled: saving, children: saving
|
|
292
|
+
? props.texts.settingsSaveSavingButton
|
|
293
|
+
: props.texts.settingsTogglesSaveButton })] })] }));
|
|
294
|
+
}
|
|
295
|
+
function SigningKeySection(props) {
|
|
296
|
+
const { client } = useAIHub();
|
|
297
|
+
const auth = useAIHubAuth();
|
|
298
|
+
const [showModal, setShowModal] = useState(false);
|
|
299
|
+
const lastRotated = formatRotationStamp(props.settings.signing_key_rotated_at);
|
|
300
|
+
async function handleRotateConfirmed() {
|
|
301
|
+
await client.rotateAdminSigningKey();
|
|
302
|
+
// Rotating invalidates every JWT, including this caller's. The provider
|
|
303
|
+
// will see the 401 on the next request and route back to login; we
|
|
304
|
+
// accelerate that by calling logout right here so the UI doesn't sit on
|
|
305
|
+
// a stale token. Update the local card first for the milliseconds the
|
|
306
|
+
// modal is still on screen.
|
|
307
|
+
props.onRotated(new Date().toISOString());
|
|
308
|
+
setShowModal(false);
|
|
309
|
+
auth.logout();
|
|
310
|
+
}
|
|
311
|
+
return (_jsxs("section", { className: "data-club-ai-hub-admin__settings-section", "data-testid": "admin-settings-signing-key-section", children: [_jsx("h2", { className: "data-club-ai-hub-admin__settings-section-heading", children: props.texts.settingsSigningKeySectionHeading }), _jsx("p", { className: "data-club-ai-hub-admin__form-helper", children: lastRotated === null
|
|
312
|
+
? props.texts.settingsSigningKeyNeverRotated
|
|
313
|
+
: props.texts.settingsSigningKeyLastRotated.replace("{date}", lastRotated) }), _jsx("p", { className: "data-club-ai-hub-admin__warning", "data-testid": "admin-settings-signing-key-warning", children: props.texts.settingsSigningKeyWarning }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--danger", "data-testid": "admin-settings-rotate-signing-key", onClick: () => setShowModal(true), children: props.texts.settingsRotateSigningKeyButton }), showModal ? (_jsx(RotateConfirmModal, { title: props.texts.settingsRotateSigningKeyModalTitle, body: props.texts.settingsRotateSigningKeyModalBody, texts: props.texts, testIdPrefix: "admin-settings-signing-key-modal", onConfirm: handleRotateConfirmed, onCancel: () => setShowModal(false) })) : null] }));
|
|
314
|
+
}
|
|
315
|
+
function MetricsTokenSection(props) {
|
|
316
|
+
const { client } = useAIHub();
|
|
317
|
+
const [showConfirm, setShowConfirm] = useState(false);
|
|
318
|
+
const [revealedToken, setRevealedToken] = useState(null);
|
|
319
|
+
const lastRotated = formatRotationStamp(props.settings.metrics_scrape_token_rotated_at);
|
|
320
|
+
async function handleRotateConfirmed() {
|
|
321
|
+
const { token } = await client.rotateAdminMetricsToken();
|
|
322
|
+
props.onRotated(new Date().toISOString());
|
|
323
|
+
setShowConfirm(false);
|
|
324
|
+
setRevealedToken(token);
|
|
325
|
+
}
|
|
326
|
+
return (_jsxs("section", { className: "data-club-ai-hub-admin__settings-section", "data-testid": "admin-settings-metrics-token-section", children: [_jsx("h2", { className: "data-club-ai-hub-admin__settings-section-heading", children: props.texts.settingsMetricsSectionHeading }), _jsx("p", { className: "data-club-ai-hub-admin__form-helper", children: lastRotated === null
|
|
327
|
+
? props.texts.settingsMetricsNeverRotated
|
|
328
|
+
: props.texts.settingsMetricsLastRotated.replace("{date}", lastRotated) }), _jsx("p", { className: "data-club-ai-hub-admin__warning", "data-testid": "admin-settings-metrics-warning", children: props.texts.settingsMetricsWarning }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--danger", "data-testid": "admin-settings-rotate-metrics-token", onClick: () => setShowConfirm(true), children: props.texts.settingsRotateMetricsButton }), showConfirm ? (_jsx(RotateConfirmModal, { title: props.texts.settingsRotateMetricsModalTitle, body: props.texts.settingsRotateMetricsModalBody, texts: props.texts, testIdPrefix: "admin-settings-metrics-token-modal", onConfirm: handleRotateConfirmed, onCancel: () => setShowConfirm(false) })) : null, revealedToken !== null ? (_jsx(MetricsTokenRevealModal, { token: revealedToken, texts: props.texts, onClose: () => setRevealedToken(null) })) : null] }));
|
|
329
|
+
}
|
|
330
|
+
function RotateConfirmModal(props) {
|
|
331
|
+
const [typed, setTyped] = useState("");
|
|
332
|
+
const [submitting, setSubmitting] = useState(false);
|
|
333
|
+
const [error, setError] = useState(null);
|
|
334
|
+
const canConfirm = typed === props.texts.settingsRotateConfirmKeyword;
|
|
335
|
+
async function handleConfirm() {
|
|
336
|
+
if (!canConfirm)
|
|
337
|
+
return;
|
|
338
|
+
setSubmitting(true);
|
|
339
|
+
setError(null);
|
|
340
|
+
try {
|
|
341
|
+
await props.onConfirm();
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
setError(err instanceof Error && err.message.length > 0
|
|
345
|
+
? err.message
|
|
346
|
+
: props.texts.settingsRotateGenericError);
|
|
347
|
+
setSubmitting(false);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return (_jsx("div", { className: "data-club-ai-hub-admin__modal-backdrop", role: "presentation", onMouseDown: (event) => {
|
|
351
|
+
if (event.target === event.currentTarget && !submitting)
|
|
352
|
+
props.onCancel();
|
|
353
|
+
}, children: _jsxs("div", { className: "data-club-ai-hub-admin__modal", role: "dialog", "aria-modal": "true", "data-testid": props.testIdPrefix, children: [_jsx("h2", { className: "data-club-ai-hub-admin__modal-title", children: props.title }), _jsx("p", { className: "data-club-ai-hub-admin__modal-body", "data-testid": `${props.testIdPrefix}-body`, children: props.body }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsRotateConfirmInputLabel }), _jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": `${props.testIdPrefix}-input`, value: typed, placeholder: props.texts.settingsRotateConfirmPlaceholder, onChange: (event) => setTyped(event.target.value), disabled: submitting, autoFocus: true })] }), error !== null ? (_jsx("div", { className: "data-club-ai-hub-admin__error", role: "alert", "data-testid": `${props.testIdPrefix}-error`, children: error })) : null, _jsxs("div", { className: "data-club-ai-hub-admin__modal-actions", children: [_jsx("button", { type: "button", className: "data-club-ai-hub-admin__button", "data-testid": `${props.testIdPrefix}-cancel`, onClick: props.onCancel, disabled: submitting, children: props.texts.agentModalCancelButton }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--danger", "data-testid": `${props.testIdPrefix}-confirm`, onClick: () => void handleConfirm(), disabled: !canConfirm || submitting, children: submitting
|
|
354
|
+
? props.texts.settingsRotateConfirmingButton
|
|
355
|
+
: props.texts.settingsRotateConfirmButton })] })] }) }));
|
|
356
|
+
}
|
|
357
|
+
function MetricsTokenRevealModal(props) {
|
|
358
|
+
const [copied, setCopied] = useState(false);
|
|
359
|
+
async function handleCopy() {
|
|
360
|
+
try {
|
|
361
|
+
if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
|
|
362
|
+
await navigator.clipboard.writeText(props.token);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
/* fall through — flash still fires to signal the click */
|
|
367
|
+
}
|
|
368
|
+
setCopied(true);
|
|
369
|
+
setTimeout(() => setCopied(false), 1800);
|
|
370
|
+
}
|
|
371
|
+
return (_jsx("div", { className: "data-club-ai-hub-admin__modal-backdrop", role: "presentation", children: _jsxs("div", { className: "data-club-ai-hub-admin__modal", role: "dialog", "aria-modal": "true", "data-testid": "admin-settings-metrics-reveal-modal", children: [_jsx("h2", { className: "data-club-ai-hub-admin__modal-title", children: props.texts.settingsMetricsRevealTitle }), _jsx("p", { className: "data-club-ai-hub-admin__warning", "data-testid": "admin-settings-metrics-reveal-warning", children: props.texts.settingsMetricsRevealWarning }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.settingsMetricsRevealTokenLabel }), _jsxs("div", { className: "data-club-ai-hub-admin__reveal-row", children: [_jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input data-club-ai-hub-admin__mono", "data-testid": "admin-settings-metrics-reveal-token", readOnly: true, value: props.token }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button", "data-testid": "admin-settings-metrics-reveal-copy", "aria-label": props.texts.passwordRevealCopyAriaLabel, onClick: () => void handleCopy(), children: "\uD83D\uDCCB" })] }), copied ? (_jsx("span", { className: "data-club-ai-hub-admin__copied-flash", "data-testid": "admin-settings-metrics-reveal-copied", role: "status", children: props.texts.passwordRevealCopiedFlash })) : null] }), _jsx("div", { className: "data-club-ai-hub-admin__modal-actions", children: _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-settings-metrics-reveal-done", onClick: props.onClose, children: props.texts.passwordRevealDoneButton }) })] }) }));
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=SettingsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/SettingsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<AdminUsersPage />` — the Users sub-page mounted inside
|
|
3
|
+
* `<DataClubAIHubAdmin />` ([05-admin-users.md]).
|
|
4
|
+
*
|
|
5
|
+
* Shows every user in the deployment in `users_table`, with per-row
|
|
6
|
+
* actions (`[role▼]`, `[reset pw]`, 🗑). Disabled-action conditions per
|
|
7
|
+
* [05-admin-users.md]:
|
|
8
|
+
*
|
|
9
|
+
* - **Admin shield** — an `admin` caller sees the role dropdown / reset /
|
|
10
|
+
* delete disabled on every other admin's row and on every super_admin's
|
|
11
|
+
* row.
|
|
12
|
+
* - **Super-admin min-count** — actions on the only super_admin are
|
|
13
|
+
* disabled regardless of caller role.
|
|
14
|
+
* - **Self-protection** — delete is disabled on the caller's own row
|
|
15
|
+
* (server enforces too).
|
|
16
|
+
*
|
|
17
|
+
* The role dropdown's options are filtered by caller role — `admin` cannot
|
|
18
|
+
* promote to `super_admin`, so that option is omitted (the option is
|
|
19
|
+
* client-side filtered to mirror what the server enforces; passing it
|
|
20
|
+
* anyway would 403).
|
|
21
|
+
*
|
|
22
|
+
* Two-phase Create User and Reset Password flows: the Phase-1 dialog
|
|
23
|
+
* triggers the server call, which on success swaps in
|
|
24
|
+
* `<PasswordRevealModal />` as Phase 2. The password is held in this
|
|
25
|
+
* component's state until the admin clicks Done — once dismissed it is
|
|
26
|
+
* unrecoverable.
|
|
27
|
+
*
|
|
28
|
+
* @see SPECIFICATIONS.md §6.3.4 / §8.1 / §8.5
|
|
29
|
+
* @see ui-sketches/05-admin-users.md
|
|
30
|
+
*/
|
|
31
|
+
import { type ReactNode } from "react";
|
|
32
|
+
import type { AIHubAdminTexts } from "../../auth/texts.js";
|
|
33
|
+
/**
|
|
34
|
+
* Props for `<AdminUsersPage />`.
|
|
35
|
+
*/
|
|
36
|
+
export interface AdminUsersPageProps {
|
|
37
|
+
/** Resolved admin texts. */
|
|
38
|
+
texts: AIHubAdminTexts;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Renders the Users sub-page.
|
|
42
|
+
*
|
|
43
|
+
* @param props - see `AdminUsersPageProps`.
|
|
44
|
+
* @returns the rendered page.
|
|
45
|
+
*/
|
|
46
|
+
export declare function AdminUsersPage(props: AdminUsersPageProps): ReactNode;
|
|
47
|
+
//# sourceMappingURL=UsersPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsersPage.d.ts","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/UsersPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA2E3D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,CAiXpE"}
|