@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.
Files changed (344) hide show
  1. package/dist/auth/passwordPolicy.d.ts +55 -0
  2. package/dist/auth/passwordPolicy.d.ts.map +1 -0
  3. package/dist/auth/passwordPolicy.js +63 -0
  4. package/dist/auth/passwordPolicy.js.map +1 -0
  5. package/dist/auth/texts.d.ts +815 -0
  6. package/dist/auth/texts.d.ts.map +1 -0
  7. package/dist/auth/texts.js +429 -0
  8. package/dist/auth/texts.js.map +1 -0
  9. package/dist/client/AIHubClient.d.ts +1058 -0
  10. package/dist/client/AIHubClient.d.ts.map +1 -0
  11. package/dist/client/AIHubClient.js +950 -0
  12. package/dist/client/AIHubClient.js.map +1 -0
  13. package/dist/client/index.d.ts +11 -0
  14. package/dist/client/index.d.ts.map +1 -0
  15. package/dist/client/index.js +9 -0
  16. package/dist/client/index.js.map +1 -0
  17. package/dist/client/sseParser.d.ts +41 -0
  18. package/dist/client/sseParser.d.ts.map +1 -0
  19. package/dist/client/sseParser.js +153 -0
  20. package/dist/client/sseParser.js.map +1 -0
  21. package/dist/client/tokenStorage.d.ts +56 -0
  22. package/dist/client/tokenStorage.d.ts.map +1 -0
  23. package/dist/client/tokenStorage.js +116 -0
  24. package/dist/client/tokenStorage.js.map +1 -0
  25. package/dist/components/AgentsPicker/index.d.ts +70 -0
  26. package/dist/components/AgentsPicker/index.d.ts.map +1 -0
  27. package/dist/components/AgentsPicker/index.js +63 -0
  28. package/dist/components/AgentsPicker/index.js.map +1 -0
  29. package/dist/components/AuthGate/index.d.ts +79 -0
  30. package/dist/components/AuthGate/index.d.ts.map +1 -0
  31. package/dist/components/AuthGate/index.js +61 -0
  32. package/dist/components/AuthGate/index.js.map +1 -0
  33. package/dist/components/CacheBadge/index.d.ts +88 -0
  34. package/dist/components/CacheBadge/index.d.ts.map +1 -0
  35. package/dist/components/CacheBadge/index.js +127 -0
  36. package/dist/components/CacheBadge/index.js.map +1 -0
  37. package/dist/components/ChangePassword/index.d.ts +109 -0
  38. package/dist/components/ChangePassword/index.d.ts.map +1 -0
  39. package/dist/components/ChangePassword/index.js +142 -0
  40. package/dist/components/ChangePassword/index.js.map +1 -0
  41. package/dist/components/ChatShell/ShellHeader.d.ts +44 -0
  42. package/dist/components/ChatShell/ShellHeader.d.ts.map +1 -0
  43. package/dist/components/ChatShell/ShellHeader.js +14 -0
  44. package/dist/components/ChatShell/ShellHeader.js.map +1 -0
  45. package/dist/components/ChatShell/UserMenu.d.ts +48 -0
  46. package/dist/components/ChatShell/UserMenu.d.ts.map +1 -0
  47. package/dist/components/ChatShell/UserMenu.js +86 -0
  48. package/dist/components/ChatShell/UserMenu.js.map +1 -0
  49. package/dist/components/ChatShell/index.d.ts +98 -0
  50. package/dist/components/ChatShell/index.d.ts.map +1 -0
  51. package/dist/components/ChatShell/index.js +124 -0
  52. package/dist/components/ChatShell/index.js.map +1 -0
  53. package/dist/components/DataClubAIHub/index.d.ts +132 -0
  54. package/dist/components/DataClubAIHub/index.d.ts.map +1 -0
  55. package/dist/components/DataClubAIHub/index.js +124 -0
  56. package/dist/components/DataClubAIHub/index.js.map +1 -0
  57. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts +89 -0
  58. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts.map +1 -0
  59. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js +199 -0
  60. package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js.map +1 -0
  61. package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts +33 -0
  62. package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts.map +1 -0
  63. package/dist/components/DataClubAIHubAdmin/AgentsPage.js +137 -0
  64. package/dist/components/DataClubAIHubAdmin/AgentsPage.js.map +1 -0
  65. package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts +50 -0
  66. package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts.map +1 -0
  67. package/dist/components/DataClubAIHubAdmin/CreateUserModal.js +93 -0
  68. package/dist/components/DataClubAIHubAdmin/CreateUserModal.js.map +1 -0
  69. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts +49 -0
  70. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts.map +1 -0
  71. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js +94 -0
  72. package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js.map +1 -0
  73. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts +37 -0
  74. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts.map +1 -0
  75. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js +44 -0
  76. package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js.map +1 -0
  77. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts +56 -0
  78. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts.map +1 -0
  79. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js +158 -0
  80. package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js.map +1 -0
  81. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts +29 -0
  82. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts.map +1 -0
  83. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js +183 -0
  84. package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js.map +1 -0
  85. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts +38 -0
  86. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts.map +1 -0
  87. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js +294 -0
  88. package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js.map +1 -0
  89. package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts +36 -0
  90. package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts.map +1 -0
  91. package/dist/components/DataClubAIHubAdmin/SettingsPage.js +373 -0
  92. package/dist/components/DataClubAIHubAdmin/SettingsPage.js.map +1 -0
  93. package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts +47 -0
  94. package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts.map +1 -0
  95. package/dist/components/DataClubAIHubAdmin/UsersPage.js +233 -0
  96. package/dist/components/DataClubAIHubAdmin/UsersPage.js.map +1 -0
  97. package/dist/components/DataClubAIHubAdmin/index.d.ts +87 -0
  98. package/dist/components/DataClubAIHubAdmin/index.d.ts.map +1 -0
  99. package/dist/components/DataClubAIHubAdmin/index.js +137 -0
  100. package/dist/components/DataClubAIHubAdmin/index.js.map +1 -0
  101. package/dist/components/DataClubAIHubLogin/index.d.ts +113 -0
  102. package/dist/components/DataClubAIHubLogin/index.d.ts.map +1 -0
  103. package/dist/components/DataClubAIHubLogin/index.js +123 -0
  104. package/dist/components/DataClubAIHubLogin/index.js.map +1 -0
  105. package/dist/components/EffortControl/index.d.ts +57 -0
  106. package/dist/components/EffortControl/index.d.ts.map +1 -0
  107. package/dist/components/EffortControl/index.js +84 -0
  108. package/dist/components/EffortControl/index.js.map +1 -0
  109. package/dist/components/Layout/index.d.ts +63 -0
  110. package/dist/components/Layout/index.d.ts.map +1 -0
  111. package/dist/components/Layout/index.js +45 -0
  112. package/dist/components/Layout/index.js.map +1 -0
  113. package/dist/components/MainColumn/index.d.ts +69 -0
  114. package/dist/components/MainColumn/index.d.ts.map +1 -0
  115. package/dist/components/MainColumn/index.js +47 -0
  116. package/dist/components/MainColumn/index.js.map +1 -0
  117. package/dist/components/MarkdownRenderer/index.d.ts +66 -0
  118. package/dist/components/MarkdownRenderer/index.d.ts.map +1 -0
  119. package/dist/components/MarkdownRenderer/index.js +153 -0
  120. package/dist/components/MarkdownRenderer/index.js.map +1 -0
  121. package/dist/components/MessageInput/index.d.ts +85 -0
  122. package/dist/components/MessageInput/index.d.ts.map +1 -0
  123. package/dist/components/MessageInput/index.js +139 -0
  124. package/dist/components/MessageInput/index.js.map +1 -0
  125. package/dist/components/MessageList/index.d.ts +156 -0
  126. package/dist/components/MessageList/index.d.ts.map +1 -0
  127. package/dist/components/MessageList/index.js +352 -0
  128. package/dist/components/MessageList/index.js.map +1 -0
  129. package/dist/components/ReasoningSelector/index.d.ts +77 -0
  130. package/dist/components/ReasoningSelector/index.d.ts.map +1 -0
  131. package/dist/components/ReasoningSelector/index.js +156 -0
  132. package/dist/components/ReasoningSelector/index.js.map +1 -0
  133. package/dist/components/ReasoningView/index.d.ts +94 -0
  134. package/dist/components/ReasoningView/index.d.ts.map +1 -0
  135. package/dist/components/ReasoningView/index.js +83 -0
  136. package/dist/components/ReasoningView/index.js.map +1 -0
  137. package/dist/components/ScrollToPresentButton/index.d.ts +54 -0
  138. package/dist/components/ScrollToPresentButton/index.d.ts.map +1 -0
  139. package/dist/components/ScrollToPresentButton/index.js +44 -0
  140. package/dist/components/ScrollToPresentButton/index.js.map +1 -0
  141. package/dist/components/SessionsPanel/SessionTitleModal.d.ts +79 -0
  142. package/dist/components/SessionsPanel/SessionTitleModal.d.ts.map +1 -0
  143. package/dist/components/SessionsPanel/SessionTitleModal.js +102 -0
  144. package/dist/components/SessionsPanel/SessionTitleModal.js.map +1 -0
  145. package/dist/components/SessionsPanel/index.d.ts +100 -0
  146. package/dist/components/SessionsPanel/index.d.ts.map +1 -0
  147. package/dist/components/SessionsPanel/index.js +176 -0
  148. package/dist/components/SessionsPanel/index.js.map +1 -0
  149. package/dist/components/SystemNotice/index.d.ts +66 -0
  150. package/dist/components/SystemNotice/index.d.ts.map +1 -0
  151. package/dist/components/SystemNotice/index.js +81 -0
  152. package/dist/components/SystemNotice/index.js.map +1 -0
  153. package/dist/components/ThemeSwitcher/index.d.ts +66 -0
  154. package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
  155. package/dist/components/ThemeSwitcher/index.js +73 -0
  156. package/dist/components/ThemeSwitcher/index.js.map +1 -0
  157. package/dist/components/ToolCallView/formatContent.d.ts +36 -0
  158. package/dist/components/ToolCallView/formatContent.d.ts.map +1 -0
  159. package/dist/components/ToolCallView/formatContent.js +53 -0
  160. package/dist/components/ToolCallView/formatContent.js.map +1 -0
  161. package/dist/components/ToolCallView/index.d.ts +120 -0
  162. package/dist/components/ToolCallView/index.d.ts.map +1 -0
  163. package/dist/components/ToolCallView/index.js +104 -0
  164. package/dist/components/ToolCallView/index.js.map +1 -0
  165. package/dist/components/TpmBanner/index.d.ts +53 -0
  166. package/dist/components/TpmBanner/index.d.ts.map +1 -0
  167. package/dist/components/TpmBanner/index.js +116 -0
  168. package/dist/components/TpmBanner/index.js.map +1 -0
  169. package/dist/components/TurnStatusIndicator/index.d.ts +77 -0
  170. package/dist/components/TurnStatusIndicator/index.d.ts.map +1 -0
  171. package/dist/components/TurnStatusIndicator/index.js +122 -0
  172. package/dist/components/TurnStatusIndicator/index.js.map +1 -0
  173. package/dist/components/internal/PasswordInput.d.ts +62 -0
  174. package/dist/components/internal/PasswordInput.d.ts.map +1 -0
  175. package/dist/components/internal/PasswordInput.js +42 -0
  176. package/dist/components/internal/PasswordInput.js.map +1 -0
  177. package/dist/context/AIHubContext.d.ts +220 -0
  178. package/dist/context/AIHubContext.d.ts.map +1 -0
  179. package/dist/context/AIHubContext.js +19 -0
  180. package/dist/context/AIHubContext.js.map +1 -0
  181. package/dist/context/AIHubProvider.d.ts +75 -0
  182. package/dist/context/AIHubProvider.d.ts.map +1 -0
  183. package/dist/context/AIHubProvider.js +954 -0
  184. package/dist/context/AIHubProvider.js.map +1 -0
  185. package/dist/context/index.d.ts +9 -0
  186. package/dist/context/index.d.ts.map +1 -0
  187. package/dist/context/index.js +9 -0
  188. package/dist/context/index.js.map +1 -0
  189. package/dist/context/theme.d.ts +43 -0
  190. package/dist/context/theme.d.ts.map +1 -0
  191. package/dist/context/theme.js +70 -0
  192. package/dist/context/theme.js.map +1 -0
  193. package/dist/context/useAIHub.d.ts +104 -0
  194. package/dist/context/useAIHub.d.ts.map +1 -0
  195. package/dist/context/useAIHub.js +63 -0
  196. package/dist/context/useAIHub.js.map +1 -0
  197. package/dist/context/useAIHubAuth.d.ts +44 -0
  198. package/dist/context/useAIHubAuth.d.ts.map +1 -0
  199. package/dist/context/useAIHubAuth.js +35 -0
  200. package/dist/context/useAIHubAuth.js.map +1 -0
  201. package/dist/index.d.ts +76 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +57 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/primitives/index.d.ts +99 -0
  206. package/dist/primitives/index.d.ts.map +1 -0
  207. package/dist/primitives/index.js +97 -0
  208. package/dist/primitives/index.js.map +1 -0
  209. package/dist/state/affordances.d.ts +182 -0
  210. package/dist/state/affordances.d.ts.map +1 -0
  211. package/dist/state/affordances.js +189 -0
  212. package/dist/state/affordances.js.map +1 -0
  213. package/dist/state/stateReducer.d.ts +72 -0
  214. package/dist/state/stateReducer.d.ts.map +1 -0
  215. package/dist/state/stateReducer.js +122 -0
  216. package/dist/state/stateReducer.js.map +1 -0
  217. package/dist/stories/EffortControl.stories.d.ts +14 -0
  218. package/dist/stories/EffortControl.stories.d.ts.map +1 -0
  219. package/dist/stories/EffortControl.stories.js +43 -0
  220. package/dist/stories/EffortControl.stories.js.map +1 -0
  221. package/dist/stories/MarkdownRenderer.stories.d.ts +25 -0
  222. package/dist/stories/MarkdownRenderer.stories.d.ts.map +1 -0
  223. package/dist/stories/MarkdownRenderer.stories.js +178 -0
  224. package/dist/stories/MarkdownRenderer.stories.js.map +1 -0
  225. package/dist/stories/MessageBubble.stories.d.ts +21 -0
  226. package/dist/stories/MessageBubble.stories.d.ts.map +1 -0
  227. package/dist/stories/MessageBubble.stories.js +59 -0
  228. package/dist/stories/MessageBubble.stories.js.map +1 -0
  229. package/dist/stories/ReasoningView.stories.d.ts +18 -0
  230. package/dist/stories/ReasoningView.stories.d.ts.map +1 -0
  231. package/dist/stories/ReasoningView.stories.js +62 -0
  232. package/dist/stories/ReasoningView.stories.js.map +1 -0
  233. package/dist/stories/ScrollToPresentButton.stories.d.ts +18 -0
  234. package/dist/stories/ScrollToPresentButton.stories.d.ts.map +1 -0
  235. package/dist/stories/ScrollToPresentButton.stories.js +34 -0
  236. package/dist/stories/ScrollToPresentButton.stories.js.map +1 -0
  237. package/dist/stories/SystemNotice.stories.d.ts +17 -0
  238. package/dist/stories/SystemNotice.stories.d.ts.map +1 -0
  239. package/dist/stories/SystemNotice.stories.js +42 -0
  240. package/dist/stories/SystemNotice.stories.js.map +1 -0
  241. package/dist/stories/ThemeSwitcher.stories.d.ts +15 -0
  242. package/dist/stories/ThemeSwitcher.stories.d.ts.map +1 -0
  243. package/dist/stories/ThemeSwitcher.stories.js +35 -0
  244. package/dist/stories/ThemeSwitcher.stories.js.map +1 -0
  245. package/dist/stories/ToolCallView.stories.d.ts +20 -0
  246. package/dist/stories/ToolCallView.stories.d.ts.map +1 -0
  247. package/dist/stories/ToolCallView.stories.js +65 -0
  248. package/dist/stories/ToolCallView.stories.js.map +1 -0
  249. package/dist/stories/TpmBanner.stories.d.ts +24 -0
  250. package/dist/stories/TpmBanner.stories.d.ts.map +1 -0
  251. package/dist/stories/TpmBanner.stories.js +63 -0
  252. package/dist/stories/TpmBanner.stories.js.map +1 -0
  253. package/dist/stories/TurnStatusIndicator.stories.d.ts +25 -0
  254. package/dist/stories/TurnStatusIndicator.stories.d.ts.map +1 -0
  255. package/dist/stories/TurnStatusIndicator.stories.js +56 -0
  256. package/dist/stories/TurnStatusIndicator.stories.js.map +1 -0
  257. package/dist/stories/_mockProvider.d.ts +44 -0
  258. package/dist/stories/_mockProvider.d.ts.map +1 -0
  259. package/dist/stories/_mockProvider.js +84 -0
  260. package/dist/stories/_mockProvider.js.map +1 -0
  261. package/dist/types.d.ts +787 -0
  262. package/dist/types.d.ts.map +1 -0
  263. package/dist/types.js +19 -0
  264. package/dist/types.js.map +1 -0
  265. package/dist/webcomponent/defineWebComponent.d.ts +106 -0
  266. package/dist/webcomponent/defineWebComponent.d.ts.map +1 -0
  267. package/dist/webcomponent/defineWebComponent.js +126 -0
  268. package/dist/webcomponent/defineWebComponent.js.map +1 -0
  269. package/dist/webcomponent/index.d.ts +7 -0
  270. package/dist/webcomponent/index.d.ts.map +1 -0
  271. package/dist/webcomponent/index.js +7 -0
  272. package/dist/webcomponent/index.js.map +1 -0
  273. package/package.json +63 -0
  274. package/src/__lint-canary__/step1-lint-canary.ts.disabled +28 -0
  275. package/src/auth/passwordPolicy.ts +75 -0
  276. package/src/auth/texts.ts +1294 -0
  277. package/src/client/AIHubClient.ts +1718 -0
  278. package/src/client/index.ts +30 -0
  279. package/src/client/sseParser.ts +168 -0
  280. package/src/client/tokenStorage.ts +131 -0
  281. package/src/components/AgentsPicker/index.tsx +147 -0
  282. package/src/components/AuthGate/index.tsx +132 -0
  283. package/src/components/CacheBadge/index.tsx +245 -0
  284. package/src/components/ChangePassword/index.tsx +375 -0
  285. package/src/components/ChatShell/ShellHeader.tsx +80 -0
  286. package/src/components/ChatShell/UserMenu.tsx +196 -0
  287. package/src/components/ChatShell/index.tsx +307 -0
  288. package/src/components/DataClubAIHub/index.tsx +300 -0
  289. package/src/components/DataClubAIHubAdmin/AgentEditorModal.tsx +505 -0
  290. package/src/components/DataClubAIHubAdmin/AgentsPage.tsx +342 -0
  291. package/src/components/DataClubAIHubAdmin/CreateUserModal.tsx +214 -0
  292. package/src/components/DataClubAIHubAdmin/PasswordRevealModal.tsx +204 -0
  293. package/src/components/DataClubAIHubAdmin/ResetPasswordModal.tsx +122 -0
  294. package/src/components/DataClubAIHubAdmin/RotatingMessageEditorModal.tsx +408 -0
  295. package/src/components/DataClubAIHubAdmin/RotatingMessagesPage.tsx +373 -0
  296. package/src/components/DataClubAIHubAdmin/SessionsOverviewPage.tsx +639 -0
  297. package/src/components/DataClubAIHubAdmin/SettingsPage.tsx +979 -0
  298. package/src/components/DataClubAIHubAdmin/UsersPage.tsx +495 -0
  299. package/src/components/DataClubAIHubAdmin/index.tsx +277 -0
  300. package/src/components/DataClubAIHubLogin/index.tsx +282 -0
  301. package/src/components/EffortControl/index.tsx +138 -0
  302. package/src/components/Layout/index.tsx +92 -0
  303. package/src/components/MainColumn/index.tsx +131 -0
  304. package/src/components/MarkdownRenderer/index.tsx +256 -0
  305. package/src/components/MessageInput/index.tsx +283 -0
  306. package/src/components/MessageList/index.tsx +753 -0
  307. package/src/components/ReasoningSelector/index.tsx +268 -0
  308. package/src/components/ReasoningView/index.tsx +183 -0
  309. package/src/components/ScrollToPresentButton/index.tsx +85 -0
  310. package/src/components/SessionsPanel/SessionTitleModal.tsx +256 -0
  311. package/src/components/SessionsPanel/index.tsx +406 -0
  312. package/src/components/SystemNotice/index.tsx +151 -0
  313. package/src/components/ThemeSwitcher/index.tsx +136 -0
  314. package/src/components/ToolCallView/formatContent.ts +50 -0
  315. package/src/components/ToolCallView/index.tsx +274 -0
  316. package/src/components/TpmBanner/index.tsx +172 -0
  317. package/src/components/TurnStatusIndicator/index.tsx +203 -0
  318. package/src/components/internal/PasswordInput.tsx +145 -0
  319. package/src/context/AIHubContext.ts +249 -0
  320. package/src/context/AIHubProvider.tsx +1084 -0
  321. package/src/context/index.ts +9 -0
  322. package/src/context/theme.ts +76 -0
  323. package/src/context/useAIHub.ts +151 -0
  324. package/src/context/useAIHubAuth.ts +65 -0
  325. package/src/index.ts +275 -0
  326. package/src/primitives/index.ts +101 -0
  327. package/src/state/affordances.ts +321 -0
  328. package/src/state/stateReducer.ts +131 -0
  329. package/src/stories/EffortControl.stories.tsx +63 -0
  330. package/src/stories/MarkdownRenderer.stories.tsx +201 -0
  331. package/src/stories/MessageBubble.stories.tsx +101 -0
  332. package/src/stories/ReasoningView.stories.tsx +81 -0
  333. package/src/stories/ScrollToPresentButton.stories.tsx +52 -0
  334. package/src/stories/SystemNotice.stories.tsx +59 -0
  335. package/src/stories/ThemeSwitcher.stories.tsx +55 -0
  336. package/src/stories/ToolCallView.stories.tsx +95 -0
  337. package/src/stories/TpmBanner.stories.tsx +93 -0
  338. package/src/stories/TurnStatusIndicator.stories.tsx +86 -0
  339. package/src/stories/_mockProvider.tsx +116 -0
  340. package/src/styles/CLASSES.md +356 -0
  341. package/src/styles/default.css +2937 -0
  342. package/src/types.ts +867 -0
  343. package/src/webcomponent/defineWebComponent.tsx +193 -0
  344. 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"}