@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,124 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * `<DataClubAIHub />` — the default monolithic chat component
4
+ * (Tier 1 / Tier 2 surface).
5
+ *
6
+ * Internally a thin composition over `<AIHubProvider>` + `<AuthGate>` +
7
+ * `<ChatShell>`. The structural budget of ≤50 lines for the body (§7.1)
8
+ * is honored — the body is a single JSX tree; the prop forwarding is
9
+ * verbose because TypeScript's `exactOptionalPropertyTypes: true`
10
+ * forbids passing `prop={undefined}`.
11
+ *
12
+ * Step 10 lights up:
13
+ *
14
+ * - The remaining slot props (`customMessageActions`,
15
+ * `customMessageBubble`, `customInputToolbarItems`).
16
+ * - The server-toggle precedence (§8.4) — the resolved boolean stack
17
+ * is computed inside `ChatShell` from `useAIHub().featureToggles +
18
+ * the prop overrides we forward here.
19
+ * - The theme props (`defaultTheme`, `showThemeSwitcher`) — these flow
20
+ * through the provider (theme_default is a server-config override).
21
+ *
22
+ * @see SPECIFICATIONS.md §7.3 — `<DataClubAIHub />` props
23
+ * @see SPECIFICATIONS.md §5 — per-customer wrapper shape
24
+ * @see ui-sketches/03-chat.md — the chat layout
25
+ * @see ui-sketches/00-shell.md — the shell chrome
26
+ */
27
+ import { useState } from "react";
28
+ import { AIHubProvider } from "../../context/AIHubProvider.js";
29
+ import { AuthGate } from "../AuthGate/index.js";
30
+ import { ChatShell } from "../ChatShell/index.js";
31
+ import { DataClubAIHubAdmin } from "../DataClubAIHubAdmin/index.js";
32
+ /**
33
+ * Renders the monolith.
34
+ *
35
+ * @param props - see `DataClubAIHubProps`.
36
+ * @returns the rendered component.
37
+ */
38
+ export function DataClubAIHub(props) {
39
+ const baseUrl = props.baseUrl ?? "/api/ai-hub";
40
+ return (_jsx(AIHubProvider, { baseUrl: baseUrl, ...(props.defaultTheme !== undefined ? { defaultTheme: props.defaultTheme } : {}), children: _jsx(AuthGate, { ...(props.productName !== undefined ? { productName: props.productName } : {}), ...(props.usernamePlaceholder !== undefined
41
+ ? { usernamePlaceholder: props.usernamePlaceholder }
42
+ : {}), ...(props.texts !== undefined ? { texts: props.texts } : {}), ...(props.loginClassNames !== undefined
43
+ ? { loginClassNames: props.loginClassNames }
44
+ : {}), ...(props.changePasswordClassNames !== undefined
45
+ ? { changePasswordClassNames: props.changePasswordClassNames }
46
+ : {}), children: _jsx(AuthedShell, { props: props }) }) }));
47
+ }
48
+ /**
49
+ * Internal helper that owns the chat-vs-admin route state inside the
50
+ * authenticated tree. Lives here (rather than in `ChatShell` or
51
+ * `DataClubAIHubAdmin`) because the admin <-> chat swap is monolith-
52
+ * specific behavior — Tier-3 wrappers handle navigation themselves and
53
+ * compose `<AIHub.AdminShell />` directly when needed.
54
+ *
55
+ * Kept as a function component so React's hook ordering is well-defined
56
+ * and the route state survives across AuthGate's children rerenders.
57
+ *
58
+ * @param hostProps - destructured component-props wrapper.
59
+ * @param hostProps.props - the monolith's full prop bag, forwarded to
60
+ * ChatShell (and selectively to `DataClubAIHubAdmin` in admin mode).
61
+ * @returns either the chat shell or the admin shell.
62
+ */
63
+ function AuthedShell({ props }) {
64
+ const [view, setView] = useState("chat");
65
+ if (view === "admin") {
66
+ return (_jsx(DataClubAIHubAdmin, { ...(props.texts !== undefined ? { texts: props.texts } : {}), ...(props.productName !== undefined
67
+ ? { productName: props.productName }
68
+ : {}), ...(props.customShellHeaderLeft !== undefined
69
+ ? { customShellHeaderLeft: props.customShellHeaderLeft }
70
+ : {}), onExit: () => setView("chat") }));
71
+ }
72
+ return (_jsx(ChatShell, { onOpenAdmin: () => setView("admin"), ...(props.productName !== undefined ? { productName: props.productName } : {}), ...(props.customShellHeaderLeft !== undefined
73
+ ? { customShellHeaderLeft: props.customShellHeaderLeft }
74
+ : {}), ...(props.customShellFooter !== undefined
75
+ ? { customShellFooter: props.customShellFooter }
76
+ : {}), ...(props.customHeaderContent !== undefined
77
+ ? { customHeaderContent: props.customHeaderContent }
78
+ : {}), ...(props.customSidebarHeader !== undefined
79
+ ? { customSidebarHeader: props.customSidebarHeader }
80
+ : {}), ...(props.customSidebarFooter !== undefined
81
+ ? { customSidebarFooter: props.customSidebarFooter }
82
+ : {}), ...(props.customMessageActions !== undefined
83
+ ? { customMessageActions: props.customMessageActions }
84
+ : {}), ...(props.customMessageBubble !== undefined
85
+ ? { customMessageBubble: props.customMessageBubble }
86
+ : {}), ...(props.customInputToolbarItems !== undefined
87
+ ? { customInputToolbarItems: props.customInputToolbarItems }
88
+ : {}), ...(props.showAgentsPicker !== undefined
89
+ ? { showAgentsPicker: props.showAgentsPicker }
90
+ : {}), ...(props.initialAgentId !== undefined
91
+ ? { initialAgentId: props.initialAgentId }
92
+ : {}), ...(props.initialSessionId !== undefined
93
+ ? { initialSessionId: props.initialSessionId }
94
+ : {}), ...(props.sessions !== undefined ? { showSessionsPanel: props.sessions } : {}), ...(props.sessionsPanelCollapsible !== undefined
95
+ ? { sessionsPanelCollapsible: props.sessionsPanelCollapsible }
96
+ : {}), ...(props.sessionsPanelResizable !== undefined
97
+ ? { sessionsPanelResizable: props.sessionsPanelResizable }
98
+ : {}), ...(props.sessionsPanelPosition !== undefined
99
+ ? { sessionsPanelPosition: props.sessionsPanelPosition }
100
+ : {}), ...(props.sessionsPanelWidthPercent !== undefined
101
+ ? { sessionsPanelWidthPercent: props.sessionsPanelWidthPercent }
102
+ : {}), ...(props.userInput !== undefined ? { showInput: props.userInput } : {}), ...(props.showCreateSessionButton !== undefined
103
+ ? { showCreateSessionButton: props.showCreateSessionButton }
104
+ : {}), ...(props.showEffortControl !== undefined
105
+ ? { showEffortControl: props.showEffortControl }
106
+ : {}), ...(props.showStopButton !== undefined
107
+ ? { showStopButton: props.showStopButton }
108
+ : {}), ...(props.showToolCalls !== undefined
109
+ ? { showToolCalls: props.showToolCalls }
110
+ : {}), ...(props.showReasoning !== undefined
111
+ ? { showReasoning: props.showReasoning }
112
+ : {}), ...(props.showSystemMessages !== undefined
113
+ ? { showSystemMessages: props.showSystemMessages }
114
+ : {}), ...(props.showTpmNotice !== undefined
115
+ ? { showTpmNotice: props.showTpmNotice }
116
+ : {}), ...(props.showScrollToPresentButton !== undefined
117
+ ? { showScrollToPresentButton: props.showScrollToPresentButton }
118
+ : {}), ...(props.showTurnStatus !== undefined
119
+ ? { showTurnStatus: props.showTurnStatus }
120
+ : {}), ...(props.showThemeSwitcher !== undefined
121
+ ? { showThemeSwitcher: props.showThemeSwitcher }
122
+ : {}), ...(props.texts !== undefined ? { texts: props.texts } : {}), ...(props.className !== undefined ? { className: props.className } : {}) }));
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DataClubAIHub/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `<AgentEditorModal />` — shared create + edit modal for the Agents sub-page
3
+ * ([06-admin-agents.md]).
4
+ *
5
+ * Required fields: `display_name` and `letta_agent_id`. **Model / provider /
6
+ * system prompt / tools / memory blocks are intentionally absent** — they
7
+ * live in Letta's ADE per §1, §6.4.1.
8
+ *
9
+ * Step-12.5 — adds an optional "Specialized agent" sub-section below the
10
+ * required fields:
11
+ *
12
+ * - `sandbox_seed_name` — name of a folder under `AI_HUB_FILES_DIR/seeds/`
13
+ * to copy into each new session's working directory.
14
+ * - `fork_source_conversation_id` — Letta conversation id to fork from
15
+ * at session create.
16
+ *
17
+ * Both new fields are optional and independent — see
18
+ * [docs/server/session-sandboxes.md](../../../../../docs/server/session-sandboxes.md).
19
+ *
20
+ * The modal owns local validation (required fields) + the in-flight submit
21
+ * button label; the parent page owns the network call so it can swap the
22
+ * row in / out of its table state on success.
23
+ *
24
+ * Errors are surfaced two ways: inline on the relevant field when the server
25
+ * returns a field-targeted error code (`letta_agent_not_found`,
26
+ * `seed_name_invalid`, `seed_dir_not_found`, `fork_source_not_found`,
27
+ * `fork_source_agent_mismatch`), and as a generic banner above the buttons
28
+ * for anything else.
29
+ *
30
+ * @see SPECIFICATIONS.md §6.3.4 — admin agents endpoints
31
+ * @see ui-sketches/06-admin-agents.md — modal layout
32
+ * @see docs/server/session-sandboxes.md — Step-12.5 specialized-agent levers
33
+ */
34
+ import { type ReactNode } from "react";
35
+ import type { AIHubAdminTexts } from "../../auth/texts.js";
36
+ /** Modal mode — create-new vs. edit-existing. */
37
+ export type AgentEditorMode = "create" | "edit";
38
+ /** Initial values for the edit variant. */
39
+ interface EditorInitial {
40
+ displayName: string;
41
+ lettaAgentId: string;
42
+ /** Step-12.5 — null when no sandbox configured for this agent. */
43
+ sandboxSeedName: string | null;
44
+ /** Step-12.5 — null when no fork source configured for this agent. */
45
+ forkSourceConversationId: string | null;
46
+ }
47
+ /** Submit-body shape passed up to the parent page. */
48
+ export interface AgentEditorSubmitBody {
49
+ displayName: string;
50
+ lettaAgentId: string;
51
+ /**
52
+ * Step-12.5 — `null` when the admin cleared the field (or left it blank);
53
+ * `string` when present. The parent's `createAdminAgent` / `patchAdminAgent`
54
+ * call forwards this verbatim — null becomes a `sandbox_seed_name: null`
55
+ * over the wire, which the server treats as "clear the column".
56
+ */
57
+ sandboxSeedName: string | null;
58
+ /** Step-12.5 — same shape semantics as `sandboxSeedName`. */
59
+ forkSourceConversationId: string | null;
60
+ }
61
+ /** Props for `<AgentEditorModal />`. */
62
+ export interface AgentEditorModalProps {
63
+ /** Which variant to render. */
64
+ mode: AgentEditorMode;
65
+ /**
66
+ * Initial form values. Required on `mode === "edit"`; ignored on
67
+ * `mode === "create"`.
68
+ */
69
+ initial?: EditorInitial;
70
+ /** Resolved admin texts. */
71
+ texts: AIHubAdminTexts;
72
+ /**
73
+ * Submits the form. Throws the SDK's `AIHubRequestError` on failure
74
+ * (the modal surfaces it inline / as a banner depending on the error
75
+ * code).
76
+ */
77
+ onSubmit: (body: AgentEditorSubmitBody) => Promise<void>;
78
+ /** Dismisses the modal without submitting. */
79
+ onCancel: () => void;
80
+ }
81
+ /**
82
+ * Renders the shared create / edit form.
83
+ *
84
+ * @param props - see {@link AgentEditorModalProps}.
85
+ * @returns the modal markup.
86
+ */
87
+ export declare function AgentEditorModal(props: AgentEditorModalProps): ReactNode;
88
+ export {};
89
+ //# sourceMappingURL=AgentEditorModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentEditorModal.d.ts","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/AgentEditorModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,iDAAiD;AACjD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,CAAC;AAgBhD,2CAA2C;AAC3C,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sEAAsE;IACtE,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,sDAAsD;AACtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6DAA6D;IAC7D,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,wCAAwC;AACxC,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,4BAA4B;IAC5B,KAAK,EAAE,eAAe,CAAC;IACvB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CA4YxE"}
@@ -0,0 +1,199 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `<AgentEditorModal />` — shared create + edit modal for the Agents sub-page
4
+ * ([06-admin-agents.md]).
5
+ *
6
+ * Required fields: `display_name` and `letta_agent_id`. **Model / provider /
7
+ * system prompt / tools / memory blocks are intentionally absent** — they
8
+ * live in Letta's ADE per §1, §6.4.1.
9
+ *
10
+ * Step-12.5 — adds an optional "Specialized agent" sub-section below the
11
+ * required fields:
12
+ *
13
+ * - `sandbox_seed_name` — name of a folder under `AI_HUB_FILES_DIR/seeds/`
14
+ * to copy into each new session's working directory.
15
+ * - `fork_source_conversation_id` — Letta conversation id to fork from
16
+ * at session create.
17
+ *
18
+ * Both new fields are optional and independent — see
19
+ * [docs/server/session-sandboxes.md](../../../../../docs/server/session-sandboxes.md).
20
+ *
21
+ * The modal owns local validation (required fields) + the in-flight submit
22
+ * button label; the parent page owns the network call so it can swap the
23
+ * row in / out of its table state on success.
24
+ *
25
+ * Errors are surfaced two ways: inline on the relevant field when the server
26
+ * returns a field-targeted error code (`letta_agent_not_found`,
27
+ * `seed_name_invalid`, `seed_dir_not_found`, `fork_source_not_found`,
28
+ * `fork_source_agent_mismatch`), and as a generic banner above the buttons
29
+ * for anything else.
30
+ *
31
+ * @see SPECIFICATIONS.md §6.3.4 — admin agents endpoints
32
+ * @see ui-sketches/06-admin-agents.md — modal layout
33
+ * @see docs/server/session-sandboxes.md — Step-12.5 specialized-agent levers
34
+ */
35
+ import { useEffect, useMemo, useRef, useState } from "react";
36
+ import { AIHubRequestError } from "../../client/AIHubClient.js";
37
+ import { useAIHub } from "../../context/useAIHub.js";
38
+ /** Derives the initial fork mode from a stored fork-source value. */
39
+ function initialForkMode(value) {
40
+ if (!value)
41
+ return "none";
42
+ return value.startsWith("rmsg-") ? "rotating" : "manual";
43
+ }
44
+ /**
45
+ * Renders the shared create / edit form.
46
+ *
47
+ * @param props - see {@link AgentEditorModalProps}.
48
+ * @returns the modal markup.
49
+ */
50
+ export function AgentEditorModal(props) {
51
+ const isEdit = props.mode === "edit";
52
+ const [displayName, setDisplayName] = useState(props.initial?.displayName ?? "");
53
+ const [lettaAgentId, setLettaAgentId] = useState(props.initial?.lettaAgentId ?? "");
54
+ // Step-12.5 — controlled inputs, empty string = "field cleared".
55
+ const [sandboxSeedName, setSandboxSeedName] = useState(props.initial?.sandboxSeedName ?? "");
56
+ // Base-conversation control: a mode + the value for the active mode. The
57
+ // stored `fork_source_conversation_id` is either an `rmsg-…` reference or a
58
+ // raw `conv-…` id; we split it back into mode + value for editing.
59
+ const initialFork = props.initial?.forkSourceConversationId ?? null;
60
+ const [forkMode, setForkMode] = useState(initialForkMode(initialFork));
61
+ const [selectedRmsgId, setSelectedRmsgId] = useState(initialFork && initialFork.startsWith("rmsg-") ? initialFork : null);
62
+ const [manualConvId, setManualConvId] = useState(initialFork && !initialFork.startsWith("rmsg-") ? initialFork : "");
63
+ const [rmsgList, setRmsgList] = useState(null);
64
+ const [rmsgSearch, setRmsgSearch] = useState("");
65
+ const { client } = useAIHub();
66
+ const [nameError, setNameError] = useState(null);
67
+ const [idError, setIdError] = useState(null);
68
+ const [seedError, setSeedError] = useState(null);
69
+ const [forkError, setForkError] = useState(null);
70
+ const [banner, setBanner] = useState(null);
71
+ const [submitting, setSubmitting] = useState(false);
72
+ const firstFieldRef = useRef(null);
73
+ useEffect(() => {
74
+ firstFieldRef.current?.focus();
75
+ }, []);
76
+ // Prefetch the rotating-message catalog so the "Rotating message" picker is
77
+ // ready. Best-effort: an empty list just shows the empty-state copy.
78
+ useEffect(() => {
79
+ let cancelled = false;
80
+ void (async () => {
81
+ try {
82
+ const rows = await client.listAdminRotatingMessages();
83
+ if (!cancelled)
84
+ setRmsgList(rows.filter((r) => !r.is_archived));
85
+ }
86
+ catch {
87
+ if (!cancelled)
88
+ setRmsgList([]);
89
+ }
90
+ })();
91
+ return () => {
92
+ cancelled = true;
93
+ };
94
+ }, [client]);
95
+ /** Rotating messages matching the search box (by name or id). */
96
+ const filteredRmsgs = useMemo(() => {
97
+ const list = rmsgList ?? [];
98
+ const q = rmsgSearch.trim().toLowerCase();
99
+ if (q.length === 0)
100
+ return list;
101
+ return list.filter((r) => r.display_name.toLowerCase().includes(q) || r.id.toLowerCase().includes(q));
102
+ }, [rmsgList, rmsgSearch]);
103
+ /** The fork-source value to submit, derived from the active mode. */
104
+ function computeForkValue() {
105
+ if (forkMode === "none")
106
+ return null;
107
+ if (forkMode === "rotating")
108
+ return selectedRmsgId;
109
+ const trimmed = manualConvId.trim();
110
+ return trimmed.length > 0 ? trimmed : null;
111
+ }
112
+ async function handleSubmit(event) {
113
+ event.preventDefault();
114
+ setBanner(null);
115
+ setNameError(null);
116
+ setIdError(null);
117
+ setSeedError(null);
118
+ setForkError(null);
119
+ const trimmedName = displayName.trim();
120
+ const trimmedId = lettaAgentId.trim();
121
+ const trimmedSeed = sandboxSeedName.trim();
122
+ if (trimmedName.length === 0) {
123
+ setNameError(props.texts.agentNameRequiredError);
124
+ return;
125
+ }
126
+ if (trimmedId.length === 0) {
127
+ setIdError(props.texts.agentLettaIdRequiredError);
128
+ return;
129
+ }
130
+ setSubmitting(true);
131
+ try {
132
+ await props.onSubmit({
133
+ displayName: trimmedName,
134
+ lettaAgentId: trimmedId,
135
+ sandboxSeedName: trimmedSeed.length > 0 ? trimmedSeed : null,
136
+ forkSourceConversationId: computeForkValue(),
137
+ });
138
+ }
139
+ catch (err) {
140
+ // Field-targeted error codes go inline; everything else goes
141
+ // to the generic banner.
142
+ if (err instanceof AIHubRequestError) {
143
+ switch (err.code) {
144
+ case "letta_agent_not_found":
145
+ setIdError(props.texts.agentLettaIdNotFoundError);
146
+ break;
147
+ case "seed_name_invalid":
148
+ setSeedError(props.texts.agentSandboxSeedInvalidError);
149
+ break;
150
+ case "seed_dir_not_found":
151
+ setSeedError(props.texts.agentSandboxSeedNotFoundError);
152
+ break;
153
+ case "fork_source_not_found":
154
+ setForkError(props.texts.agentForkSourceNotFoundError);
155
+ break;
156
+ case "fork_source_agent_mismatch":
157
+ setForkError(props.texts.agentForkSourceAgentMismatchError);
158
+ break;
159
+ case "rotating_message_not_found":
160
+ setForkError(props.texts.agentForkSourceRotatingNotFoundError);
161
+ break;
162
+ case "rotating_message_agent_mismatch":
163
+ setForkError(props.texts.agentForkSourceRotatingMismatchError);
164
+ break;
165
+ default: {
166
+ const message = err.message.length > 0
167
+ ? err.message
168
+ : props.texts.agentSubmitGenericError;
169
+ setBanner(message);
170
+ }
171
+ }
172
+ }
173
+ else {
174
+ const message = err instanceof Error && err.message.length > 0
175
+ ? err.message
176
+ : props.texts.agentSubmitGenericError;
177
+ setBanner(message);
178
+ }
179
+ setSubmitting(false);
180
+ }
181
+ }
182
+ const titleText = isEdit
183
+ ? props.texts.editAgentModalTitle.replace("{name}", props.initial?.displayName ?? "")
184
+ : props.texts.createAgentModalTitle;
185
+ const submitText = submitting
186
+ ? props.texts.agentModalSubmittingButton
187
+ : isEdit
188
+ ? props.texts.agentModalSaveButton
189
+ : props.texts.agentModalCreateButton;
190
+ return (_jsx("div", { className: "data-club-ai-hub-admin__modal-backdrop", role: "presentation", onMouseDown: (event) => {
191
+ if (event.target === event.currentTarget)
192
+ props.onCancel();
193
+ }, children: _jsxs("div", { className: "data-club-ai-hub-admin__modal", role: "dialog", "aria-modal": "true", "aria-labelledby": "agent-editor-title", "data-testid": `admin-agent-${props.mode}-modal`, children: [_jsx("h2", { id: "agent-editor-title", className: "data-club-ai-hub-admin__modal-title", children: titleText }), _jsxs("form", { onSubmit: (event) => void handleSubmit(event), noValidate: true, children: [_jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.agentNameLabel }), _jsx("input", { ref: firstFieldRef, type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-name-input", value: displayName, onChange: (event) => setDisplayName(event.target.value), required: true, maxLength: 255, disabled: submitting }), _jsx("span", { className: "data-club-ai-hub-admin__form-helper", children: props.texts.agentNameHelper }), nameError !== null ? (_jsx("span", { className: "data-club-ai-hub-admin__form-error", role: "alert", "data-testid": "admin-agent-name-error", children: nameError })) : null] }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.agentLettaIdLabel }), _jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-letta-id-input", value: lettaAgentId, onChange: (event) => setLettaAgentId(event.target.value), required: true, maxLength: 255, disabled: submitting }), _jsx("span", { className: "data-club-ai-hub-admin__form-helper", children: isEdit
194
+ ? props.texts.agentLettaIdReassignHelper
195
+ : props.texts.agentLettaIdHelper }), idError !== null ? (_jsx("span", { className: "data-club-ai-hub-admin__form-error", role: "alert", "data-testid": "admin-agent-letta-id-error", children: idError })) : null] }), _jsx("hr", { className: "data-club-ai-hub-admin__form-divider" }), _jsx("h3", { className: "data-club-ai-hub-admin__form-subheading", "data-testid": "admin-agent-specialized-heading", children: props.texts.agentSpecializedSectionHeading }), _jsx("p", { className: "data-club-ai-hub-admin__form-section-helper", children: props.texts.agentSpecializedSectionHelper }), _jsxs("label", { className: "data-club-ai-hub-admin__form-field", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.agentSandboxSeedLabel }), _jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-sandbox-seed-input", value: sandboxSeedName, onChange: (event) => setSandboxSeedName(event.target.value), maxLength: 128, disabled: submitting }), _jsx("span", { className: "data-club-ai-hub-admin__form-helper", children: props.texts.agentSandboxSeedHelper }), seedError !== null ? (_jsx("span", { className: "data-club-ai-hub-admin__form-error", role: "alert", "data-testid": "admin-agent-sandbox-seed-error", children: seedError })) : null] }), _jsxs("div", { className: "data-club-ai-hub-admin__form-field", "data-testid": "admin-agent-fork-source", children: [_jsx("span", { className: "data-club-ai-hub-admin__form-label", children: props.texts.agentForkSourceLabel }), _jsxs("select", { className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-fork-mode", value: forkMode, onChange: (event) => setForkMode(event.target.value), disabled: submitting, children: [_jsx("option", { value: "none", children: props.texts.agentForkSourceModeNone }), _jsx("option", { value: "rotating", children: props.texts.agentForkSourceModeRotating }), _jsx("option", { value: "manual", children: props.texts.agentForkSourceModeManual })] }), forkMode === "rotating" ? (_jsxs("div", { className: "data-club-ai-hub-admin__fork-rotating", children: [_jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-fork-rotating-search", placeholder: props.texts.agentForkSourceRotatingSearchPlaceholder, value: rmsgSearch, onChange: (event) => setRmsgSearch(event.target.value), disabled: submitting }), filteredRmsgs.length === 0 ? (_jsx("p", { className: "data-club-ai-hub-admin__form-helper", "data-testid": "admin-agent-fork-rotating-empty", children: props.texts.agentForkSourceRotatingEmpty })) : (_jsx("ul", { className: "data-club-ai-hub-admin__fork-rotating-list", "data-testid": "admin-agent-fork-rotating-list", role: "listbox", children: filteredRmsgs.map((r) => (_jsx("li", { children: _jsxs("button", { type: "button", role: "option", "aria-selected": selectedRmsgId === r.id, className: selectedRmsgId === r.id
196
+ ? "data-club-ai-hub-admin__fork-rotating-item data-club-ai-hub-admin__fork-rotating-item--selected"
197
+ : "data-club-ai-hub-admin__fork-rotating-item", "data-testid": `admin-agent-fork-rotating-option-${r.id}`, onClick: () => setSelectedRmsgId(r.id), disabled: submitting, children: [_jsx("span", { children: r.display_name }), _jsx("code", { className: "data-club-ai-hub-admin__mono", children: r.id })] }) }, r.id))) }))] })) : null, forkMode === "manual" ? (_jsx("input", { type: "text", className: "data-club-ai-hub-admin__form-input", "data-testid": "admin-agent-fork-source-input", placeholder: "conv-\u2026", value: manualConvId, onChange: (event) => setManualConvId(event.target.value), maxLength: 255, disabled: submitting })) : null, _jsx("span", { className: "data-club-ai-hub-admin__form-helper", children: props.texts.agentForkSourceHelper }), forkError !== null ? (_jsx("span", { className: "data-club-ai-hub-admin__form-error", role: "alert", "data-testid": "admin-agent-fork-source-error", children: forkError })) : null] }), banner !== null ? (_jsx("div", { className: "data-club-ai-hub-admin__error", role: "alert", "data-testid": "admin-agent-modal-banner", children: banner })) : null, _jsxs("div", { className: "data-club-ai-hub-admin__modal-actions", children: [_jsx("button", { type: "button", className: "data-club-ai-hub-admin__button", "data-testid": "admin-agent-modal-cancel", onClick: props.onCancel, disabled: submitting, children: props.texts.agentModalCancelButton }), _jsx("button", { type: "submit", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-agent-modal-submit", disabled: submitting, children: submitText })] })] })] }) }));
198
+ }
199
+ //# sourceMappingURL=AgentEditorModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentEditorModal.js","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/AgentEditorModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `<AdminAgentsPage />` — the Agents sub-page mounted inside
3
+ * `<DataClubAIHubAdmin />` ([06-admin-agents.md]).
4
+ *
5
+ * Lists the ai-hub agents catalog with per-row `[Edit]` + `[Archive]` /
6
+ * `[Unarchive]` actions, top-right `[+ Create agent]` + `[↗ Open Letta ADE]`,
7
+ * and a `[☐ Show archived]` toggle. **No TPM⚙ button** — TPM-recovery was
8
+ * removed in Step 11.5 (§6.5); the column is retained on the DB schema but
9
+ * the UI doesn't surface it. **No 🗑 button** — agents cannot be hard-deleted
10
+ * in v1 (§6.3.4).
11
+ *
12
+ * Visible to `power_user`+ per §8.2. The component itself does not gate
13
+ * — that's the shell's job — but it expects to be mounted only inside the
14
+ * admin shell.
15
+ *
16
+ * @see SPECIFICATIONS.md §6.3.4 / §8.3 / §11
17
+ * @see ui-sketches/06-admin-agents.md
18
+ */
19
+ import { type ReactNode } from "react";
20
+ import type { AIHubAdminTexts } from "../../auth/texts.js";
21
+ /** Props for `<AdminAgentsPage />`. */
22
+ export interface AdminAgentsPageProps {
23
+ /** Resolved admin texts. */
24
+ texts: AIHubAdminTexts;
25
+ }
26
+ /**
27
+ * Renders the Agents sub-page.
28
+ *
29
+ * @param props - see {@link AdminAgentsPageProps}.
30
+ * @returns the rendered page.
31
+ */
32
+ export declare function AdminAgentsPage(props: AdminAgentsPageProps): ReactNode;
33
+ //# sourceMappingURL=AgentsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentsPage.d.ts","sourceRoot":"","sources":["../../../src/components/DataClubAIHubAdmin/AgentsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA4B3D,uCAAuC;AACvC,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAyRtE"}
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `<AdminAgentsPage />` — the Agents sub-page mounted inside
4
+ * `<DataClubAIHubAdmin />` ([06-admin-agents.md]).
5
+ *
6
+ * Lists the ai-hub agents catalog with per-row `[Edit]` + `[Archive]` /
7
+ * `[Unarchive]` actions, top-right `[+ Create agent]` + `[↗ Open Letta ADE]`,
8
+ * and a `[☐ Show archived]` toggle. **No TPM⚙ button** — TPM-recovery was
9
+ * removed in Step 11.5 (§6.5); the column is retained on the DB schema but
10
+ * the UI doesn't surface it. **No 🗑 button** — agents cannot be hard-deleted
11
+ * in v1 (§6.3.4).
12
+ *
13
+ * Visible to `power_user`+ per §8.2. The component itself does not gate
14
+ * — that's the shell's job — but it expects to be mounted only inside the
15
+ * admin shell.
16
+ *
17
+ * @see SPECIFICATIONS.md §6.3.4 / §8.3 / §11
18
+ * @see ui-sketches/06-admin-agents.md
19
+ */
20
+ import { useEffect, useMemo, useState } from "react";
21
+ import { useAIHub } from "../../context/useAIHub.js";
22
+ import { useAIHubAuth } from "../../context/useAIHubAuth.js";
23
+ import { AgentEditorModal, } from "./AgentEditorModal.js";
24
+ /** Resolves the deployment's ADE URL or derives one from the base URL. */
25
+ function deriveAdeUrl(adeUrl) {
26
+ if (!adeUrl)
27
+ return null;
28
+ return adeUrl.replace(/\/$/, "");
29
+ }
30
+ /** Sort comparator — alphabetical by display_name, stable. */
31
+ function byDisplayName(a, b) {
32
+ return a.display_name.localeCompare(b.display_name);
33
+ }
34
+ /**
35
+ * Renders the Agents sub-page.
36
+ *
37
+ * @param props - see {@link AdminAgentsPageProps}.
38
+ * @returns the rendered page.
39
+ */
40
+ export function AdminAgentsPage(props) {
41
+ const { client } = useAIHub();
42
+ const auth = useAIHubAuth();
43
+ const adeUrl = deriveAdeUrl(auth.deployment?.letta_ade_url);
44
+ const [agents, setAgents] = useState(null);
45
+ const [loadError, setLoadError] = useState(null);
46
+ const [showArchived, setShowArchived] = useState(false);
47
+ const [editor, setEditor] = useState({ kind: "closed" });
48
+ useEffect(() => {
49
+ let cancelled = false;
50
+ void (async () => {
51
+ try {
52
+ const rows = await client.listAdminAgents();
53
+ if (!cancelled) {
54
+ setAgents([...rows].sort(byDisplayName));
55
+ setLoadError(null);
56
+ }
57
+ }
58
+ catch (err) {
59
+ if (!cancelled) {
60
+ setLoadError(err instanceof Error && err.message.length > 0
61
+ ? err.message
62
+ : props.texts.agentsGenericError);
63
+ }
64
+ }
65
+ })();
66
+ return () => {
67
+ cancelled = true;
68
+ };
69
+ }, [client, props.texts.agentsGenericError]);
70
+ const visibleAgents = useMemo(() => {
71
+ if (agents === null)
72
+ return null;
73
+ return showArchived ? agents : agents.filter((a) => !a.is_archived);
74
+ }, [agents, showArchived]);
75
+ async function handleCreateSubmit(body) {
76
+ const created = await client.createAdminAgent({
77
+ displayName: body.displayName,
78
+ lettaAgentId: body.lettaAgentId,
79
+ sandboxSeedName: body.sandboxSeedName,
80
+ forkSourceConversationId: body.forkSourceConversationId,
81
+ });
82
+ setAgents((prev) => {
83
+ const next = prev === null ? [created] : [...prev, created];
84
+ return next.sort(byDisplayName);
85
+ });
86
+ setEditor({ kind: "closed" });
87
+ }
88
+ async function handleEditSubmit(target, body) {
89
+ const updated = await client.patchAdminAgent(target.id, {
90
+ displayName: body.displayName,
91
+ lettaAgentId: body.lettaAgentId,
92
+ sandboxSeedName: body.sandboxSeedName,
93
+ forkSourceConversationId: body.forkSourceConversationId,
94
+ });
95
+ setAgents((prev) => prev === null
96
+ ? [updated]
97
+ : prev.map((a) => (a.id === updated.id ? updated : a)).sort(byDisplayName));
98
+ setEditor({ kind: "closed" });
99
+ }
100
+ async function handleArchive(target) {
101
+ const prompt = props.texts.agentArchiveConfirmPrompt.replace("{name}", target.display_name);
102
+ // Native confirm is fine for v1 per [06-admin-agents.md].
103
+ // eslint-disable-next-line no-alert
104
+ const ok = typeof window !== "undefined" && typeof window.confirm === "function"
105
+ ? window.confirm(prompt)
106
+ : true;
107
+ if (!ok)
108
+ return;
109
+ const updated = await client.patchAdminAgent(target.id, { isArchived: true });
110
+ setAgents((prev) => prev === null
111
+ ? [updated]
112
+ : prev.map((a) => (a.id === updated.id ? updated : a)));
113
+ }
114
+ async function handleUnarchive(target) {
115
+ const updated = await client.patchAdminAgent(target.id, { isArchived: false });
116
+ setAgents((prev) => prev === null
117
+ ? [updated]
118
+ : prev.map((a) => (a.id === updated.id ? updated : a)));
119
+ }
120
+ return (_jsxs("div", { className: "data-club-ai-hub-admin__agents-page", "data-testid": "admin-agents-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-agents-heading", children: props.texts.agentsHeading }), _jsxs("div", { className: "data-club-ai-hub-admin__page-header-actions", children: [adeUrl !== null ? (_jsx("a", { className: "data-club-ai-hub-admin__button", "data-testid": "admin-agents-open-ade", href: adeUrl, target: "_blank", rel: "noopener noreferrer", children: props.texts.openLettaAdeButton })) : null, _jsx("button", { type: "button", className: "data-club-ai-hub-admin__button data-club-ai-hub-admin__button--primary", "data-testid": "admin-agents-create", onClick: () => setEditor({ kind: "create" }), children: props.texts.createAgentButton })] })] }), loadError !== null ? (_jsx("div", { className: "data-club-ai-hub-admin__error", "data-testid": "admin-agents-error", role: "alert", children: loadError })) : null, agents === null && loadError === null ? (_jsx("p", { className: "data-club-ai-hub-admin__loading", "data-testid": "admin-agents-loading", children: props.texts.agentsLoading })) : null, visibleAgents !== null && visibleAgents.length === 0 ? (_jsx("p", { className: "data-club-ai-hub-admin__empty", "data-testid": "admin-agents-empty", children: props.texts.agentsEmpty })) : null, visibleAgents !== null && visibleAgents.length > 0 ? (_jsxs("table", { className: "data-club-ai-hub-admin__agents-table", "data-testid": "admin-agents-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: props.texts.agentColumnName }), _jsx("th", { children: props.texts.agentColumnLettaId }), _jsx("th", { children: props.texts.agentColumnStatus }), _jsx("th", { children: props.texts.agentColumnActions })] }) }), _jsx("tbody", { children: visibleAgents.map((a) => (_jsxs("tr", { "data-testid": `admin-agent-row-${a.id}`, "data-archived": a.is_archived ? "true" : "false", className: a.is_archived
121
+ ? "data-club-ai-hub-admin__agents-row data-club-ai-hub-admin__agents-row--archived"
122
+ : "data-club-ai-hub-admin__agents-row", children: [_jsx("td", { children: a.display_name }), _jsx("td", { children: _jsx("code", { className: "data-club-ai-hub-admin__mono", children: a.letta_agent_id }) }), _jsx("td", { children: _jsx("span", { className: a.is_archived
123
+ ? "data-club-ai-hub-admin__status-pill data-club-ai-hub-admin__status-pill--archived"
124
+ : "data-club-ai-hub-admin__status-pill data-club-ai-hub-admin__status-pill--active", children: a.is_archived
125
+ ? props.texts.agentStatusArchived
126
+ : props.texts.agentStatusActive }) }), _jsxs("td", { children: [_jsx("button", { type: "button", className: "data-club-ai-hub-admin__row-action", "data-testid": `admin-agent-row-${a.id}-edit`, onClick: () => setEditor({ kind: "edit", agent: a }), children: props.texts.agentEditButton }), a.is_archived ? (_jsx("button", { type: "button", className: "data-club-ai-hub-admin__row-action", "data-testid": `admin-agent-row-${a.id}-unarchive`, onClick: () => {
127
+ void handleUnarchive(a);
128
+ }, children: props.texts.agentUnarchiveButton })) : (_jsx("button", { type: "button", className: "data-club-ai-hub-admin__row-action", "data-testid": `admin-agent-row-${a.id}-archive`, onClick: () => {
129
+ void handleArchive(a);
130
+ }, children: props.texts.agentArchiveButton }))] })] }, a.id))) })] })) : null, _jsxs("label", { className: "data-club-ai-hub-admin__filter-toggle", children: [_jsx("input", { type: "checkbox", "data-testid": "admin-agents-show-archived", checked: showArchived, onChange: (event) => setShowArchived(event.target.checked) }), _jsx("span", { children: props.texts.agentShowArchivedToggle })] }), _jsx("p", { className: "data-club-ai-hub-admin__footnote", "data-testid": "admin-agents-footnote", children: props.texts.agentsAdeFootnote }), editor.kind === "create" ? (_jsx(AgentEditorModal, { mode: "create", texts: props.texts, onSubmit: handleCreateSubmit, onCancel: () => setEditor({ kind: "closed" }) })) : null, editor.kind === "edit" ? (_jsx(AgentEditorModal, { mode: "edit", initial: {
131
+ displayName: editor.agent.display_name,
132
+ lettaAgentId: editor.agent.letta_agent_id,
133
+ sandboxSeedName: editor.agent.sandbox_seed_name,
134
+ forkSourceConversationId: editor.agent.fork_source_conversation_id,
135
+ }, texts: props.texts, onSubmit: (body) => handleEditSubmit(editor.agent, body), onCancel: () => setEditor({ kind: "closed" }) })) : null] }));
136
+ }
137
+ //# sourceMappingURL=AgentsPage.js.map