@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,233 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<AdminUsersPage />` — the Users sub-page mounted inside
|
|
4
|
+
* `<DataClubAIHubAdmin />` ([05-admin-users.md]).
|
|
5
|
+
*
|
|
6
|
+
* Shows every user in the deployment in `users_table`, with per-row
|
|
7
|
+
* actions (`[role▼]`, `[reset pw]`, 🗑). Disabled-action conditions per
|
|
8
|
+
* [05-admin-users.md]:
|
|
9
|
+
*
|
|
10
|
+
* - **Admin shield** — an `admin` caller sees the role dropdown / reset /
|
|
11
|
+
* delete disabled on every other admin's row and on every super_admin's
|
|
12
|
+
* row.
|
|
13
|
+
* - **Super-admin min-count** — actions on the only super_admin are
|
|
14
|
+
* disabled regardless of caller role.
|
|
15
|
+
* - **Self-protection** — delete is disabled on the caller's own row
|
|
16
|
+
* (server enforces too).
|
|
17
|
+
*
|
|
18
|
+
* The role dropdown's options are filtered by caller role — `admin` cannot
|
|
19
|
+
* promote to `super_admin`, so that option is omitted (the option is
|
|
20
|
+
* client-side filtered to mirror what the server enforces; passing it
|
|
21
|
+
* anyway would 403).
|
|
22
|
+
*
|
|
23
|
+
* Two-phase Create User and Reset Password flows: the Phase-1 dialog
|
|
24
|
+
* triggers the server call, which on success swaps in
|
|
25
|
+
* `<PasswordRevealModal />` as Phase 2. The password is held in this
|
|
26
|
+
* component's state until the admin clicks Done — once dismissed it is
|
|
27
|
+
* unrecoverable.
|
|
28
|
+
*
|
|
29
|
+
* @see SPECIFICATIONS.md §6.3.4 / §8.1 / §8.5
|
|
30
|
+
* @see ui-sketches/05-admin-users.md
|
|
31
|
+
*/
|
|
32
|
+
import { useEffect, useState } from "react";
|
|
33
|
+
import { useAIHub } from "../../context/useAIHub.js";
|
|
34
|
+
import { useAIHubAuth } from "../../context/useAIHubAuth.js";
|
|
35
|
+
import { CreateUserModal } from "./CreateUserModal.js";
|
|
36
|
+
import { PasswordRevealModal } from "./PasswordRevealModal.js";
|
|
37
|
+
import { ResetPasswordModal } from "./ResetPasswordModal.js";
|
|
38
|
+
/**
|
|
39
|
+
* Returns whether the role-mutation / reset / delete actions are disabled
|
|
40
|
+
* for `target` when the caller has `callerRole` and `callerId`, accounting
|
|
41
|
+
* for the §8.1 shield + min-count rules. The boolean drives the disabled
|
|
42
|
+
* state of the row's controls; the server enforces independently.
|
|
43
|
+
*
|
|
44
|
+
* @param callerRole - caller's role.
|
|
45
|
+
* @param callerId - caller's user id (for self-protection on delete).
|
|
46
|
+
* @param target - the row being inspected.
|
|
47
|
+
* @param superAdminCount - count of super_admins in the deployment.
|
|
48
|
+
* @returns a record of disabled flags + the reason hint to surface.
|
|
49
|
+
*/
|
|
50
|
+
function rowDisabledFlags(callerRole, callerId, target, superAdminCount) {
|
|
51
|
+
// The only-super_admin row: every destructive action is locked.
|
|
52
|
+
if (target.role === "super_admin" && superAdminCount <= 1) {
|
|
53
|
+
return { role: true, reset: true, delete: true, reason: "minCount" };
|
|
54
|
+
}
|
|
55
|
+
if (callerRole === "admin") {
|
|
56
|
+
if (target.role === "admin" || target.role === "super_admin") {
|
|
57
|
+
return { role: true, reset: true, delete: true, reason: "shield" };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Self-delete is blocked outright (server enforces too).
|
|
61
|
+
const isSelf = callerId !== null && callerId === target.id;
|
|
62
|
+
return { role: false, reset: false, delete: isSelf, reason: null };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns the role options visible to the caller.
|
|
66
|
+
*
|
|
67
|
+
* - `admin` cannot grant `super_admin` (server enforces, see §6.3.4).
|
|
68
|
+
* - `super_admin` sees all four roles.
|
|
69
|
+
*/
|
|
70
|
+
function callerRoleOptions(role) {
|
|
71
|
+
if (role === "super_admin") {
|
|
72
|
+
return ["user", "power_user", "admin", "super_admin"];
|
|
73
|
+
}
|
|
74
|
+
return ["user", "power_user", "admin"];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Renders the Users sub-page.
|
|
78
|
+
*
|
|
79
|
+
* @param props - see `AdminUsersPageProps`.
|
|
80
|
+
* @returns the rendered page.
|
|
81
|
+
*/
|
|
82
|
+
export function AdminUsersPage(props) {
|
|
83
|
+
const { client } = useAIHub();
|
|
84
|
+
const auth = useAIHubAuth();
|
|
85
|
+
const callerRole = auth.role;
|
|
86
|
+
const callerId = auth.user?.id ?? null;
|
|
87
|
+
const [users, setUsers] = useState(null);
|
|
88
|
+
const [loadError, setLoadError] = useState(null);
|
|
89
|
+
const [showCreate, setShowCreate] = useState(false);
|
|
90
|
+
const [resetTarget, setResetTarget] = useState(null);
|
|
91
|
+
const [reveal, setReveal] = useState(null);
|
|
92
|
+
const [flash, setFlash] = useState(null);
|
|
93
|
+
// Tracks rows currently being mutated (role change in flight) so the
|
|
94
|
+
// dropdown can disable itself while we wait.
|
|
95
|
+
const [pendingRoleId, setPendingRoleId] = useState(null);
|
|
96
|
+
// Initial load.
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
let cancelled = false;
|
|
99
|
+
void (async () => {
|
|
100
|
+
try {
|
|
101
|
+
const rows = await client.listAdminUsers();
|
|
102
|
+
if (!cancelled) {
|
|
103
|
+
setUsers(rows);
|
|
104
|
+
setLoadError(null);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (!cancelled) {
|
|
109
|
+
setLoadError(err instanceof Error && err.message
|
|
110
|
+
? err.message
|
|
111
|
+
: props.texts.usersGenericError);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
})();
|
|
115
|
+
return () => {
|
|
116
|
+
cancelled = true;
|
|
117
|
+
};
|
|
118
|
+
}, [client, props.texts.usersGenericError]);
|
|
119
|
+
// Auto-clear the flash after a short window so it doesn't linger.
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (flash === null)
|
|
122
|
+
return;
|
|
123
|
+
const id = setTimeout(() => setFlash(null), 3000);
|
|
124
|
+
return () => clearTimeout(id);
|
|
125
|
+
}, [flash]);
|
|
126
|
+
const superAdminCount = (users ?? []).filter((u) => u.role === "super_admin").length;
|
|
127
|
+
const roleOptions = callerRoleOptions(callerRole);
|
|
128
|
+
function roleLabel(role) {
|
|
129
|
+
if (role === "super_admin")
|
|
130
|
+
return props.texts.roleOptionSuperAdmin;
|
|
131
|
+
if (role === "admin")
|
|
132
|
+
return props.texts.roleOptionAdmin;
|
|
133
|
+
if (role === "power_user")
|
|
134
|
+
return props.texts.roleOptionPowerUser;
|
|
135
|
+
return props.texts.roleOptionUser;
|
|
136
|
+
}
|
|
137
|
+
async function handleCreate(input) {
|
|
138
|
+
const result = await client.createAdminUser({
|
|
139
|
+
username: input.username,
|
|
140
|
+
displayName: input.displayName,
|
|
141
|
+
role: input.role,
|
|
142
|
+
});
|
|
143
|
+
setUsers((prev) => prev === null ? [result.user] : sortByUsername([...prev, result.user]));
|
|
144
|
+
setShowCreate(false);
|
|
145
|
+
setReveal({
|
|
146
|
+
variant: "create",
|
|
147
|
+
username: result.user.username,
|
|
148
|
+
password: result.generatedPassword,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async function handleRoleChange(target, newRole) {
|
|
152
|
+
if (newRole === target.role)
|
|
153
|
+
return;
|
|
154
|
+
setPendingRoleId(target.id);
|
|
155
|
+
setFlash(null);
|
|
156
|
+
try {
|
|
157
|
+
const updated = await client.patchAdminUserRole(target.id, newRole);
|
|
158
|
+
setUsers((prev) => prev === null
|
|
159
|
+
? null
|
|
160
|
+
: prev.map((u) => (u.id === updated.id ? updated : u)));
|
|
161
|
+
setFlash({
|
|
162
|
+
userId: target.id,
|
|
163
|
+
text: props.texts.roleChangeSuccessToast.replace("{role}", roleLabel(newRole)),
|
|
164
|
+
tone: "success",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
const errAsAny = err;
|
|
169
|
+
const message = errAsAny instanceof Error && errAsAny.message
|
|
170
|
+
? errAsAny.message
|
|
171
|
+
: props.texts.roleChangeForbiddenFallback;
|
|
172
|
+
setFlash({ userId: target.id, text: message, tone: "error" });
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
setPendingRoleId(null);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function handleResetConfirm(target) {
|
|
179
|
+
const result = await client.resetAdminUserPassword(target.id);
|
|
180
|
+
setResetTarget(null);
|
|
181
|
+
// Re-fetch the row so the ⚠ marker (is_initial_password=true) refreshes.
|
|
182
|
+
setUsers((prev) => prev === null
|
|
183
|
+
? null
|
|
184
|
+
: prev.map((u) => u.id === target.id ? { ...u, is_initial_password: true } : u));
|
|
185
|
+
setReveal({
|
|
186
|
+
variant: "reset",
|
|
187
|
+
username: target.username,
|
|
188
|
+
password: result.generatedPassword,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
async function handleDelete(target) {
|
|
192
|
+
const prompt = props.texts.deleteUserConfirmPrompt.replace("{username}", target.username);
|
|
193
|
+
// Native confirm is fine for v1 per [05-admin-users.md].
|
|
194
|
+
// eslint-disable-next-line no-alert
|
|
195
|
+
const ok = typeof window !== "undefined" && typeof window.confirm === "function"
|
|
196
|
+
? window.confirm(prompt)
|
|
197
|
+
: true;
|
|
198
|
+
if (!ok)
|
|
199
|
+
return;
|
|
200
|
+
try {
|
|
201
|
+
await client.deleteAdminUser(target.id);
|
|
202
|
+
setUsers((prev) => prev === null ? null : prev.filter((u) => u.id !== target.id));
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
const message = err instanceof Error && err.message
|
|
206
|
+
? err.message
|
|
207
|
+
: props.texts.deleteUserGenericError;
|
|
208
|
+
setFlash({ userId: target.id, text: message, tone: "error" });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return (_jsxs("div", { className: "data-club-ai-hub-admin__users-page", "data-testid": "admin-users-page", children: [_jsxs("header", { className: "data-club-ai-hub-admin__page-header", children: [_jsx("h1", { className: "data-club-ai-hub-admin__page-heading", "data-testid": "admin-users-heading", children: props.texts.usersHeading }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-users-create", onClick: () => setShowCreate(true), children: props.texts.createUserButton })] }), loadError !== null ? (_jsx("div", { className: "data-club-ai-hub-admin__error", "data-testid": "admin-users-error", role: "alert", children: loadError })) : null, users === null && loadError === null ? (_jsx("p", { className: "data-club-ai-hub-admin__loading", "data-testid": "admin-users-loading", children: props.texts.usersLoading })) : null, users !== null && users.length === 0 ? (_jsx("p", { className: "data-club-ai-hub-admin__empty", "data-testid": "admin-users-empty", children: props.texts.usersEmpty })) : null, users !== null && users.length > 0 ? (_jsxs("table", { className: "data-club-ai-hub-admin__users-table", "data-testid": "admin-users-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: props.texts.userColumnUsername }), _jsx("th", { children: props.texts.userColumnDisplay }), _jsx("th", { children: props.texts.userColumnRole }), _jsx("th", { children: props.texts.userColumnActions })] }) }), _jsx("tbody", { children: users.map((u) => {
|
|
212
|
+
const flags = rowDisabledFlags(callerRole, callerId, u, superAdminCount);
|
|
213
|
+
const reasonText = flags.reason === "shield"
|
|
214
|
+
? props.texts.roleSelectShieldDisabledHint
|
|
215
|
+
: flags.reason === "minCount"
|
|
216
|
+
? props.texts.roleSelectMinCountDisabledHint
|
|
217
|
+
: "";
|
|
218
|
+
const flashForRow = flash !== null && flash.userId === u.id ? flash : null;
|
|
219
|
+
return (_jsxs("tr", { "data-testid": `admin-user-row-${u.id}`, "data-username": u.username, "data-role": u.role, className: u.is_initial_password
|
|
220
|
+
? "data-club-ai-hub-admin__users-row data-club-ai-hub-admin__users-row--initial-password"
|
|
221
|
+
: "data-club-ai-hub-admin__users-row", children: [_jsxs("td", { children: [u.is_initial_password ? (_jsx("span", { className: "data-club-ai-hub-admin__initial-password-indicator", "data-testid": `admin-user-row-${u.id}-initial-password`, title: props.texts.initialPasswordIndicator, "aria-label": props.texts.initialPasswordIndicator, children: "\u26A0" })) : null, " ", u.username] }), _jsx("td", { children: u.display_name ?? "—" }), _jsx("td", { children: flags.role ? (_jsx("span", { className: "data-club-ai-hub-admin__role-static", "data-testid": `admin-user-row-${u.id}-role-static`, title: reasonText, children: roleLabel(u.role) })) : (_jsx("select", { value: u.role, onChange: (e) => {
|
|
222
|
+
void handleRoleChange(u, e.target.value);
|
|
223
|
+
}, disabled: pendingRoleId === u.id, className: "data-club-ai-hub-admin__role-select", "data-testid": `admin-user-row-${u.id}-role-select`, "aria-label": `${props.texts.userColumnRole}: ${u.username}`, children: roleOptions.map((r) => (_jsx("option", { value: r, children: roleLabel(r) }, r))) })) }), _jsxs("td", { children: [_jsx("button", { type: "button", className: "data-club-ai-hub-admin__row-action", "data-testid": `admin-user-row-${u.id}-reset`, onClick: () => setResetTarget(u), disabled: flags.reset, title: flags.reset ? reasonText : undefined, "aria-label": `${props.texts.resetPasswordButtonLabel}: ${u.username}`, children: "\uD83D\uDD11" }), _jsx("button", { type: "button", className: "data-club-ai-hub-admin__row-action data-club-ai-hub-admin__row-action--delete", "data-testid": `admin-user-row-${u.id}-delete`, onClick: () => {
|
|
224
|
+
void handleDelete(u);
|
|
225
|
+
}, disabled: flags.delete, title: flags.delete ? reasonText : undefined, "aria-label": `${props.texts.deleteUserButtonLabel}: ${u.username}`, children: "\uD83D\uDDD1" }), flashForRow !== null ? (_jsx("span", { className: flashForRow.tone === "success"
|
|
226
|
+
? "data-club-ai-hub-admin__row-flash data-club-ai-hub-admin__row-flash--success"
|
|
227
|
+
: "data-club-ai-hub-admin__row-flash data-club-ai-hub-admin__row-flash--error", "data-testid": `admin-user-row-${u.id}-flash`, role: flashForRow.tone === "error" ? "alert" : "status", "aria-live": "polite", children: flashForRow.text })) : null] })] }, u.id));
|
|
228
|
+
}) })] })) : null, showCreate ? (_jsx(CreateUserModal, { callerRole: callerRole, texts: props.texts, onSubmit: handleCreate, onCancel: () => setShowCreate(false) })) : null, resetTarget !== null ? (_jsx(ResetPasswordModal, { username: resetTarget.username, texts: props.texts, onConfirm: () => handleResetConfirm(resetTarget), onCancel: () => setResetTarget(null) })) : null, reveal !== null ? (_jsx(PasswordRevealModal, { variant: reveal.variant, username: reveal.username, password: reveal.password, texts: props.texts, onClose: () => setReveal(null) })) : null] }));
|
|
229
|
+
}
|
|
230
|
+
function sortByUsername(rows) {
|
|
231
|
+
return [...rows].sort((a, b) => a.username.localeCompare(b.username));
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=UsersPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsersPage.js","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/UsersPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<DataClubAIHubAdmin />` — role-gated admin UI shell (§8.3,
|
|
3
|
+
* [04-admin-overview.md]).
|
|
4
|
+
*
|
|
5
|
+
* Step 11 ships the shell + the Users sub-page; Step 12 fills in Agents,
|
|
6
|
+
* Sessions overview, and Settings. Nav items the caller's role isn't
|
|
7
|
+
* authorized for are **hidden, not greyed** — per §8.3. When mounted by a
|
|
8
|
+
* `user`-role caller the component returns `null` outright.
|
|
9
|
+
*
|
|
10
|
+
* The shell **renders its own `<ShellHeader />`** so the user-menu (log
|
|
11
|
+
* out, theme toggle, Open Letta ADE, ← Back to chat) stays available
|
|
12
|
+
* from inside the admin view too — [00-shell.md] makes the shell header
|
|
13
|
+
* part of every authenticated page. The component is identical to the
|
|
14
|
+
* one ChatShell renders.
|
|
15
|
+
*
|
|
16
|
+
* The active sub-page is derived from the role + an optional explicit
|
|
17
|
+
* user click (see `activePage` below) — it is NOT eagerly initialized
|
|
18
|
+
* from the role because `auth.role` may be `null` during hydration.
|
|
19
|
+
*
|
|
20
|
+
* @see SPECIFICATIONS.md §8.3 — admin views
|
|
21
|
+
* @see ui-sketches/04-admin-overview.md — nav shell
|
|
22
|
+
* @see ui-sketches/05-admin-users.md — Users sub-page
|
|
23
|
+
* @see ui-sketches/00-shell.md — header chrome
|
|
24
|
+
*/
|
|
25
|
+
import { type ReactNode } from "react";
|
|
26
|
+
import { type AIHubTexts, type DeepPartial } from "../../auth/texts.js";
|
|
27
|
+
/**
|
|
28
|
+
* One of the admin sub-pages identified in [04-admin-overview.md]. `rotating`
|
|
29
|
+
* (rotating starting messages) was added alongside Agents — same `power_user`+
|
|
30
|
+
* visibility.
|
|
31
|
+
*
|
|
32
|
+
* @see ui-sketches/04-admin-overview.md
|
|
33
|
+
*/
|
|
34
|
+
export type AdminPage = "users" | "agents" | "rotating" | "sessions" | "settings";
|
|
35
|
+
/**
|
|
36
|
+
* Props for `<DataClubAIHubAdmin />`.
|
|
37
|
+
*
|
|
38
|
+
* @see SPECIFICATIONS.md §8.3
|
|
39
|
+
*/
|
|
40
|
+
export interface DataClubAIHubAdminProps {
|
|
41
|
+
/** Wrapper-supplied i18n. Falls back to English defaults for missing keys. */
|
|
42
|
+
texts?: DeepPartial<AIHubTexts>;
|
|
43
|
+
/**
|
|
44
|
+
* Overrides the initial sub-page. Defaults to `users` for `admin` /
|
|
45
|
+
* `super_admin` and `agents` for `power_user` per [04-admin-overview.md].
|
|
46
|
+
* When the supplied initial sub-page isn't authorized for the caller's
|
|
47
|
+
* role, falls back to the same default-by-role logic.
|
|
48
|
+
*/
|
|
49
|
+
initialPage?: AdminPage;
|
|
50
|
+
/**
|
|
51
|
+
* Optional callback fired when the user clicks back to chat. The monolith
|
|
52
|
+
* (`<DataClubAIHub />`) supplies one that swaps the admin view back out;
|
|
53
|
+
* standalone mounts can leave it unset.
|
|
54
|
+
*/
|
|
55
|
+
onExit?: () => void;
|
|
56
|
+
/** Extra className merged onto the admin root. */
|
|
57
|
+
className?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Default-logo source surfaced through the shell header when
|
|
60
|
+
* `customShellHeaderLeft` is unset. Defaults to `"ai-hub"`. The monolith
|
|
61
|
+
* forwards its own `productName` here so the admin shell brands
|
|
62
|
+
* consistently with chat.
|
|
63
|
+
*/
|
|
64
|
+
productName?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Wrapper-supplied logo / nav-links slot for the shell header. The
|
|
67
|
+
* monolith forwards `customShellHeaderLeft` here so the admin shell
|
|
68
|
+
* matches the chat shell's chrome.
|
|
69
|
+
*/
|
|
70
|
+
customShellHeaderLeft?: ReactNode;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Renders the admin shell (nav + content) or `null` for unauthorized callers.
|
|
74
|
+
*
|
|
75
|
+
* Behavior at a glance:
|
|
76
|
+
*
|
|
77
|
+
* - Returns `null` when the caller is `user`-role or unauthenticated.
|
|
78
|
+
* - Defaults to `users` (admin / super_admin) or `agents` (power_user); the
|
|
79
|
+
* `initialPage` prop overrides only when it's authorized for the caller.
|
|
80
|
+
* - Sub-pages other than Users render the "coming in Step 12" placeholder
|
|
81
|
+
* for now — Step 12 fills them in.
|
|
82
|
+
*
|
|
83
|
+
* @param props - see `DataClubAIHubAdminProps`.
|
|
84
|
+
* @returns the rendered admin UI, or `null` when the caller can't see it.
|
|
85
|
+
*/
|
|
86
|
+
export declare function DataClubAIHubAdmin(props: DataClubAIHubAdminProps): ReactNode;
|
|
87
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAa7B;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAChC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,SAAS,CAAC;CACnC;AAwCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,GAC7B,SAAS,CAmIX"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `<DataClubAIHubAdmin />` — role-gated admin UI shell (§8.3,
|
|
4
|
+
* [04-admin-overview.md]).
|
|
5
|
+
*
|
|
6
|
+
* Step 11 ships the shell + the Users sub-page; Step 12 fills in Agents,
|
|
7
|
+
* Sessions overview, and Settings. Nav items the caller's role isn't
|
|
8
|
+
* authorized for are **hidden, not greyed** — per §8.3. When mounted by a
|
|
9
|
+
* `user`-role caller the component returns `null` outright.
|
|
10
|
+
*
|
|
11
|
+
* The shell **renders its own `<ShellHeader />`** so the user-menu (log
|
|
12
|
+
* out, theme toggle, Open Letta ADE, ← Back to chat) stays available
|
|
13
|
+
* from inside the admin view too — [00-shell.md] makes the shell header
|
|
14
|
+
* part of every authenticated page. The component is identical to the
|
|
15
|
+
* one ChatShell renders.
|
|
16
|
+
*
|
|
17
|
+
* The active sub-page is derived from the role + an optional explicit
|
|
18
|
+
* user click (see `activePage` below) — it is NOT eagerly initialized
|
|
19
|
+
* from the role because `auth.role` may be `null` during hydration.
|
|
20
|
+
*
|
|
21
|
+
* @see SPECIFICATIONS.md §8.3 — admin views
|
|
22
|
+
* @see ui-sketches/04-admin-overview.md — nav shell
|
|
23
|
+
* @see ui-sketches/05-admin-users.md — Users sub-page
|
|
24
|
+
* @see ui-sketches/00-shell.md — header chrome
|
|
25
|
+
*/
|
|
26
|
+
import { useMemo, useState } from "react";
|
|
27
|
+
import { resolveAIHubTexts, } from "../../auth/texts.js";
|
|
28
|
+
import { useAIHub } from "../../context/useAIHub.js";
|
|
29
|
+
import { useAIHubAuth } from "../../context/useAIHubAuth.js";
|
|
30
|
+
import { ShellHeader } from "../ChatShell/ShellHeader.js";
|
|
31
|
+
import { AdminAgentsPage } from "./AgentsPage.js";
|
|
32
|
+
import { AdminRotatingMessagesPage } from "./RotatingMessagesPage.js";
|
|
33
|
+
import { AdminSessionsOverviewPage } from "./SessionsOverviewPage.js";
|
|
34
|
+
import { AdminSettingsPage } from "./SettingsPage.js";
|
|
35
|
+
import { AdminUsersPage } from "./UsersPage.js";
|
|
36
|
+
/**
|
|
37
|
+
* Per-role nav-item visibility per the §8.3 / [04-admin-overview.md] matrix.
|
|
38
|
+
*
|
|
39
|
+
* `super_admin` sees everything; `admin` loses Settings; `power_user` also
|
|
40
|
+
* loses Users; `user` returns `null` upstream.
|
|
41
|
+
*/
|
|
42
|
+
function navItemsForRole(role) {
|
|
43
|
+
if (role === "super_admin") {
|
|
44
|
+
return ["users", "agents", "rotating", "sessions", "settings"];
|
|
45
|
+
}
|
|
46
|
+
if (role === "admin") {
|
|
47
|
+
return ["users", "agents", "rotating", "sessions"];
|
|
48
|
+
}
|
|
49
|
+
if (role === "power_user") {
|
|
50
|
+
return ["agents", "rotating", "sessions"];
|
|
51
|
+
}
|
|
52
|
+
// `user` callers don't render this component at all (see early return).
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Default landing page per role per [04-admin-overview.md] notes:
|
|
57
|
+
* `Users` for admin / super_admin, `Agents` for power_user.
|
|
58
|
+
*/
|
|
59
|
+
function defaultPageForRole(role) {
|
|
60
|
+
if (role === "power_user")
|
|
61
|
+
return "agents";
|
|
62
|
+
return "users";
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Renders the admin shell (nav + content) or `null` for unauthorized callers.
|
|
66
|
+
*
|
|
67
|
+
* Behavior at a glance:
|
|
68
|
+
*
|
|
69
|
+
* - Returns `null` when the caller is `user`-role or unauthenticated.
|
|
70
|
+
* - Defaults to `users` (admin / super_admin) or `agents` (power_user); the
|
|
71
|
+
* `initialPage` prop overrides only when it's authorized for the caller.
|
|
72
|
+
* - Sub-pages other than Users render the "coming in Step 12" placeholder
|
|
73
|
+
* for now — Step 12 fills them in.
|
|
74
|
+
*
|
|
75
|
+
* @param props - see `DataClubAIHubAdminProps`.
|
|
76
|
+
* @returns the rendered admin UI, or `null` when the caller can't see it.
|
|
77
|
+
*/
|
|
78
|
+
export function DataClubAIHubAdmin(props) {
|
|
79
|
+
const auth = useAIHubAuth();
|
|
80
|
+
// `theme` is forwarded as `data-theme` on the admin root so the dark
|
|
81
|
+
// theme's `[data-theme="dark"]` selector matches here too — otherwise
|
|
82
|
+
// the root's own `.data-club-ai-hub-admin` rule re-sets the light
|
|
83
|
+
// custom-property values and overrides the dark cascade from the
|
|
84
|
+
// provider's outer wrapper.
|
|
85
|
+
const { theme } = useAIHub();
|
|
86
|
+
const texts = resolveAIHubTexts(props.texts);
|
|
87
|
+
const navItems = navItemsForRole(auth.role);
|
|
88
|
+
const productName = props.productName ?? "ai-hub";
|
|
89
|
+
// `explicitPage` is `null` until the user clicks a nav item. We DON'T
|
|
90
|
+
// initialize from `auth.role` because the role may still be `null` while
|
|
91
|
+
// the auth context is hydrating; deriving `activePage` inline below keeps
|
|
92
|
+
// the page in sync with the role even after late hydration.
|
|
93
|
+
const [explicitPage, setExplicitPage] = useState(props.initialPage ?? null);
|
|
94
|
+
// Derive the active page from (in order): explicit user click, `initialPage`
|
|
95
|
+
// prop, role-derived default. The final guard demotes a stale `explicitPage`
|
|
96
|
+
// that the caller no longer has access to (e.g. role demotion between
|
|
97
|
+
// clicks) — without it the AdminUsersPage would mount for a power_user.
|
|
98
|
+
const activePage = explicitPage !== null && navItems.includes(explicitPage)
|
|
99
|
+
? explicitPage
|
|
100
|
+
: defaultPageForRole(auth.role);
|
|
101
|
+
const setActivePage = (page) => {
|
|
102
|
+
setExplicitPage(page);
|
|
103
|
+
};
|
|
104
|
+
const labels = useMemo(() => ({
|
|
105
|
+
heading: texts.admin.navHeading,
|
|
106
|
+
users: texts.admin.navUsers,
|
|
107
|
+
agents: texts.admin.navAgents,
|
|
108
|
+
rotating: texts.admin.navRotatingMessages,
|
|
109
|
+
sessions: texts.admin.navSessionsOverview,
|
|
110
|
+
settings: texts.admin.navSettings,
|
|
111
|
+
}), [texts]);
|
|
112
|
+
// Hide entirely for unauthorized callers (and while the auth context is
|
|
113
|
+
// still hydrating — the shell would flash if rendered first).
|
|
114
|
+
if (auth.hydrating)
|
|
115
|
+
return null;
|
|
116
|
+
if (!auth.user || auth.role === null)
|
|
117
|
+
return null;
|
|
118
|
+
if (auth.role === "user")
|
|
119
|
+
return null;
|
|
120
|
+
const rootClass = props.className
|
|
121
|
+
? `data-club-ai-hub-admin ${props.className}`
|
|
122
|
+
: "data-club-ai-hub-admin";
|
|
123
|
+
return (_jsxs("div", { className: rootClass, "data-testid": "admin-root", "data-theme": theme, children: [_jsx(ShellHeader, { productName: productName, texts: texts.chat, ...(props.customShellHeaderLeft !== undefined
|
|
124
|
+
? { customShellHeaderLeft: props.customShellHeaderLeft }
|
|
125
|
+
: {}) }), _jsxs("div", { className: "data-club-ai-hub-admin__body", "data-testid": "admin-body", children: [_jsxs("aside", { className: "data-club-ai-hub-admin__nav", "data-testid": "admin-nav", "aria-label": labels.heading, children: [_jsx("div", { className: "data-club-ai-hub-admin__nav-heading", children: labels.heading }), _jsx("nav", { className: "data-club-ai-hub-admin__nav-list", role: "navigation", children: navItems.map((item) => (_jsx("button", { type: "button", role: "link", className: `data-club-ai-hub-admin__nav-item${activePage === item
|
|
126
|
+
? " data-club-ai-hub-admin__nav-item--active"
|
|
127
|
+
: ""}`, "data-testid": `admin-nav-${item}`, "aria-current": activePage === item ? "page" : undefined, onClick: () => setActivePage(item), children: item === "users"
|
|
128
|
+
? labels.users
|
|
129
|
+
: item === "agents"
|
|
130
|
+
? labels.agents
|
|
131
|
+
: item === "rotating"
|
|
132
|
+
? labels.rotating
|
|
133
|
+
: item === "sessions"
|
|
134
|
+
? labels.sessions
|
|
135
|
+
: labels.settings }, item))) }), props.onExit ? (_jsxs("button", { type: "button", className: "data-club-ai-hub-admin__nav-exit", "data-testid": "admin-nav-exit", onClick: props.onExit, children: ["\u2190 ", texts.admin.backToChatLink] })) : null] }), _jsx("section", { className: "data-club-ai-hub-admin__content", "data-testid": "admin-content", children: activePage === "users" ? (_jsx(AdminUsersPage, { texts: texts.admin })) : activePage === "agents" ? (_jsx(AdminAgentsPage, { texts: texts.admin })) : activePage === "rotating" ? (_jsx(AdminRotatingMessagesPage, { texts: texts.admin })) : activePage === "sessions" ? (_jsx(AdminSessionsOverviewPage, { texts: texts.admin })) : (_jsx(AdminSettingsPage, { texts: texts.admin })) })] })] }));
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<DataClubAIHubLogin />` — the built-in login screen.
|
|
3
|
+
*
|
|
4
|
+
* Auto-rendered by `<DataClubAIHub />` (and `AIHub.AuthGate`) when no
|
|
5
|
+
* valid session token is present. Per §7.2.1 + §7.3 + §8.5, this screen
|
|
6
|
+
* is **library-owned** — there is no escape hatch in v1 to substitute a
|
|
7
|
+
* custom React component. Wrappers brand it via `productName` /
|
|
8
|
+
* `usernamePlaceholder` props, `texts` for localization, the BEM class
|
|
9
|
+
* contract, and CSS custom properties on `.data-club-ai-hub`.
|
|
10
|
+
*
|
|
11
|
+
* Behavior summary:
|
|
12
|
+
*
|
|
13
|
+
* - Submit → `useAIHubAuth().login(username, password)`.
|
|
14
|
+
* - On success with `mustChangePassword === false` → fires `onLoggedIn(user)`.
|
|
15
|
+
* `AIHub.AuthGate` listens to `mustChangePassword` and routes to the
|
|
16
|
+
* forced-change screen automatically; this component does not navigate
|
|
17
|
+
* on its own.
|
|
18
|
+
* - On failure → shows the `error_message` banner above the form; inputs
|
|
19
|
+
* stay editable.
|
|
20
|
+
* - No "Forgot password?" link, no "Sign up" link — per v1 spec; the
|
|
21
|
+
* `forgot_password_note` is plain helper text.
|
|
22
|
+
*
|
|
23
|
+
* @see SPECIFICATIONS.md §7.2.1 — `<DataClubAIHubLogin />` props
|
|
24
|
+
* @see SPECIFICATIONS.md §8.5 — login flow + initial-password handling
|
|
25
|
+
* @see ui-sketches/01-login.md — visual contract for every region
|
|
26
|
+
*/
|
|
27
|
+
import { type ReactNode } from "react";
|
|
28
|
+
import { type AIHubTexts, type DeepPartial } from "../../auth/texts.js";
|
|
29
|
+
import type { AIHubUser } from "../../types.js";
|
|
30
|
+
/**
|
|
31
|
+
* BEM class names emitted by `<DataClubAIHubLogin />`. Per-customer wrappers
|
|
32
|
+
* pass a partial of this map via the `classNames` prop to override individual
|
|
33
|
+
* names for utility-CSS frameworks.
|
|
34
|
+
*/
|
|
35
|
+
export interface AIHubLoginClassNames {
|
|
36
|
+
/** Outer page wrapper (centers the card in the viewport). */
|
|
37
|
+
root: string;
|
|
38
|
+
/** The card itself. */
|
|
39
|
+
card: string;
|
|
40
|
+
/** Gradient title (product name). */
|
|
41
|
+
title: string;
|
|
42
|
+
/** Error banner shown above the form on failure. */
|
|
43
|
+
errorBanner: string;
|
|
44
|
+
/** Form container. */
|
|
45
|
+
form: string;
|
|
46
|
+
/** Label / field group wrapper. */
|
|
47
|
+
fieldGroup: string;
|
|
48
|
+
/** `<label>` for an input. */
|
|
49
|
+
fieldLabel: string;
|
|
50
|
+
/** Plain text inputs (username). */
|
|
51
|
+
textInput: string;
|
|
52
|
+
/** Password input wrapper (input + show toggle). */
|
|
53
|
+
passwordWrapper: string;
|
|
54
|
+
/** The password `<input>` itself. */
|
|
55
|
+
passwordInput: string;
|
|
56
|
+
/** The show/hide-password toggle button. */
|
|
57
|
+
passwordToggle: string;
|
|
58
|
+
/** Submit button. */
|
|
59
|
+
submitButton: string;
|
|
60
|
+
/** Spinner glyph rendered inside the submit button while submitting. */
|
|
61
|
+
spinner: string;
|
|
62
|
+
/** "Forgot password?" helper note below the submit button. */
|
|
63
|
+
forgotNote: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Props for `<DataClubAIHubLogin />`. See §7.2.1.
|
|
67
|
+
*/
|
|
68
|
+
export interface DataClubAIHubLoginProps {
|
|
69
|
+
/**
|
|
70
|
+
* Called after a successful login *only* when the server returned
|
|
71
|
+
* `mustChangePassword === false`. For the forced-change path,
|
|
72
|
+
* `useAIHubAuth().mustChangePassword` flips to `true` and `AuthGate`
|
|
73
|
+
* routes to the change-password screen — this callback is not fired.
|
|
74
|
+
*/
|
|
75
|
+
onLoggedIn?: (user: AIHubUser) => void;
|
|
76
|
+
/** Extra class merged onto the root wrapper alongside the BEM defaults. */
|
|
77
|
+
className?: string;
|
|
78
|
+
/** Per-element class-name overrides for utility-CSS frameworks. */
|
|
79
|
+
classNames?: Partial<AIHubLoginClassNames>;
|
|
80
|
+
/**
|
|
81
|
+
* Title text shown at the top of the card. Defaults to `"ai-hub"`. The
|
|
82
|
+
* per-customer wrapper passes the brand label (e.g. `"BankXYZ Chat"`).
|
|
83
|
+
*/
|
|
84
|
+
productName?: string;
|
|
85
|
+
/**
|
|
86
|
+
* Placeholder shown inside the username input. Defaults to empty.
|
|
87
|
+
* The seed-time hint `"DataClub"` is no longer baked in — operators
|
|
88
|
+
* who want it pass it explicitly during first-time-setup and remove it
|
|
89
|
+
* once the customer has rotated to their own users.
|
|
90
|
+
*/
|
|
91
|
+
usernamePlaceholder?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Wrapper-supplied i18n. Missing keys fall back to English defaults. Only
|
|
94
|
+
* the `login` namespace is consulted by this component; the
|
|
95
|
+
* `changePassword` namespace is consumed by the change-password screen.
|
|
96
|
+
*
|
|
97
|
+
* Accepts the full `AIHubTexts` shape (so a wrapper can pass one object
|
|
98
|
+
* to every built-in screen) — only the `login` keys are read here.
|
|
99
|
+
*/
|
|
100
|
+
texts?: DeepPartial<AIHubTexts>;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Renders the login card.
|
|
104
|
+
*
|
|
105
|
+
* Always reads auth state from the nearest `<AIHubProvider>` — there is no
|
|
106
|
+
* "controlled" mode where a parent supplies the username / password / submit
|
|
107
|
+
* handler.
|
|
108
|
+
*
|
|
109
|
+
* @param props - see `DataClubAIHubLoginProps`.
|
|
110
|
+
* @returns the rendered card.
|
|
111
|
+
*/
|
|
112
|
+
export declare function DataClubAIHubLogin(props: DataClubAIHubLoginProps): ReactNode;
|
|
113
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataClubAIHubLogin/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjE,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;CACpB;AAwBD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACvC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CA4I5E"}
|