@data-club/ai-hub 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/passwordPolicy.d.ts +55 -0
- package/dist/auth/passwordPolicy.d.ts.map +1 -0
- package/dist/auth/passwordPolicy.js +63 -0
- package/dist/auth/passwordPolicy.js.map +1 -0
- package/dist/auth/texts.d.ts +815 -0
- package/dist/auth/texts.d.ts.map +1 -0
- package/dist/auth/texts.js +429 -0
- package/dist/auth/texts.js.map +1 -0
- package/dist/client/AIHubClient.d.ts +1058 -0
- package/dist/client/AIHubClient.d.ts.map +1 -0
- package/dist/client/AIHubClient.js +950 -0
- package/dist/client/AIHubClient.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/sseParser.d.ts +41 -0
- package/dist/client/sseParser.d.ts.map +1 -0
- package/dist/client/sseParser.js +153 -0
- package/dist/client/sseParser.js.map +1 -0
- package/dist/client/tokenStorage.d.ts +56 -0
- package/dist/client/tokenStorage.d.ts.map +1 -0
- package/dist/client/tokenStorage.js +116 -0
- package/dist/client/tokenStorage.js.map +1 -0
- package/dist/components/AgentsPicker/index.d.ts +70 -0
- package/dist/components/AgentsPicker/index.d.ts.map +1 -0
- package/dist/components/AgentsPicker/index.js +63 -0
- package/dist/components/AgentsPicker/index.js.map +1 -0
- package/dist/components/AuthGate/index.d.ts +79 -0
- package/dist/components/AuthGate/index.d.ts.map +1 -0
- package/dist/components/AuthGate/index.js +61 -0
- package/dist/components/AuthGate/index.js.map +1 -0
- package/dist/components/CacheBadge/index.d.ts +88 -0
- package/dist/components/CacheBadge/index.d.ts.map +1 -0
- package/dist/components/CacheBadge/index.js +127 -0
- package/dist/components/CacheBadge/index.js.map +1 -0
- package/dist/components/ChangePassword/index.d.ts +109 -0
- package/dist/components/ChangePassword/index.d.ts.map +1 -0
- package/dist/components/ChangePassword/index.js +142 -0
- package/dist/components/ChangePassword/index.js.map +1 -0
- package/dist/components/ChatShell/ShellHeader.d.ts +44 -0
- package/dist/components/ChatShell/ShellHeader.d.ts.map +1 -0
- package/dist/components/ChatShell/ShellHeader.js +14 -0
- package/dist/components/ChatShell/ShellHeader.js.map +1 -0
- package/dist/components/ChatShell/UserMenu.d.ts +48 -0
- package/dist/components/ChatShell/UserMenu.d.ts.map +1 -0
- package/dist/components/ChatShell/UserMenu.js +86 -0
- package/dist/components/ChatShell/UserMenu.js.map +1 -0
- package/dist/components/ChatShell/index.d.ts +98 -0
- package/dist/components/ChatShell/index.d.ts.map +1 -0
- package/dist/components/ChatShell/index.js +124 -0
- package/dist/components/ChatShell/index.js.map +1 -0
- package/dist/components/DataClubAIHub/index.d.ts +132 -0
- package/dist/components/DataClubAIHub/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHub/index.js +124 -0
- package/dist/components/DataClubAIHub/index.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts +89 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js +199 -0
- package/dist/components/DataClubAIHubAdmin/AgentEditorModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts +33 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.js +137 -0
- package/dist/components/DataClubAIHubAdmin/AgentsPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts +50 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.js +93 -0
- package/dist/components/DataClubAIHubAdmin/CreateUserModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts +49 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js +94 -0
- package/dist/components/DataClubAIHubAdmin/PasswordRevealModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts +37 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js +44 -0
- package/dist/components/DataClubAIHubAdmin/ResetPasswordModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts +56 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js +158 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessageEditorModal.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts +29 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js +183 -0
- package/dist/components/DataClubAIHubAdmin/RotatingMessagesPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts +38 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js +294 -0
- package/dist/components/DataClubAIHubAdmin/SessionsOverviewPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts +36 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.js +373 -0
- package/dist/components/DataClubAIHubAdmin/SettingsPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts +47 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.js +233 -0
- package/dist/components/DataClubAIHubAdmin/UsersPage.js.map +1 -0
- package/dist/components/DataClubAIHubAdmin/index.d.ts +87 -0
- package/dist/components/DataClubAIHubAdmin/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHubAdmin/index.js +137 -0
- package/dist/components/DataClubAIHubAdmin/index.js.map +1 -0
- package/dist/components/DataClubAIHubLogin/index.d.ts +113 -0
- package/dist/components/DataClubAIHubLogin/index.d.ts.map +1 -0
- package/dist/components/DataClubAIHubLogin/index.js +123 -0
- package/dist/components/DataClubAIHubLogin/index.js.map +1 -0
- package/dist/components/EffortControl/index.d.ts +57 -0
- package/dist/components/EffortControl/index.d.ts.map +1 -0
- package/dist/components/EffortControl/index.js +84 -0
- package/dist/components/EffortControl/index.js.map +1 -0
- package/dist/components/Layout/index.d.ts +63 -0
- package/dist/components/Layout/index.d.ts.map +1 -0
- package/dist/components/Layout/index.js +45 -0
- package/dist/components/Layout/index.js.map +1 -0
- package/dist/components/MainColumn/index.d.ts +69 -0
- package/dist/components/MainColumn/index.d.ts.map +1 -0
- package/dist/components/MainColumn/index.js +47 -0
- package/dist/components/MainColumn/index.js.map +1 -0
- package/dist/components/MarkdownRenderer/index.d.ts +66 -0
- package/dist/components/MarkdownRenderer/index.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer/index.js +153 -0
- package/dist/components/MarkdownRenderer/index.js.map +1 -0
- package/dist/components/MessageInput/index.d.ts +85 -0
- package/dist/components/MessageInput/index.d.ts.map +1 -0
- package/dist/components/MessageInput/index.js +139 -0
- package/dist/components/MessageInput/index.js.map +1 -0
- package/dist/components/MessageList/index.d.ts +156 -0
- package/dist/components/MessageList/index.d.ts.map +1 -0
- package/dist/components/MessageList/index.js +352 -0
- package/dist/components/MessageList/index.js.map +1 -0
- package/dist/components/ReasoningSelector/index.d.ts +77 -0
- package/dist/components/ReasoningSelector/index.d.ts.map +1 -0
- package/dist/components/ReasoningSelector/index.js +156 -0
- package/dist/components/ReasoningSelector/index.js.map +1 -0
- package/dist/components/ReasoningView/index.d.ts +94 -0
- package/dist/components/ReasoningView/index.d.ts.map +1 -0
- package/dist/components/ReasoningView/index.js +83 -0
- package/dist/components/ReasoningView/index.js.map +1 -0
- package/dist/components/ScrollToPresentButton/index.d.ts +54 -0
- package/dist/components/ScrollToPresentButton/index.d.ts.map +1 -0
- package/dist/components/ScrollToPresentButton/index.js +44 -0
- package/dist/components/ScrollToPresentButton/index.js.map +1 -0
- package/dist/components/SessionsPanel/SessionTitleModal.d.ts +79 -0
- package/dist/components/SessionsPanel/SessionTitleModal.d.ts.map +1 -0
- package/dist/components/SessionsPanel/SessionTitleModal.js +102 -0
- package/dist/components/SessionsPanel/SessionTitleModal.js.map +1 -0
- package/dist/components/SessionsPanel/index.d.ts +100 -0
- package/dist/components/SessionsPanel/index.d.ts.map +1 -0
- package/dist/components/SessionsPanel/index.js +176 -0
- package/dist/components/SessionsPanel/index.js.map +1 -0
- package/dist/components/SystemNotice/index.d.ts +66 -0
- package/dist/components/SystemNotice/index.d.ts.map +1 -0
- package/dist/components/SystemNotice/index.js +81 -0
- package/dist/components/SystemNotice/index.js.map +1 -0
- package/dist/components/ThemeSwitcher/index.d.ts +66 -0
- package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
- package/dist/components/ThemeSwitcher/index.js +73 -0
- package/dist/components/ThemeSwitcher/index.js.map +1 -0
- package/dist/components/ToolCallView/formatContent.d.ts +36 -0
- package/dist/components/ToolCallView/formatContent.d.ts.map +1 -0
- package/dist/components/ToolCallView/formatContent.js +53 -0
- package/dist/components/ToolCallView/formatContent.js.map +1 -0
- package/dist/components/ToolCallView/index.d.ts +120 -0
- package/dist/components/ToolCallView/index.d.ts.map +1 -0
- package/dist/components/ToolCallView/index.js +104 -0
- package/dist/components/ToolCallView/index.js.map +1 -0
- package/dist/components/TpmBanner/index.d.ts +53 -0
- package/dist/components/TpmBanner/index.d.ts.map +1 -0
- package/dist/components/TpmBanner/index.js +116 -0
- package/dist/components/TpmBanner/index.js.map +1 -0
- package/dist/components/TurnStatusIndicator/index.d.ts +77 -0
- package/dist/components/TurnStatusIndicator/index.d.ts.map +1 -0
- package/dist/components/TurnStatusIndicator/index.js +122 -0
- package/dist/components/TurnStatusIndicator/index.js.map +1 -0
- package/dist/components/internal/PasswordInput.d.ts +62 -0
- package/dist/components/internal/PasswordInput.d.ts.map +1 -0
- package/dist/components/internal/PasswordInput.js +42 -0
- package/dist/components/internal/PasswordInput.js.map +1 -0
- package/dist/context/AIHubContext.d.ts +220 -0
- package/dist/context/AIHubContext.d.ts.map +1 -0
- package/dist/context/AIHubContext.js +19 -0
- package/dist/context/AIHubContext.js.map +1 -0
- package/dist/context/AIHubProvider.d.ts +75 -0
- package/dist/context/AIHubProvider.d.ts.map +1 -0
- package/dist/context/AIHubProvider.js +954 -0
- package/dist/context/AIHubProvider.js.map +1 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/theme.d.ts +43 -0
- package/dist/context/theme.d.ts.map +1 -0
- package/dist/context/theme.js +70 -0
- package/dist/context/theme.js.map +1 -0
- package/dist/context/useAIHub.d.ts +104 -0
- package/dist/context/useAIHub.d.ts.map +1 -0
- package/dist/context/useAIHub.js +63 -0
- package/dist/context/useAIHub.js.map +1 -0
- package/dist/context/useAIHubAuth.d.ts +44 -0
- package/dist/context/useAIHubAuth.d.ts.map +1 -0
- package/dist/context/useAIHubAuth.js +35 -0
- package/dist/context/useAIHubAuth.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/index.d.ts +99 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +97 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/state/affordances.d.ts +182 -0
- package/dist/state/affordances.d.ts.map +1 -0
- package/dist/state/affordances.js +189 -0
- package/dist/state/affordances.js.map +1 -0
- package/dist/state/stateReducer.d.ts +72 -0
- package/dist/state/stateReducer.d.ts.map +1 -0
- package/dist/state/stateReducer.js +122 -0
- package/dist/state/stateReducer.js.map +1 -0
- package/dist/stories/EffortControl.stories.d.ts +14 -0
- package/dist/stories/EffortControl.stories.d.ts.map +1 -0
- package/dist/stories/EffortControl.stories.js +43 -0
- package/dist/stories/EffortControl.stories.js.map +1 -0
- package/dist/stories/MarkdownRenderer.stories.d.ts +25 -0
- package/dist/stories/MarkdownRenderer.stories.d.ts.map +1 -0
- package/dist/stories/MarkdownRenderer.stories.js +178 -0
- package/dist/stories/MarkdownRenderer.stories.js.map +1 -0
- package/dist/stories/MessageBubble.stories.d.ts +21 -0
- package/dist/stories/MessageBubble.stories.d.ts.map +1 -0
- package/dist/stories/MessageBubble.stories.js +59 -0
- package/dist/stories/MessageBubble.stories.js.map +1 -0
- package/dist/stories/ReasoningView.stories.d.ts +18 -0
- package/dist/stories/ReasoningView.stories.d.ts.map +1 -0
- package/dist/stories/ReasoningView.stories.js +62 -0
- package/dist/stories/ReasoningView.stories.js.map +1 -0
- package/dist/stories/ScrollToPresentButton.stories.d.ts +18 -0
- package/dist/stories/ScrollToPresentButton.stories.d.ts.map +1 -0
- package/dist/stories/ScrollToPresentButton.stories.js +34 -0
- package/dist/stories/ScrollToPresentButton.stories.js.map +1 -0
- package/dist/stories/SystemNotice.stories.d.ts +17 -0
- package/dist/stories/SystemNotice.stories.d.ts.map +1 -0
- package/dist/stories/SystemNotice.stories.js +42 -0
- package/dist/stories/SystemNotice.stories.js.map +1 -0
- package/dist/stories/ThemeSwitcher.stories.d.ts +15 -0
- package/dist/stories/ThemeSwitcher.stories.d.ts.map +1 -0
- package/dist/stories/ThemeSwitcher.stories.js +35 -0
- package/dist/stories/ThemeSwitcher.stories.js.map +1 -0
- package/dist/stories/ToolCallView.stories.d.ts +20 -0
- package/dist/stories/ToolCallView.stories.d.ts.map +1 -0
- package/dist/stories/ToolCallView.stories.js +65 -0
- package/dist/stories/ToolCallView.stories.js.map +1 -0
- package/dist/stories/TpmBanner.stories.d.ts +24 -0
- package/dist/stories/TpmBanner.stories.d.ts.map +1 -0
- package/dist/stories/TpmBanner.stories.js +63 -0
- package/dist/stories/TpmBanner.stories.js.map +1 -0
- package/dist/stories/TurnStatusIndicator.stories.d.ts +25 -0
- package/dist/stories/TurnStatusIndicator.stories.d.ts.map +1 -0
- package/dist/stories/TurnStatusIndicator.stories.js +56 -0
- package/dist/stories/TurnStatusIndicator.stories.js.map +1 -0
- package/dist/stories/_mockProvider.d.ts +44 -0
- package/dist/stories/_mockProvider.d.ts.map +1 -0
- package/dist/stories/_mockProvider.js +84 -0
- package/dist/stories/_mockProvider.js.map +1 -0
- package/dist/types.d.ts +787 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/webcomponent/defineWebComponent.d.ts +106 -0
- package/dist/webcomponent/defineWebComponent.d.ts.map +1 -0
- package/dist/webcomponent/defineWebComponent.js +126 -0
- package/dist/webcomponent/defineWebComponent.js.map +1 -0
- package/dist/webcomponent/index.d.ts +7 -0
- package/dist/webcomponent/index.d.ts.map +1 -0
- package/dist/webcomponent/index.js +7 -0
- package/dist/webcomponent/index.js.map +1 -0
- package/package.json +63 -0
- package/src/__lint-canary__/step1-lint-canary.ts.disabled +28 -0
- package/src/auth/passwordPolicy.ts +75 -0
- package/src/auth/texts.ts +1294 -0
- package/src/client/AIHubClient.ts +1718 -0
- package/src/client/index.ts +30 -0
- package/src/client/sseParser.ts +168 -0
- package/src/client/tokenStorage.ts +131 -0
- package/src/components/AgentsPicker/index.tsx +147 -0
- package/src/components/AuthGate/index.tsx +132 -0
- package/src/components/CacheBadge/index.tsx +245 -0
- package/src/components/ChangePassword/index.tsx +375 -0
- package/src/components/ChatShell/ShellHeader.tsx +80 -0
- package/src/components/ChatShell/UserMenu.tsx +196 -0
- package/src/components/ChatShell/index.tsx +307 -0
- package/src/components/DataClubAIHub/index.tsx +300 -0
- package/src/components/DataClubAIHubAdmin/AgentEditorModal.tsx +505 -0
- package/src/components/DataClubAIHubAdmin/AgentsPage.tsx +342 -0
- package/src/components/DataClubAIHubAdmin/CreateUserModal.tsx +214 -0
- package/src/components/DataClubAIHubAdmin/PasswordRevealModal.tsx +204 -0
- package/src/components/DataClubAIHubAdmin/ResetPasswordModal.tsx +122 -0
- package/src/components/DataClubAIHubAdmin/RotatingMessageEditorModal.tsx +408 -0
- package/src/components/DataClubAIHubAdmin/RotatingMessagesPage.tsx +373 -0
- package/src/components/DataClubAIHubAdmin/SessionsOverviewPage.tsx +639 -0
- package/src/components/DataClubAIHubAdmin/SettingsPage.tsx +979 -0
- package/src/components/DataClubAIHubAdmin/UsersPage.tsx +495 -0
- package/src/components/DataClubAIHubAdmin/index.tsx +277 -0
- package/src/components/DataClubAIHubLogin/index.tsx +282 -0
- package/src/components/EffortControl/index.tsx +138 -0
- package/src/components/Layout/index.tsx +92 -0
- package/src/components/MainColumn/index.tsx +131 -0
- package/src/components/MarkdownRenderer/index.tsx +256 -0
- package/src/components/MessageInput/index.tsx +283 -0
- package/src/components/MessageList/index.tsx +753 -0
- package/src/components/ReasoningSelector/index.tsx +268 -0
- package/src/components/ReasoningView/index.tsx +183 -0
- package/src/components/ScrollToPresentButton/index.tsx +85 -0
- package/src/components/SessionsPanel/SessionTitleModal.tsx +256 -0
- package/src/components/SessionsPanel/index.tsx +406 -0
- package/src/components/SystemNotice/index.tsx +151 -0
- package/src/components/ThemeSwitcher/index.tsx +136 -0
- package/src/components/ToolCallView/formatContent.ts +50 -0
- package/src/components/ToolCallView/index.tsx +274 -0
- package/src/components/TpmBanner/index.tsx +172 -0
- package/src/components/TurnStatusIndicator/index.tsx +203 -0
- package/src/components/internal/PasswordInput.tsx +145 -0
- package/src/context/AIHubContext.ts +249 -0
- package/src/context/AIHubProvider.tsx +1084 -0
- package/src/context/index.ts +9 -0
- package/src/context/theme.ts +76 -0
- package/src/context/useAIHub.ts +151 -0
- package/src/context/useAIHubAuth.ts +65 -0
- package/src/index.ts +275 -0
- package/src/primitives/index.ts +101 -0
- package/src/state/affordances.ts +321 -0
- package/src/state/stateReducer.ts +131 -0
- package/src/stories/EffortControl.stories.tsx +63 -0
- package/src/stories/MarkdownRenderer.stories.tsx +201 -0
- package/src/stories/MessageBubble.stories.tsx +101 -0
- package/src/stories/ReasoningView.stories.tsx +81 -0
- package/src/stories/ScrollToPresentButton.stories.tsx +52 -0
- package/src/stories/SystemNotice.stories.tsx +59 -0
- package/src/stories/ThemeSwitcher.stories.tsx +55 -0
- package/src/stories/ToolCallView.stories.tsx +95 -0
- package/src/stories/TpmBanner.stories.tsx +93 -0
- package/src/stories/TurnStatusIndicator.stories.tsx +86 -0
- package/src/stories/_mockProvider.tsx +116 -0
- package/src/styles/CLASSES.md +356 -0
- package/src/styles/default.css +2937 -0
- package/src/types.ts +867 -0
- package/src/webcomponent/defineWebComponent.tsx +193 -0
- package/src/webcomponent/index.ts +11 -0
|
@@ -0,0 +1,1294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AIHubTexts` — the user-facing-string surface for every built-in screen.
|
|
3
|
+
*
|
|
4
|
+
* Per-customer wrappers pass a localized object via `texts` (on
|
|
5
|
+
* `<DataClubAIHub />` and on the standalone auth components); the components
|
|
6
|
+
* fall back to the English defaults for any key the wrapper omits. Step 8
|
|
7
|
+
* defines the auth-screen keys; Step 9 + Step 10 + Step 11 + Step 12 extend
|
|
8
|
+
* the map as their own screens land.
|
|
9
|
+
*
|
|
10
|
+
* Conventions:
|
|
11
|
+
*
|
|
12
|
+
* - Keys are namespaced (`login.signInButton`, `changePassword.saveButton`).
|
|
13
|
+
* The namespace is the screen / surface; the leaf is what the string is for.
|
|
14
|
+
* - **Defaults are English** — wrappers can ship any locale by passing
|
|
15
|
+
* `texts={{ login: { signInButton: "Přihlásit se" } }}` and so on.
|
|
16
|
+
* - Defaults are exported as a frozen object so a careless caller mutating
|
|
17
|
+
* them blows up loudly in dev instead of poisoning every render after.
|
|
18
|
+
*
|
|
19
|
+
* @see SPECIFICATIONS.md §7.2.1 — login props (texts is wrapper-localized)
|
|
20
|
+
* @see SPECIFICATIONS.md §7.3 — `<DataClubAIHub />` texts forwarding
|
|
21
|
+
* @see ui-sketches/01-login.md — the strings on the login card
|
|
22
|
+
* @see ui-sketches/02-change-password.md — the strings on the change-password card
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* User-facing strings on `<DataClubAIHubLogin />`. Every string the screen
|
|
27
|
+
* renders has a key here so wrappers can localize without forking the
|
|
28
|
+
* component.
|
|
29
|
+
*/
|
|
30
|
+
export interface AIHubLoginTexts {
|
|
31
|
+
/** Label above the username input. */
|
|
32
|
+
usernameLabel: string;
|
|
33
|
+
/** Label above the password input. */
|
|
34
|
+
passwordLabel: string;
|
|
35
|
+
/** Submit-button label (idle). */
|
|
36
|
+
signInButton: string;
|
|
37
|
+
/** Submit-button label while the request is in flight. */
|
|
38
|
+
signingInButton: string;
|
|
39
|
+
/**
|
|
40
|
+
* Footer note below the sign-in button — v1 has no self-serve reset
|
|
41
|
+
* (§8.5), this is the user-visible instruction. Plain text, not a link.
|
|
42
|
+
*/
|
|
43
|
+
forgotPasswordNote: string;
|
|
44
|
+
/** `aria-label` on the show/hide-password toggle when the password is hidden. */
|
|
45
|
+
showPasswordAriaLabel: string;
|
|
46
|
+
/** `aria-label` on the show/hide-password toggle when the password is shown. */
|
|
47
|
+
hidePasswordAriaLabel: string;
|
|
48
|
+
/** Banner shown on a 401 from `/auth/login`. */
|
|
49
|
+
invalidCredentialsError: string;
|
|
50
|
+
/** Banner shown on a transport / network failure. */
|
|
51
|
+
networkError: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* User-facing strings on `<DataClubAIHubChangePassword />` (both the forced
|
|
56
|
+
* and the voluntary variants).
|
|
57
|
+
*/
|
|
58
|
+
export interface AIHubChangePasswordTexts {
|
|
59
|
+
/** Card title at the top. */
|
|
60
|
+
title: string;
|
|
61
|
+
/** Intro message shown only on the forced variant. */
|
|
62
|
+
forcedChangePasswordIntro: string;
|
|
63
|
+
/** Label for the (voluntary-only) current-password field. */
|
|
64
|
+
currentPasswordLabel: string;
|
|
65
|
+
/** Label for the new-password field. */
|
|
66
|
+
newPasswordLabel: string;
|
|
67
|
+
/** Label for the confirm-password field. */
|
|
68
|
+
confirmPasswordLabel: string;
|
|
69
|
+
/** Submit button (idle). */
|
|
70
|
+
changePasswordButton: string;
|
|
71
|
+
/** Submit button while saving. */
|
|
72
|
+
savingButton: string;
|
|
73
|
+
/** Voluntary-only cancel button. */
|
|
74
|
+
cancelButton: string;
|
|
75
|
+
/** Inline error: confirm-password doesn't match new-password. */
|
|
76
|
+
passwordsMustMatchError: string;
|
|
77
|
+
/** Inline error: new-password shorter than the minimum length. */
|
|
78
|
+
passwordTooShortError: string;
|
|
79
|
+
/**
|
|
80
|
+
* Inline error: new-password fails the §8.5 complexity rule (≥2 of
|
|
81
|
+
* letters, digits, special characters).
|
|
82
|
+
*/
|
|
83
|
+
passwordTooSimpleError: string;
|
|
84
|
+
/** Banner shown when the server rejects the current password (voluntary). */
|
|
85
|
+
invalidCurrentPasswordError: string;
|
|
86
|
+
/** Banner shown on a transport / network failure. */
|
|
87
|
+
networkError: string;
|
|
88
|
+
/** `aria-label` on the show/hide-password toggle when the password is hidden. */
|
|
89
|
+
showPasswordAriaLabel: string;
|
|
90
|
+
/** `aria-label` on the show/hide-password toggle when the password is shown. */
|
|
91
|
+
hidePasswordAriaLabel: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* User-facing strings on the chat surface — agents picker, sessions panel,
|
|
96
|
+
* chat header, message list, input. Step 9 ships the structural-layout
|
|
97
|
+
* keys; Step 10 will add the affordance keys (TPM banner, theme switcher,
|
|
98
|
+
* tool-call card, etc.).
|
|
99
|
+
*
|
|
100
|
+
* @see ui-sketches/03-chat.md
|
|
101
|
+
*/
|
|
102
|
+
export interface AIHubChatTexts {
|
|
103
|
+
/** Heading on the agents picker. */
|
|
104
|
+
agentsPickerHeading: string;
|
|
105
|
+
/**
|
|
106
|
+
* Subtitle template — `{count}` is replaced with the per-caller session
|
|
107
|
+
* count. Pluralization is handled by the wrapper if needed.
|
|
108
|
+
*/
|
|
109
|
+
agentCardSessionsSubtitle: string;
|
|
110
|
+
/** Subtitle on agent cards with zero sessions yet. */
|
|
111
|
+
agentCardNoSessionsSubtitle: string;
|
|
112
|
+
/** Empty-state heading when the deployment has zero non-archived agents. */
|
|
113
|
+
agentsPickerEmptyHeading: string;
|
|
114
|
+
/** Empty-state body. */
|
|
115
|
+
agentsPickerEmptyBody: string;
|
|
116
|
+
/** Loading line shown on the agents picker while `/agents` is in flight. */
|
|
117
|
+
agentsPickerLoading: string;
|
|
118
|
+
/** Error banner on the agents picker when `/agents` fails. */
|
|
119
|
+
agentsPickerError: string;
|
|
120
|
+
/** Loading line on the sessions list. */
|
|
121
|
+
sessionsLoading: string;
|
|
122
|
+
/** Empty-state line when the user has no sessions for the open agent. */
|
|
123
|
+
sessionsEmpty: string;
|
|
124
|
+
/** "+ New chat" button label on the sessions panel. */
|
|
125
|
+
newSessionButton: string;
|
|
126
|
+
/** Sessions-panel "Show archived" filter label. */
|
|
127
|
+
showArchivedToggle: string;
|
|
128
|
+
/** Sessions-panel "Hide archived" filter label. */
|
|
129
|
+
hideArchivedToggle: string;
|
|
130
|
+
/** `aria-label` for the row's edit-title button. */
|
|
131
|
+
editSessionTitleAriaLabel: string;
|
|
132
|
+
/** `aria-label` for the row's archive button. */
|
|
133
|
+
archiveSessionAriaLabel: string;
|
|
134
|
+
/** `aria-label` for the row's unarchive button (archived view only). */
|
|
135
|
+
unarchiveSessionAriaLabel: string;
|
|
136
|
+
/**
|
|
137
|
+
* Archive-row `confirm()` text — `{title}` is replaced with the session
|
|
138
|
+
* title.
|
|
139
|
+
*/
|
|
140
|
+
archiveConfirmPrompt: string;
|
|
141
|
+
/** `aria-label` for the sessions-panel collapse button. */
|
|
142
|
+
collapseSessionsPanel: string;
|
|
143
|
+
/** `aria-label` for the sessions-panel reveal button (collapsed state). */
|
|
144
|
+
expandSessionsPanel: string;
|
|
145
|
+
/** `[← Agents]` back-to-picker link in the chat header. */
|
|
146
|
+
backToAgentsLink: string;
|
|
147
|
+
/** Fallback title for a session somehow rendered without one. */
|
|
148
|
+
untitledSessionFallback: string;
|
|
149
|
+
/** Body shown when no session is selected yet. */
|
|
150
|
+
noActiveSessionHint: string;
|
|
151
|
+
/** Body shown when the user opens a session with zero messages. */
|
|
152
|
+
emptyConversationHint: string;
|
|
153
|
+
/** Placeholder inside the input textarea. */
|
|
154
|
+
inputPlaceholder: string;
|
|
155
|
+
/** Send-button label. */
|
|
156
|
+
sendButton: string;
|
|
157
|
+
/** Stop-button label (generic — Step 10 adds phase-specific labels). */
|
|
158
|
+
stopButton: string;
|
|
159
|
+
/**
|
|
160
|
+
* Stop-button label shown from the moment the user clicks Stop until
|
|
161
|
+
* the server delivers `stream_end{cancelled}` — typically a few
|
|
162
|
+
* hundred ms while Letta winds the run down.
|
|
163
|
+
*/
|
|
164
|
+
stoppingButton: string;
|
|
165
|
+
/** `aria-label` on the send button. */
|
|
166
|
+
sendButtonAriaLabel: string;
|
|
167
|
+
/** `aria-label` on the stop button. */
|
|
168
|
+
stopButtonAriaLabel: string;
|
|
169
|
+
/** Modal title — new-session flow. */
|
|
170
|
+
newSessionModalTitle: string;
|
|
171
|
+
/** Modal title — edit-session-title flow. */
|
|
172
|
+
editSessionModalTitle: string;
|
|
173
|
+
/** Label above the chat-title input in the modal. */
|
|
174
|
+
sessionTitleLabel: string;
|
|
175
|
+
/** Placeholder text inside the chat-title input. */
|
|
176
|
+
sessionTitlePlaceholder: string;
|
|
177
|
+
/** Inline validation: title required (empty submit). */
|
|
178
|
+
sessionTitleRequiredError: string;
|
|
179
|
+
/** Inline validation: title too long (>80 chars). */
|
|
180
|
+
sessionTitleTooLongError: string;
|
|
181
|
+
/** Modal cancel button. */
|
|
182
|
+
modalCancelButton: string;
|
|
183
|
+
/** Modal create button (new-session). */
|
|
184
|
+
modalCreateButton: string;
|
|
185
|
+
/** Modal save button (edit-title). */
|
|
186
|
+
modalSaveButton: string;
|
|
187
|
+
/** Generic banner when a session / chat / agents request fails. */
|
|
188
|
+
genericRequestError: string;
|
|
189
|
+
/**
|
|
190
|
+
* Surfaced in `<MessageList />` when a turn ends without the agent
|
|
191
|
+
* producing any assistant output (no `assistant_delta`, no
|
|
192
|
+
* `assistant_message_complete`) AND without an explicit `error` event.
|
|
193
|
+
* Catches the "API key wrong / provider returned empty" case.
|
|
194
|
+
*/
|
|
195
|
+
noAssistantResponseError: string;
|
|
196
|
+
/** User-menu sign-out item label (minimal Step 9 user menu). */
|
|
197
|
+
signOutMenuItem: string;
|
|
198
|
+
|
|
199
|
+
/* ── Step 10 — affordance keys ─────────────────────────────────── */
|
|
200
|
+
/** Stop-button label during model-text / model-reasoning / etc. phases. */
|
|
201
|
+
stopGenerationButton: string;
|
|
202
|
+
/** Stop-button label during `tool_executing` phase. */
|
|
203
|
+
cancelToolButton: string;
|
|
204
|
+
/** Generic system-notice "Resumed." flash text. */
|
|
205
|
+
systemResumedText: string;
|
|
206
|
+
/**
|
|
207
|
+
* TPM-banner body during `waiting_provider`. `{seconds}` is replaced
|
|
208
|
+
* with the remaining countdown.
|
|
209
|
+
*/
|
|
210
|
+
tpmWaitText: string;
|
|
211
|
+
/** TPM-banner body when recovery exhausted. */
|
|
212
|
+
tpmExhaustedText: string;
|
|
213
|
+
/** TPM-banner retry button. */
|
|
214
|
+
tpmRetryButton: string;
|
|
215
|
+
/** Generic stream-error banner body for `--failed` assistant bubbles. */
|
|
216
|
+
streamFailedText: string;
|
|
217
|
+
/** Retry button on `--failed` bubbles. */
|
|
218
|
+
retryFailedButton: string;
|
|
219
|
+
/** "Stopped" stamp on cancelled bubbles. */
|
|
220
|
+
cancelledStampText: string;
|
|
221
|
+
/** `[↓ Jump to latest]` scroll-to-present button. */
|
|
222
|
+
scrollToPresentButton: string;
|
|
223
|
+
/**
|
|
224
|
+
* Reasoning view collapsed-header text WITH a known duration.
|
|
225
|
+
* `{seconds}` is replaced with the elapsed seconds (e.g. `3.2`).
|
|
226
|
+
* Used during streaming and on historical bubbles that recorded a
|
|
227
|
+
* duration; the no-duration variant is used otherwise.
|
|
228
|
+
*/
|
|
229
|
+
reasoningCollapsedHeader: string;
|
|
230
|
+
/**
|
|
231
|
+
* Reasoning view collapsed-header text when no duration is known —
|
|
232
|
+
* e.g. on historical bubbles where the wire shape doesn't carry a
|
|
233
|
+
* duration. Should NOT contain `{seconds}`.
|
|
234
|
+
*/
|
|
235
|
+
reasoningCollapsedHeaderNoDuration: string;
|
|
236
|
+
/** Reasoning view expanded-header text — same `{seconds}` rules. */
|
|
237
|
+
reasoningExpandedHeader: string;
|
|
238
|
+
/** Reasoning view expanded-header text when no duration is known. */
|
|
239
|
+
reasoningExpandedHeaderNoDuration: string;
|
|
240
|
+
/** Reasoning view expand-button `aria-label`. */
|
|
241
|
+
reasoningExpandAriaLabel: string;
|
|
242
|
+
/** Reasoning view collapse-button `aria-label`. */
|
|
243
|
+
reasoningCollapseAriaLabel: string;
|
|
244
|
+
/** Reasoning view "thinking…" placeholder while deltas are arriving. */
|
|
245
|
+
reasoningThinkingPlaceholder: string;
|
|
246
|
+
/** Tool-call card header — `running` state. */
|
|
247
|
+
toolCallRunningStatus: string;
|
|
248
|
+
/** Tool-call card header — `done` state. */
|
|
249
|
+
toolCallDoneStatus: string;
|
|
250
|
+
/** Tool-call card header — `error` state. */
|
|
251
|
+
toolCallErrorStatus: string;
|
|
252
|
+
/** Tool-call card "Input:" section label. */
|
|
253
|
+
toolCallInputLabel: string;
|
|
254
|
+
/** Tool-call card "Output:" section label. */
|
|
255
|
+
toolCallOutputLabel: string;
|
|
256
|
+
/** Tool-call card "Error:" section label. */
|
|
257
|
+
toolCallErrorLabel: string;
|
|
258
|
+
/** Tool-call card expand-button `aria-label`. */
|
|
259
|
+
toolCallExpandAriaLabel: string;
|
|
260
|
+
/** Tool-call card collapse-button `aria-label`. */
|
|
261
|
+
toolCallCollapseAriaLabel: string;
|
|
262
|
+
/** Effort dropdown label. */
|
|
263
|
+
effortLabel: string;
|
|
264
|
+
/** Effort dropdown — None. */
|
|
265
|
+
effortNone: string;
|
|
266
|
+
/** Effort dropdown — Minimal. */
|
|
267
|
+
effortMinimal: string;
|
|
268
|
+
/** Effort dropdown — Low. */
|
|
269
|
+
effortLow: string;
|
|
270
|
+
/** Effort dropdown — Medium. */
|
|
271
|
+
effortMedium: string;
|
|
272
|
+
/** Effort dropdown — High. */
|
|
273
|
+
effortHigh: string;
|
|
274
|
+
/** Effort dropdown — Extra High. */
|
|
275
|
+
effortExtraHigh: string;
|
|
276
|
+
/** Theme switcher — visible label when current theme is light. */
|
|
277
|
+
themeDarkLabel: string;
|
|
278
|
+
/** Theme switcher — visible label when current theme is dark. */
|
|
279
|
+
themeLightLabel: string;
|
|
280
|
+
/** Theme switcher — `aria-label` when current theme is light. */
|
|
281
|
+
themeSwitchToDarkAriaLabel: string;
|
|
282
|
+
/** Theme switcher — `aria-label` when current theme is dark. */
|
|
283
|
+
themeSwitchToLightAriaLabel: string;
|
|
284
|
+
|
|
285
|
+
/* ── Step 11 — user-menu admin entries ─────────────────────────── */
|
|
286
|
+
/** User-menu "Admin" item label (only rendered for `role >= power_user`). */
|
|
287
|
+
adminMenuItem: string;
|
|
288
|
+
/**
|
|
289
|
+
* User-menu "Open Letta ADE ↗" item label — opens the deployment's Letta
|
|
290
|
+
* ADE in a new browser tab. Only rendered for `role >= power_user`.
|
|
291
|
+
*/
|
|
292
|
+
openLettaAdeMenuItem: string;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* User-facing strings on `<DataClubAIHubAdmin />` — the role-gated admin UI
|
|
297
|
+
* mounted under the same shell as chat (§7.1, §8.3, [04-admin-overview.md]).
|
|
298
|
+
*
|
|
299
|
+
* Step 11 fills in the shell + Users sub-page strings; Step 12 will extend
|
|
300
|
+
* this map with `agents.*`, `sessionsOverview.*`, and `settings.*` keys
|
|
301
|
+
* without touching the existing keys (wrappers stay forward-compatible).
|
|
302
|
+
*
|
|
303
|
+
* @see ui-sketches/04-admin-overview.md
|
|
304
|
+
* @see ui-sketches/05-admin-users.md
|
|
305
|
+
*/
|
|
306
|
+
export interface AIHubAdminTexts {
|
|
307
|
+
/** `admin_nav` section heading shown above the nav list. */
|
|
308
|
+
navHeading: string;
|
|
309
|
+
/** Nav item label — Users sub-page (visible to admin / super_admin). */
|
|
310
|
+
navUsers: string;
|
|
311
|
+
/** Nav item label — Agents sub-page (visible to power_user and above). */
|
|
312
|
+
navAgents: string;
|
|
313
|
+
/** Nav item label — Sessions overview sub-page (visible to power_user and above). */
|
|
314
|
+
navSessionsOverview: string;
|
|
315
|
+
/** Nav item label — Rotating messages sub-page (visible to power_user and above). */
|
|
316
|
+
navRotatingMessages: string;
|
|
317
|
+
/** Nav item label — Settings sub-page (super_admin only). */
|
|
318
|
+
navSettings: string;
|
|
319
|
+
/**
|
|
320
|
+
* "← Back to chat" link at the bottom of the admin nav. Surfaces when
|
|
321
|
+
* the admin shell is mounted inside `<DataClubAIHub />` (the monolith
|
|
322
|
+
* passes an `onExit` callback that swaps the view); Tier-3 wrappers
|
|
323
|
+
* mounting the admin on its own route can omit `onExit` and the link
|
|
324
|
+
* stays hidden.
|
|
325
|
+
*/
|
|
326
|
+
backToChatLink: string;
|
|
327
|
+
/**
|
|
328
|
+
* @deprecated Unused since Step 12 landed the real Agents / Sessions
|
|
329
|
+
* overview / Settings pages. Retained in the interface so per-customer
|
|
330
|
+
* wrappers that overrode the string don't get a type error on upgrade;
|
|
331
|
+
* remove in v2.
|
|
332
|
+
*/
|
|
333
|
+
comingInStep12Placeholder: string;
|
|
334
|
+
|
|
335
|
+
/* ── Users sub-page ([05-admin-users.md]) ─────────────────────── */
|
|
336
|
+
/** Page heading on the Users sub-page. */
|
|
337
|
+
usersHeading: string;
|
|
338
|
+
/** "+ Create user" button label (top-right). */
|
|
339
|
+
createUserButton: string;
|
|
340
|
+
/** `users_table` column header — Username. */
|
|
341
|
+
userColumnUsername: string;
|
|
342
|
+
/** `users_table` column header — Display name. */
|
|
343
|
+
userColumnDisplay: string;
|
|
344
|
+
/** `users_table` column header — Role. */
|
|
345
|
+
userColumnRole: string;
|
|
346
|
+
/** `users_table` column header — Actions. */
|
|
347
|
+
userColumnActions: string;
|
|
348
|
+
/** Loading placeholder for the table. */
|
|
349
|
+
usersLoading: string;
|
|
350
|
+
/** Empty placeholder when the deployment somehow has zero users. */
|
|
351
|
+
usersEmpty: string;
|
|
352
|
+
/** Generic banner shown when `/admin/users` fails. */
|
|
353
|
+
usersGenericError: string;
|
|
354
|
+
/** `aria-label` for the per-row reset-password button. */
|
|
355
|
+
resetPasswordButtonLabel: string;
|
|
356
|
+
/** `aria-label` for the per-row delete button. */
|
|
357
|
+
deleteUserButtonLabel: string;
|
|
358
|
+
/** Tooltip / sr-only text on a row's `[role▼]` when admin-shield disables it. */
|
|
359
|
+
roleSelectShieldDisabledHint: string;
|
|
360
|
+
/** Tooltip / sr-only text on a row's `[role▼]` when min-count disables it. */
|
|
361
|
+
roleSelectMinCountDisabledHint: string;
|
|
362
|
+
/**
|
|
363
|
+
* Banner text shown after a server 403 on a role change — message comes
|
|
364
|
+
* from the server but we provide a fallback so empty messages don't
|
|
365
|
+
* leave the user staring at a silent revert.
|
|
366
|
+
*/
|
|
367
|
+
roleChangeForbiddenFallback: string;
|
|
368
|
+
/** Toast / inline success message after a successful role change. `{role}` is interpolated. */
|
|
369
|
+
roleChangeSuccessToast: string;
|
|
370
|
+
/** Visual marker text appended to a row whose `is_initial_password === true`. */
|
|
371
|
+
initialPasswordIndicator: string;
|
|
372
|
+
/** Role option labels (used in the dropdowns). */
|
|
373
|
+
roleOptionUser: string;
|
|
374
|
+
/** Role option labels (used in the dropdowns). */
|
|
375
|
+
roleOptionPowerUser: string;
|
|
376
|
+
/** Role option labels (used in the dropdowns). */
|
|
377
|
+
roleOptionAdmin: string;
|
|
378
|
+
/** Role option labels (used in the dropdowns). */
|
|
379
|
+
roleOptionSuperAdmin: string;
|
|
380
|
+
|
|
381
|
+
/* ── Create user modal (Phase 1 — form). */
|
|
382
|
+
/** Modal title. */
|
|
383
|
+
createUserModalTitle: string;
|
|
384
|
+
/** Label above the username input. */
|
|
385
|
+
createUserUsernameLabel: string;
|
|
386
|
+
/** Label above the display-name input (optional). */
|
|
387
|
+
createUserDisplayLabel: string;
|
|
388
|
+
/** Label above the role dropdown. */
|
|
389
|
+
createUserRoleLabel: string;
|
|
390
|
+
/** Cancel button. */
|
|
391
|
+
createUserCancelButton: string;
|
|
392
|
+
/** Submit button. */
|
|
393
|
+
createUserSubmitButton: string;
|
|
394
|
+
/** Submit button while the request is in flight. */
|
|
395
|
+
createUserSubmittingButton: string;
|
|
396
|
+
/** Inline validation: username required. */
|
|
397
|
+
createUserUsernameRequiredError: string;
|
|
398
|
+
/** Banner: server returned 409 `username_taken`. */
|
|
399
|
+
createUserUsernameTakenError: string;
|
|
400
|
+
/** Generic banner for any other create error. */
|
|
401
|
+
createUserGenericError: string;
|
|
402
|
+
|
|
403
|
+
/* ── Password reveal modal (Phase 2 — reused for reset). */
|
|
404
|
+
/** Title shown immediately after a successful create. */
|
|
405
|
+
passwordRevealCreateTitle: string;
|
|
406
|
+
/** Title shown after a successful reset. */
|
|
407
|
+
passwordRevealResetTitle: string;
|
|
408
|
+
/** Warning callout above the password field. */
|
|
409
|
+
passwordRevealWarning: string;
|
|
410
|
+
/** Label above the username read-only field. */
|
|
411
|
+
passwordRevealUsernameLabel: string;
|
|
412
|
+
/** Label above the password read-only field. */
|
|
413
|
+
passwordRevealPasswordLabel: string;
|
|
414
|
+
/** `aria-label` for the copy-to-clipboard button. */
|
|
415
|
+
passwordRevealCopyAriaLabel: string;
|
|
416
|
+
/** Visual confirmation that briefly flashes after a successful copy. */
|
|
417
|
+
passwordRevealCopiedFlash: string;
|
|
418
|
+
/** Dismiss button. The modal MUST be explicitly closed. */
|
|
419
|
+
passwordRevealDoneButton: string;
|
|
420
|
+
|
|
421
|
+
/* ── Reset password modal (Phase 1 — confirm). */
|
|
422
|
+
/** Modal title; `{username}` is interpolated. */
|
|
423
|
+
resetPasswordModalTitle: string;
|
|
424
|
+
/** Modal body explaining what the action does. */
|
|
425
|
+
resetPasswordModalBody: string;
|
|
426
|
+
/** Cancel button (no server call). */
|
|
427
|
+
resetPasswordCancelButton: string;
|
|
428
|
+
/** Confirm button — kicks off the reset. */
|
|
429
|
+
resetPasswordConfirmButton: string;
|
|
430
|
+
/** Confirm button while the request is in flight. */
|
|
431
|
+
resetPasswordConfirmingButton: string;
|
|
432
|
+
/** Generic banner shown when the reset request fails. */
|
|
433
|
+
resetPasswordGenericError: string;
|
|
434
|
+
|
|
435
|
+
/* ── Delete user confirmation (native `confirm()` prompt). */
|
|
436
|
+
/** `window.confirm` prompt body; `{username}` is interpolated. */
|
|
437
|
+
deleteUserConfirmPrompt: string;
|
|
438
|
+
/** Generic banner shown when delete fails. */
|
|
439
|
+
deleteUserGenericError: string;
|
|
440
|
+
|
|
441
|
+
/* ── Step 12 — Agents sub-page ([06-admin-agents.md]) ─────────── */
|
|
442
|
+
/** Page heading. */
|
|
443
|
+
agentsHeading: string;
|
|
444
|
+
/** Top-right `+ Create agent` button label. */
|
|
445
|
+
createAgentButton: string;
|
|
446
|
+
/** Top-right `[↗ Open Letta ADE]` button label. Same gate as the user-menu item. */
|
|
447
|
+
openLettaAdeButton: string;
|
|
448
|
+
/** `agents_table` column header — display name. */
|
|
449
|
+
agentColumnName: string;
|
|
450
|
+
/** `agents_table` column header — Letta `agent_id`. */
|
|
451
|
+
agentColumnLettaId: string;
|
|
452
|
+
/** `agents_table` column header — status. */
|
|
453
|
+
agentColumnStatus: string;
|
|
454
|
+
/** `agents_table` column header — actions. */
|
|
455
|
+
agentColumnActions: string;
|
|
456
|
+
/** Loading placeholder. */
|
|
457
|
+
agentsLoading: string;
|
|
458
|
+
/** Empty placeholder when the deployment has zero agents. */
|
|
459
|
+
agentsEmpty: string;
|
|
460
|
+
/** Generic banner shown when `/admin/agents` fails. */
|
|
461
|
+
agentsGenericError: string;
|
|
462
|
+
/** Status pill text — active row. */
|
|
463
|
+
agentStatusActive: string;
|
|
464
|
+
/** Status pill text — archived row. */
|
|
465
|
+
agentStatusArchived: string;
|
|
466
|
+
/** Per-row `[Edit]` button label. */
|
|
467
|
+
agentEditButton: string;
|
|
468
|
+
/** Per-row `[Archive]` button label. */
|
|
469
|
+
agentArchiveButton: string;
|
|
470
|
+
/** Per-row `[Unarchive]` button label. */
|
|
471
|
+
agentUnarchiveButton: string;
|
|
472
|
+
/** Bottom-of-table `[☐ Show archived]` toggle label. */
|
|
473
|
+
agentShowArchivedToggle: string;
|
|
474
|
+
/**
|
|
475
|
+
* Footer note explaining that model / provider / system prompt are not
|
|
476
|
+
* editable here — the link to Letta's ADE is the place for that.
|
|
477
|
+
*/
|
|
478
|
+
agentsAdeFootnote: string;
|
|
479
|
+
/**
|
|
480
|
+
* `window.confirm` prompt body for archive; `{name}` is interpolated.
|
|
481
|
+
*/
|
|
482
|
+
agentArchiveConfirmPrompt: string;
|
|
483
|
+
|
|
484
|
+
/* ── Create / edit agent modals ([06-admin-agents.md]). */
|
|
485
|
+
/** Create-modal title. */
|
|
486
|
+
createAgentModalTitle: string;
|
|
487
|
+
/** Edit-modal title; `{name}` is interpolated. */
|
|
488
|
+
editAgentModalTitle: string;
|
|
489
|
+
/** Label above the display-name input. */
|
|
490
|
+
agentNameLabel: string;
|
|
491
|
+
/** Helper text below the display-name input (visible-to-users hint). */
|
|
492
|
+
agentNameHelper: string;
|
|
493
|
+
/** Label above the Letta-agent-id input. */
|
|
494
|
+
agentLettaIdLabel: string;
|
|
495
|
+
/** Helper text below the Letta-agent-id input (find-this-in-ADE hint). */
|
|
496
|
+
agentLettaIdHelper: string;
|
|
497
|
+
/** Helper text on the edit modal warning about re-pointing semantics. */
|
|
498
|
+
agentLettaIdReassignHelper: string;
|
|
499
|
+
/** Cancel button. */
|
|
500
|
+
agentModalCancelButton: string;
|
|
501
|
+
/** Modal create button. */
|
|
502
|
+
agentModalCreateButton: string;
|
|
503
|
+
/** Modal save button. */
|
|
504
|
+
agentModalSaveButton: string;
|
|
505
|
+
/** Submit button while the request is in flight. */
|
|
506
|
+
agentModalSubmittingButton: string;
|
|
507
|
+
/** Inline validation: display name required. */
|
|
508
|
+
agentNameRequiredError: string;
|
|
509
|
+
/** Inline validation: Letta-agent-id required. */
|
|
510
|
+
agentLettaIdRequiredError: string;
|
|
511
|
+
/** Inline validation: server returned `letta_agent_not_found`. */
|
|
512
|
+
agentLettaIdNotFoundError: string;
|
|
513
|
+
/** Generic banner shown on other create / edit errors. */
|
|
514
|
+
agentSubmitGenericError: string;
|
|
515
|
+
|
|
516
|
+
/* ── Step 12.5 — specialized agents (sandbox + fork) ───────────────── */
|
|
517
|
+
/** Sub-heading above the optional fields. */
|
|
518
|
+
agentSpecializedSectionHeading: string;
|
|
519
|
+
/** Helper paragraph below the sub-heading. */
|
|
520
|
+
agentSpecializedSectionHelper: string;
|
|
521
|
+
/** Label for the sandbox seed name input. */
|
|
522
|
+
agentSandboxSeedLabel: string;
|
|
523
|
+
/** Helper text below the sandbox seed name input. */
|
|
524
|
+
agentSandboxSeedHelper: string;
|
|
525
|
+
/** Inline error: regex / format violation. */
|
|
526
|
+
agentSandboxSeedInvalidError: string;
|
|
527
|
+
/** Inline error: server returned `seed_dir_not_found`. */
|
|
528
|
+
agentSandboxSeedNotFoundError: string;
|
|
529
|
+
/** Label for the fork source conversation id input. */
|
|
530
|
+
agentForkSourceLabel: string;
|
|
531
|
+
/** Helper text below the fork source conversation id input. */
|
|
532
|
+
agentForkSourceHelper: string;
|
|
533
|
+
/** Inline error: server returned `fork_source_not_found`. */
|
|
534
|
+
agentForkSourceNotFoundError: string;
|
|
535
|
+
/** Inline error: server returned `fork_source_agent_mismatch`. */
|
|
536
|
+
agentForkSourceAgentMismatchError: string;
|
|
537
|
+
/** Base-conversation mode option — none (brand-new conversation). */
|
|
538
|
+
agentForkSourceModeNone: string;
|
|
539
|
+
/** Base-conversation mode option — pick a rotating message. */
|
|
540
|
+
agentForkSourceModeRotating: string;
|
|
541
|
+
/** Base-conversation mode option — paste a raw conversation id. */
|
|
542
|
+
agentForkSourceModeManual: string;
|
|
543
|
+
/** Placeholder in the rotating-message search box. */
|
|
544
|
+
agentForkSourceRotatingSearchPlaceholder: string;
|
|
545
|
+
/** Shown when no rotating messages exist / match the search. */
|
|
546
|
+
agentForkSourceRotatingEmpty: string;
|
|
547
|
+
/** Inline error: server returned `rotating_message_not_found`. */
|
|
548
|
+
agentForkSourceRotatingNotFoundError: string;
|
|
549
|
+
/** Inline error: server returned `rotating_message_agent_mismatch`. */
|
|
550
|
+
agentForkSourceRotatingMismatchError: string;
|
|
551
|
+
|
|
552
|
+
/* ── Rotating starting messages ([docs/server/rotating-messages.md]) ─ */
|
|
553
|
+
/** Page heading. */
|
|
554
|
+
rotatingHeading: string;
|
|
555
|
+
/** Loading placeholder. */
|
|
556
|
+
rotatingLoading: string;
|
|
557
|
+
/** Empty-state copy. */
|
|
558
|
+
rotatingEmpty: string;
|
|
559
|
+
/** Generic load error. */
|
|
560
|
+
rotatingGenericError: string;
|
|
561
|
+
/** `[+ Create rotating message]` button. */
|
|
562
|
+
rotatingCreateButton: string;
|
|
563
|
+
/** Table column — name. */
|
|
564
|
+
rotatingColumnName: string;
|
|
565
|
+
/** Table column — Letta agent. */
|
|
566
|
+
rotatingColumnAgent: string;
|
|
567
|
+
/** Table column — schedule summary. */
|
|
568
|
+
rotatingColumnSchedule: string;
|
|
569
|
+
/** Table column — last rotation status. */
|
|
570
|
+
rotatingColumnStatus: string;
|
|
571
|
+
/** Table column — the rmsg- id (copyable). */
|
|
572
|
+
rotatingColumnId: string;
|
|
573
|
+
/** Table column — actions. */
|
|
574
|
+
rotatingColumnActions: string;
|
|
575
|
+
/** Row action — edit. */
|
|
576
|
+
rotatingEditButton: string;
|
|
577
|
+
/** Row action — rotate now. */
|
|
578
|
+
rotatingRotateNowButton: string;
|
|
579
|
+
/** Row action — archive. */
|
|
580
|
+
rotatingArchiveButton: string;
|
|
581
|
+
/** Row action — unarchive. */
|
|
582
|
+
rotatingUnarchiveButton: string;
|
|
583
|
+
/** `{name}` archive confirmation prompt. */
|
|
584
|
+
rotatingArchiveConfirmPrompt: string;
|
|
585
|
+
/** Show-archived filter toggle. */
|
|
586
|
+
rotatingShowArchivedToggle: string;
|
|
587
|
+
/** Status pill — never rotated yet. */
|
|
588
|
+
rotatingStatusPending: string;
|
|
589
|
+
/** Status pill — last rotation succeeded. */
|
|
590
|
+
rotatingStatusOk: string;
|
|
591
|
+
/** Status pill — last rotation failed. */
|
|
592
|
+
rotatingStatusError: string;
|
|
593
|
+
/** Status pill — archived. */
|
|
594
|
+
rotatingStatusArchived: string;
|
|
595
|
+
/** Transient label while a rotate-now request is running. */
|
|
596
|
+
rotatingRotateNowRunning: string;
|
|
597
|
+
|
|
598
|
+
/* ── Rotating message editor modal ─────────────────────────────────── */
|
|
599
|
+
/** Create-modal title. */
|
|
600
|
+
createRotatingModalTitle: string;
|
|
601
|
+
/** Edit-modal title (`{name}` placeholder). */
|
|
602
|
+
editRotatingModalTitle: string;
|
|
603
|
+
/** Display-name field label. */
|
|
604
|
+
rotatingNameLabel: string;
|
|
605
|
+
/** Display-name field helper. */
|
|
606
|
+
rotatingNameHelper: string;
|
|
607
|
+
/** Inline validation: name required. */
|
|
608
|
+
rotatingNameRequiredError: string;
|
|
609
|
+
/** Prompt field label. */
|
|
610
|
+
rotatingPromptLabel: string;
|
|
611
|
+
/** Prompt field helper. */
|
|
612
|
+
rotatingPromptHelper: string;
|
|
613
|
+
/** Inline validation: prompt required. */
|
|
614
|
+
rotatingPromptRequiredError: string;
|
|
615
|
+
/** Letta-agent-id field label. */
|
|
616
|
+
rotatingAgentLabel: string;
|
|
617
|
+
/** Letta-agent-id field helper. */
|
|
618
|
+
rotatingAgentHelper: string;
|
|
619
|
+
/** Inline validation: agent id required. */
|
|
620
|
+
rotatingAgentRequiredError: string;
|
|
621
|
+
/** Inline error: server returned `letta_agent_not_found`. */
|
|
622
|
+
rotatingAgentNotFoundError: string;
|
|
623
|
+
/** Schedule section label. */
|
|
624
|
+
rotatingScheduleLabel: string;
|
|
625
|
+
/** Schedule mode — fixed interval. */
|
|
626
|
+
rotatingScheduleEveryOption: string;
|
|
627
|
+
/** Schedule mode — daily at a fixed time. */
|
|
628
|
+
rotatingScheduleDailyOption: string;
|
|
629
|
+
/** Schedule mode — advanced cron. */
|
|
630
|
+
rotatingScheduleCronOption: string;
|
|
631
|
+
/** Interval value field label (the number). */
|
|
632
|
+
rotatingIntervalValueLabel: string;
|
|
633
|
+
/** Interval unit — hours. */
|
|
634
|
+
rotatingIntervalUnitHours: string;
|
|
635
|
+
/** Interval unit — days. */
|
|
636
|
+
rotatingIntervalUnitDays: string;
|
|
637
|
+
/** Daily-time field label. */
|
|
638
|
+
rotatingDailyTimeLabel: string;
|
|
639
|
+
/** Daily-time field helper (notes UTC). */
|
|
640
|
+
rotatingDailyTimeHelper: string;
|
|
641
|
+
/** Cron field label. */
|
|
642
|
+
rotatingCronLabel: string;
|
|
643
|
+
/** Cron field helper. */
|
|
644
|
+
rotatingCronHelper: string;
|
|
645
|
+
/** Inline error: server returned `invalid_schedule`. */
|
|
646
|
+
rotatingScheduleInvalidError: string;
|
|
647
|
+
/** Generic banner for other create/edit errors. */
|
|
648
|
+
rotatingSubmitGenericError: string;
|
|
649
|
+
/** Cancel button. */
|
|
650
|
+
rotatingModalCancelButton: string;
|
|
651
|
+
/** Create button. */
|
|
652
|
+
rotatingModalCreateButton: string;
|
|
653
|
+
/** Save button (edit mode). */
|
|
654
|
+
rotatingModalSaveButton: string;
|
|
655
|
+
/** In-flight submit button label. */
|
|
656
|
+
rotatingModalSubmittingButton: string;
|
|
657
|
+
|
|
658
|
+
/* ── Step 12 — Sessions overview ([07-admin-sessions-overview.md]) ─ */
|
|
659
|
+
/** Page heading. */
|
|
660
|
+
sessionsOverviewHeading: string;
|
|
661
|
+
/** Search input placeholder. */
|
|
662
|
+
sessionsOverviewSearchPlaceholder: string;
|
|
663
|
+
/** Filter label — owner dropdown. */
|
|
664
|
+
sessionsOverviewOwnerFilterLabel: string;
|
|
665
|
+
/** Filter dropdown option — all owners. */
|
|
666
|
+
sessionsOverviewOwnerFilterAll: string;
|
|
667
|
+
/** Filter label — agent dropdown. */
|
|
668
|
+
sessionsOverviewAgentFilterLabel: string;
|
|
669
|
+
/** Filter dropdown option — all agents. */
|
|
670
|
+
sessionsOverviewAgentFilterAll: string;
|
|
671
|
+
/** Filter label — status dropdown. */
|
|
672
|
+
sessionsOverviewStatusFilterLabel: string;
|
|
673
|
+
/** Filter dropdown option — active. */
|
|
674
|
+
sessionsOverviewStatusActive: string;
|
|
675
|
+
/** Filter dropdown option — archived. */
|
|
676
|
+
sessionsOverviewStatusArchived: string;
|
|
677
|
+
/** Filter dropdown option — all. */
|
|
678
|
+
sessionsOverviewStatusAll: string;
|
|
679
|
+
/** Table column header — title. */
|
|
680
|
+
sessionsOverviewColumnTitle: string;
|
|
681
|
+
/** Table column header — owner. */
|
|
682
|
+
sessionsOverviewColumnOwner: string;
|
|
683
|
+
/** Table column header — agent. */
|
|
684
|
+
sessionsOverviewColumnAgent: string;
|
|
685
|
+
/** Table column header — last message timestamp. */
|
|
686
|
+
sessionsOverviewColumnLastMessage: string;
|
|
687
|
+
/** Table column header — actions. */
|
|
688
|
+
sessionsOverviewColumnActions: string;
|
|
689
|
+
/** Per-row `[View]` button label. */
|
|
690
|
+
sessionsOverviewViewButton: string;
|
|
691
|
+
/** Pagination — Previous page button. */
|
|
692
|
+
sessionsOverviewPrevPage: string;
|
|
693
|
+
/** Pagination — Next page button. */
|
|
694
|
+
sessionsOverviewNextPage: string;
|
|
695
|
+
/** Pagination — current-page text; `{n}` is interpolated. */
|
|
696
|
+
sessionsOverviewPageNumber: string;
|
|
697
|
+
/** Loading placeholder. */
|
|
698
|
+
sessionsOverviewLoading: string;
|
|
699
|
+
/** Empty placeholder for the current filter combination. */
|
|
700
|
+
sessionsOverviewEmpty: string;
|
|
701
|
+
/** Generic banner shown when `/admin/sessions` fails. */
|
|
702
|
+
sessionsOverviewGenericError: string;
|
|
703
|
+
/** Back link on the session detail view. */
|
|
704
|
+
sessionsOverviewBackLink: string;
|
|
705
|
+
/** Detail header subtitle template — `{title} — {owner} — {agent}`. */
|
|
706
|
+
sessionsOverviewDetailHeading: string;
|
|
707
|
+
/** Loading placeholder on the detail view. */
|
|
708
|
+
sessionsOverviewDetailLoading: string;
|
|
709
|
+
/** Empty placeholder when the conversation has no messages yet. */
|
|
710
|
+
sessionsOverviewDetailEmpty: string;
|
|
711
|
+
/** Generic banner on detail-view fetch failure. */
|
|
712
|
+
sessionsOverviewDetailGenericError: string;
|
|
713
|
+
/** Step-12.5 — label for the sandbox-state line in the detail footer. */
|
|
714
|
+
sessionsOverviewDetailSandboxLabel: string;
|
|
715
|
+
/** Step-12.5 — text shown when the session has a sandbox on disk. */
|
|
716
|
+
sessionsOverviewDetailSandboxPresent: string;
|
|
717
|
+
/** Step-12.5 — text shown when no sandbox is configured. */
|
|
718
|
+
sessionsOverviewDetailSandboxAbsent: string;
|
|
719
|
+
/** Step-12.5 — `[Purge sandbox]` button label. */
|
|
720
|
+
sessionsOverviewPurgeSandboxButton: string;
|
|
721
|
+
/** Step-12.5 — `window.confirm` body when the operator clicks purge. */
|
|
722
|
+
sessionsOverviewPurgeSandboxConfirmPrompt: string;
|
|
723
|
+
/** Step-12.5 — button label while the purge request is in flight. */
|
|
724
|
+
sessionsOverviewPurgeSandboxConfirming: string;
|
|
725
|
+
/** Step-12.5 — flash on successful purge. */
|
|
726
|
+
sessionsOverviewPurgeSandboxSuccessFlash: string;
|
|
727
|
+
/** Step-12.5 — inline error: 409 turn_running. */
|
|
728
|
+
sessionsOverviewPurgeSandboxTurnRunningError: string;
|
|
729
|
+
/** Step-12.5 — generic error banner. */
|
|
730
|
+
sessionsOverviewPurgeSandboxGenericError: string;
|
|
731
|
+
|
|
732
|
+
/* ── Step 12 — Settings ([08-admin-settings.md]) ─────────────── */
|
|
733
|
+
/** Page heading. */
|
|
734
|
+
settingsHeading: string;
|
|
735
|
+
/** Loading placeholder. */
|
|
736
|
+
settingsLoading: string;
|
|
737
|
+
/** Generic banner shown when `/admin/settings` fails. */
|
|
738
|
+
settingsGenericError: string;
|
|
739
|
+
|
|
740
|
+
/* Letta connection section. */
|
|
741
|
+
settingsLettaSectionHeading: string;
|
|
742
|
+
settingsLettaBaseUrlLabel: string;
|
|
743
|
+
settingsLettaAdeUrlLabel: string;
|
|
744
|
+
settingsLettaAdeUrlHelper: string;
|
|
745
|
+
settingsLettaApiKeyLabel: string;
|
|
746
|
+
/** Shown when DB column has a value (super-admin set it via admin panel). */
|
|
747
|
+
settingsLettaApiKeyDbHelper: string;
|
|
748
|
+
/** Shown when DB column is empty but `LETTA_API_KEY` env var is set. */
|
|
749
|
+
settingsLettaApiKeyEnvHelper: string;
|
|
750
|
+
/** Shown when nothing is configured anywhere (chat will fail). */
|
|
751
|
+
settingsLettaApiKeyNoneHelper: string;
|
|
752
|
+
/** @deprecated Use `settingsLettaApiKeyDbHelper` (DB) or `settingsLettaApiKeyEnvHelper` (env). Kept for wrapper backward-compat. */
|
|
753
|
+
settingsLettaApiKeyMaskedHelper: string;
|
|
754
|
+
/** @deprecated Use `settingsLettaApiKeyNoneHelper`. Kept for wrapper backward-compat. */
|
|
755
|
+
settingsLettaApiKeyUnsetHelper: string;
|
|
756
|
+
settingsLettaApiKeyPlaceholder: string;
|
|
757
|
+
/** "Clear admin override (use env)" button label — only rendered when source is "db". */
|
|
758
|
+
settingsLettaApiKeyClearOverrideButton: string;
|
|
759
|
+
settingsSaveLettaButton: string;
|
|
760
|
+
settingsSaveSavingButton: string;
|
|
761
|
+
settingsSaveSuccessFlash: string;
|
|
762
|
+
settingsSaveGenericError: string;
|
|
763
|
+
|
|
764
|
+
/* Theme section. */
|
|
765
|
+
settingsThemeSectionHeading: string;
|
|
766
|
+
settingsThemeDefaultLabel: string;
|
|
767
|
+
settingsThemeDefaultLight: string;
|
|
768
|
+
settingsThemeDefaultDark: string;
|
|
769
|
+
settingsThemeSwitcherEnabledLabel: string;
|
|
770
|
+
settingsThemeSwitcherEnabledHelper: string;
|
|
771
|
+
settingsSaveThemeButton: string;
|
|
772
|
+
|
|
773
|
+
/* Feature toggles section. */
|
|
774
|
+
settingsTogglesSectionHeading: string;
|
|
775
|
+
settingsTogglesGroupSessions: string;
|
|
776
|
+
settingsTogglesGroupInput: string;
|
|
777
|
+
settingsTogglesGroupAffordances: string;
|
|
778
|
+
settingsTogglesSaveButton: string;
|
|
779
|
+
|
|
780
|
+
/* Signing key section. */
|
|
781
|
+
settingsSigningKeySectionHeading: string;
|
|
782
|
+
settingsSigningKeyLastRotated: string;
|
|
783
|
+
settingsSigningKeyNeverRotated: string;
|
|
784
|
+
settingsSigningKeyWarning: string;
|
|
785
|
+
settingsRotateSigningKeyButton: string;
|
|
786
|
+
settingsRotateSigningKeyModalTitle: string;
|
|
787
|
+
settingsRotateSigningKeyModalBody: string;
|
|
788
|
+
settingsRotateConfirmInputLabel: string;
|
|
789
|
+
settingsRotateConfirmPlaceholder: string;
|
|
790
|
+
settingsRotateConfirmKeyword: string;
|
|
791
|
+
settingsRotateConfirmButton: string;
|
|
792
|
+
settingsRotateConfirmingButton: string;
|
|
793
|
+
settingsRotateGenericError: string;
|
|
794
|
+
|
|
795
|
+
/* Metrics token section. */
|
|
796
|
+
settingsMetricsSectionHeading: string;
|
|
797
|
+
settingsMetricsLastRotated: string;
|
|
798
|
+
settingsMetricsNeverRotated: string;
|
|
799
|
+
settingsMetricsWarning: string;
|
|
800
|
+
settingsRotateMetricsButton: string;
|
|
801
|
+
settingsRotateMetricsModalTitle: string;
|
|
802
|
+
settingsRotateMetricsModalBody: string;
|
|
803
|
+
settingsMetricsRevealTitle: string;
|
|
804
|
+
settingsMetricsRevealTokenLabel: string;
|
|
805
|
+
settingsMetricsRevealWarning: string;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Aggregate `texts` surface. Wrappers pass a `Partial<AIHubTexts>` and the
|
|
810
|
+
* components fall back to `defaultAIHubTexts` for any missing key.
|
|
811
|
+
*
|
|
812
|
+
* Step 8 defines `login` + `changePassword`; Step 9 appends `chat`. Later
|
|
813
|
+
* steps will add `admin`, `agents`, etc. (each typed as its own
|
|
814
|
+
* sub-interface) without touching existing keys — wrappers stay
|
|
815
|
+
* forward-compatible.
|
|
816
|
+
*/
|
|
817
|
+
export interface AIHubTexts {
|
|
818
|
+
/** Strings on the login screen. */
|
|
819
|
+
login: AIHubLoginTexts;
|
|
820
|
+
/** Strings on the change-password screen (both variants). */
|
|
821
|
+
changePassword: AIHubChangePasswordTexts;
|
|
822
|
+
/** Strings on the chat surface (Step 9). */
|
|
823
|
+
chat: AIHubChatTexts;
|
|
824
|
+
/** Strings on the admin surface (Step 11+). */
|
|
825
|
+
admin: AIHubAdminTexts;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
/**
|
|
829
|
+
* English defaults for every key. Frozen so accidental mutation surfaces.
|
|
830
|
+
*/
|
|
831
|
+
export const defaultAIHubTexts: AIHubTexts = Object.freeze({
|
|
832
|
+
login: Object.freeze({
|
|
833
|
+
usernameLabel: "Username",
|
|
834
|
+
passwordLabel: "Password",
|
|
835
|
+
signInButton: "Sign in",
|
|
836
|
+
signingInButton: "Signing in…",
|
|
837
|
+
forgotPasswordNote:
|
|
838
|
+
"Forgot or lost your password? Contact your administrator.",
|
|
839
|
+
showPasswordAriaLabel: "Show password",
|
|
840
|
+
hidePasswordAriaLabel: "Hide password",
|
|
841
|
+
invalidCredentialsError: "Invalid username or password.",
|
|
842
|
+
networkError: "Could not reach the server. Try again.",
|
|
843
|
+
}),
|
|
844
|
+
changePassword: Object.freeze({
|
|
845
|
+
title: "Change Password",
|
|
846
|
+
forcedChangePasswordIntro:
|
|
847
|
+
"You must change your password before continuing.",
|
|
848
|
+
currentPasswordLabel: "Current Password",
|
|
849
|
+
newPasswordLabel: "New Password",
|
|
850
|
+
confirmPasswordLabel: "Confirm New Password",
|
|
851
|
+
changePasswordButton: "Change Password",
|
|
852
|
+
savingButton: "Saving…",
|
|
853
|
+
cancelButton: "Cancel",
|
|
854
|
+
passwordsMustMatchError: "Passwords do not match.",
|
|
855
|
+
passwordTooShortError: "New password must be at least 8 characters.",
|
|
856
|
+
passwordTooSimpleError:
|
|
857
|
+
"New password must contain at least two of these three: letters, digits, special characters.",
|
|
858
|
+
invalidCurrentPasswordError: "Current password is incorrect.",
|
|
859
|
+
networkError: "Could not reach the server. Try again.",
|
|
860
|
+
showPasswordAriaLabel: "Show password",
|
|
861
|
+
hidePasswordAriaLabel: "Hide password",
|
|
862
|
+
}),
|
|
863
|
+
chat: Object.freeze({
|
|
864
|
+
agentsPickerHeading: "Choose an agent",
|
|
865
|
+
agentCardSessionsSubtitle: "{count} of your sessions",
|
|
866
|
+
agentCardNoSessionsSubtitle: "No sessions yet",
|
|
867
|
+
agentsPickerEmptyHeading: "No agents available",
|
|
868
|
+
agentsPickerEmptyBody:
|
|
869
|
+
"An administrator hasn't published any agents in this deployment yet.",
|
|
870
|
+
agentsPickerLoading: "Loading agents…",
|
|
871
|
+
agentsPickerError: "Could not load agents. Try again.",
|
|
872
|
+
sessionsLoading: "Loading…",
|
|
873
|
+
sessionsEmpty: "No chats yet.",
|
|
874
|
+
newSessionButton: "+ New chat",
|
|
875
|
+
showArchivedToggle: "Show archived",
|
|
876
|
+
hideArchivedToggle: "Hide archived",
|
|
877
|
+
editSessionTitleAriaLabel: "Edit chat title",
|
|
878
|
+
archiveSessionAriaLabel: "Archive chat",
|
|
879
|
+
unarchiveSessionAriaLabel: "Unarchive chat",
|
|
880
|
+
archiveConfirmPrompt:
|
|
881
|
+
"Archive “{title}”? You can find it later under the Archived filter.",
|
|
882
|
+
collapseSessionsPanel: "Collapse sessions panel",
|
|
883
|
+
expandSessionsPanel: "Show sessions panel",
|
|
884
|
+
backToAgentsLink: "← Agents",
|
|
885
|
+
untitledSessionFallback: "(untitled)",
|
|
886
|
+
noActiveSessionHint:
|
|
887
|
+
"Pick a chat from the left or start a new one to begin.",
|
|
888
|
+
emptyConversationHint:
|
|
889
|
+
"Send a message to get started — the assistant's reply will stream here.",
|
|
890
|
+
inputPlaceholder: "Type a message — Enter to send, Shift+Enter for a newline.",
|
|
891
|
+
sendButton: "Send",
|
|
892
|
+
stopButton: "Stop",
|
|
893
|
+
stoppingButton: "Stopping…",
|
|
894
|
+
sendButtonAriaLabel: "Send message",
|
|
895
|
+
stopButtonAriaLabel: "Stop generation",
|
|
896
|
+
newSessionModalTitle: "New chat",
|
|
897
|
+
editSessionModalTitle: "Rename chat",
|
|
898
|
+
sessionTitleLabel: "Chat title",
|
|
899
|
+
sessionTitlePlaceholder: "What is this chat about?",
|
|
900
|
+
sessionTitleRequiredError: "A title is required.",
|
|
901
|
+
sessionTitleTooLongError: "Title must be 80 characters or fewer.",
|
|
902
|
+
modalCancelButton: "Cancel",
|
|
903
|
+
modalCreateButton: "Create",
|
|
904
|
+
modalSaveButton: "Save",
|
|
905
|
+
genericRequestError: "Something went wrong. Try again.",
|
|
906
|
+
noAssistantResponseError:
|
|
907
|
+
"The agent didn't produce a response. Contact your administrator if this persists.",
|
|
908
|
+
signOutMenuItem: "Sign out",
|
|
909
|
+
/* Step 10 affordance defaults. */
|
|
910
|
+
stopGenerationButton: "Stop generation",
|
|
911
|
+
cancelToolButton: "Cancel tool",
|
|
912
|
+
systemResumedText: "Resumed.",
|
|
913
|
+
tpmWaitText: "Provider rate-limited. Resuming in {seconds}s…",
|
|
914
|
+
tpmExhaustedText:
|
|
915
|
+
"The model hit its rate limit and could not recover. Try again, or shorten your last message.",
|
|
916
|
+
tpmRetryButton: "Retry",
|
|
917
|
+
streamFailedText: "Stream failed.",
|
|
918
|
+
retryFailedButton: "Retry",
|
|
919
|
+
cancelledStampText: "Stopped",
|
|
920
|
+
scrollToPresentButton: "↓ Jump to latest",
|
|
921
|
+
reasoningCollapsedHeader: "🧠 Reasoning… ({seconds}s)",
|
|
922
|
+
reasoningCollapsedHeaderNoDuration: "🧠 Reasoning",
|
|
923
|
+
reasoningExpandedHeader: "🧠 Reasoning ({seconds}s)",
|
|
924
|
+
reasoningExpandedHeaderNoDuration: "🧠 Reasoning",
|
|
925
|
+
reasoningExpandAriaLabel: "Show reasoning",
|
|
926
|
+
reasoningCollapseAriaLabel: "Hide reasoning",
|
|
927
|
+
reasoningThinkingPlaceholder: "Reasoning in progress…",
|
|
928
|
+
toolCallRunningStatus: "⟳ running…",
|
|
929
|
+
toolCallDoneStatus: "✓ done",
|
|
930
|
+
toolCallErrorStatus: "✗ error",
|
|
931
|
+
toolCallInputLabel: "Input:",
|
|
932
|
+
toolCallOutputLabel: "Output:",
|
|
933
|
+
toolCallErrorLabel: "Error:",
|
|
934
|
+
toolCallExpandAriaLabel: "Show tool call details",
|
|
935
|
+
toolCallCollapseAriaLabel: "Hide tool call details",
|
|
936
|
+
effortLabel: "Effort",
|
|
937
|
+
effortNone: "None",
|
|
938
|
+
effortMinimal: "Minimal",
|
|
939
|
+
effortLow: "Low",
|
|
940
|
+
effortMedium: "Medium",
|
|
941
|
+
effortHigh: "High",
|
|
942
|
+
effortExtraHigh: "Extra High",
|
|
943
|
+
themeDarkLabel: "Dark",
|
|
944
|
+
themeLightLabel: "Light",
|
|
945
|
+
themeSwitchToDarkAriaLabel: "Switch to dark theme",
|
|
946
|
+
themeSwitchToLightAriaLabel: "Switch to light theme",
|
|
947
|
+
/* Step 11 user-menu defaults. */
|
|
948
|
+
adminMenuItem: "Admin",
|
|
949
|
+
openLettaAdeMenuItem: "Open Letta ADE",
|
|
950
|
+
}),
|
|
951
|
+
admin: Object.freeze({
|
|
952
|
+
/* Shell. */
|
|
953
|
+
navHeading: "Admin",
|
|
954
|
+
navUsers: "Users",
|
|
955
|
+
navAgents: "Agents",
|
|
956
|
+
navSessionsOverview: "Sessions overview",
|
|
957
|
+
navRotatingMessages: "Rotating messages",
|
|
958
|
+
navSettings: "Settings",
|
|
959
|
+
backToChatLink: "Back to chat",
|
|
960
|
+
comingInStep12Placeholder:
|
|
961
|
+
"The {page} page is coming in the next implementation step.",
|
|
962
|
+
/* Users sub-page. */
|
|
963
|
+
usersHeading: "User Management",
|
|
964
|
+
createUserButton: "+ Create user",
|
|
965
|
+
userColumnUsername: "Username",
|
|
966
|
+
userColumnDisplay: "Display",
|
|
967
|
+
userColumnRole: "Role",
|
|
968
|
+
userColumnActions: "Actions",
|
|
969
|
+
usersLoading: "Loading users…",
|
|
970
|
+
usersEmpty: "No users in this deployment yet.",
|
|
971
|
+
usersGenericError: "Could not load users. Try again.",
|
|
972
|
+
resetPasswordButtonLabel: "Reset password",
|
|
973
|
+
deleteUserButtonLabel: "Delete user",
|
|
974
|
+
roleSelectShieldDisabledHint:
|
|
975
|
+
"Only a super-admin can change another admin's role.",
|
|
976
|
+
roleSelectMinCountDisabledHint:
|
|
977
|
+
"The last super-admin cannot be demoted.",
|
|
978
|
+
roleChangeForbiddenFallback:
|
|
979
|
+
"You are not allowed to change this user's role.",
|
|
980
|
+
roleChangeSuccessToast: "Role updated to {role}.",
|
|
981
|
+
initialPasswordIndicator: "⚠ initial password",
|
|
982
|
+
roleOptionUser: "user",
|
|
983
|
+
roleOptionPowerUser: "power_user",
|
|
984
|
+
roleOptionAdmin: "admin",
|
|
985
|
+
roleOptionSuperAdmin: "super_admin",
|
|
986
|
+
/* Create user modal. */
|
|
987
|
+
createUserModalTitle: "Create New User",
|
|
988
|
+
createUserUsernameLabel: "Username",
|
|
989
|
+
createUserDisplayLabel: "Display name (optional)",
|
|
990
|
+
createUserRoleLabel: "Role",
|
|
991
|
+
createUserCancelButton: "Cancel",
|
|
992
|
+
createUserSubmitButton: "Create user",
|
|
993
|
+
createUserSubmittingButton: "Creating…",
|
|
994
|
+
createUserUsernameRequiredError: "Username is required.",
|
|
995
|
+
createUserUsernameTakenError: "That username is already in use.",
|
|
996
|
+
createUserGenericError: "Could not create the user. Try again.",
|
|
997
|
+
/* Password reveal modal. */
|
|
998
|
+
passwordRevealCreateTitle: "User created",
|
|
999
|
+
passwordRevealResetTitle: "Password reset",
|
|
1000
|
+
passwordRevealWarning:
|
|
1001
|
+
"This password will be shown only once. Send it to the user securely. They will be required to change it on first login.",
|
|
1002
|
+
passwordRevealUsernameLabel: "Username",
|
|
1003
|
+
passwordRevealPasswordLabel: "Generated password",
|
|
1004
|
+
passwordRevealCopyAriaLabel: "Copy password to clipboard",
|
|
1005
|
+
passwordRevealCopiedFlash: "Copied!",
|
|
1006
|
+
passwordRevealDoneButton: "Done",
|
|
1007
|
+
/* Reset confirm modal. */
|
|
1008
|
+
resetPasswordModalTitle: "Reset password for “{username}”?",
|
|
1009
|
+
resetPasswordModalBody:
|
|
1010
|
+
"A new random password will be generated. The current password will be invalidated. The user will be required to change the new password on their next login.",
|
|
1011
|
+
resetPasswordCancelButton: "Cancel",
|
|
1012
|
+
resetPasswordConfirmButton: "Reset password",
|
|
1013
|
+
resetPasswordConfirmingButton: "Resetting…",
|
|
1014
|
+
resetPasswordGenericError:
|
|
1015
|
+
"Could not reset the password. Try again.",
|
|
1016
|
+
/* Delete user. */
|
|
1017
|
+
deleteUserConfirmPrompt:
|
|
1018
|
+
"Delete user “{username}”? This is irreversible and will remove all of their sessions.",
|
|
1019
|
+
deleteUserGenericError:
|
|
1020
|
+
"Could not delete the user. Try again.",
|
|
1021
|
+
/* Step 12 — Agents sub-page. */
|
|
1022
|
+
agentsHeading: "Agents",
|
|
1023
|
+
createAgentButton: "+ Create agent",
|
|
1024
|
+
openLettaAdeButton: "↗ Open Letta ADE",
|
|
1025
|
+
agentColumnName: "Display name",
|
|
1026
|
+
agentColumnLettaId: "Letta agent_id",
|
|
1027
|
+
agentColumnStatus: "Status",
|
|
1028
|
+
agentColumnActions: "Actions",
|
|
1029
|
+
agentsLoading: "Loading agents…",
|
|
1030
|
+
agentsEmpty: "No agents in this deployment yet.",
|
|
1031
|
+
agentsGenericError: "Could not load agents. Try again.",
|
|
1032
|
+
agentStatusActive: "active",
|
|
1033
|
+
agentStatusArchived: "archived",
|
|
1034
|
+
agentEditButton: "Edit",
|
|
1035
|
+
agentArchiveButton: "Archive",
|
|
1036
|
+
agentUnarchiveButton: "Unarchive",
|
|
1037
|
+
agentShowArchivedToggle: "Show archived",
|
|
1038
|
+
agentsAdeFootnote:
|
|
1039
|
+
"To change the model, provider, system prompt, tools, or memory of an agent, edit it in Letta's ADE. Changes take effect for every ai-hub user immediately.",
|
|
1040
|
+
agentArchiveConfirmPrompt:
|
|
1041
|
+
"Archive “{name}”? End-users will no longer be able to start new sessions with this agent. Existing sessions keep working.",
|
|
1042
|
+
createAgentModalTitle: "Create an ai-hub agent",
|
|
1043
|
+
editAgentModalTitle: "Edit “{name}”",
|
|
1044
|
+
agentNameLabel: "Display name",
|
|
1045
|
+
agentNameHelper: "Shown to users in the agents picker.",
|
|
1046
|
+
agentLettaIdLabel: "Letta agent_id",
|
|
1047
|
+
agentLettaIdHelper:
|
|
1048
|
+
"Find this in Letta's ADE — the Letta agent must already exist; ai-hub does not create Letta agents.",
|
|
1049
|
+
agentLettaIdReassignHelper:
|
|
1050
|
+
"Re-pointing this changes which Letta agent NEW sessions use; existing sessions keep their original conversation and continue against the original Letta agent.",
|
|
1051
|
+
agentModalCancelButton: "Cancel",
|
|
1052
|
+
agentModalCreateButton: "Create",
|
|
1053
|
+
agentModalSaveButton: "Save",
|
|
1054
|
+
agentModalSubmittingButton: "Saving…",
|
|
1055
|
+
agentNameRequiredError: "Display name is required.",
|
|
1056
|
+
agentLettaIdRequiredError: "Letta agent_id is required.",
|
|
1057
|
+
agentLettaIdNotFoundError:
|
|
1058
|
+
"No Letta agent with that id was found. Check the value in Letta's ADE.",
|
|
1059
|
+
agentSubmitGenericError: "Could not save the agent. Try again.",
|
|
1060
|
+
/* Step 12.5 — specialized agents. */
|
|
1061
|
+
agentSpecializedSectionHeading: "Specialized agent (optional)",
|
|
1062
|
+
agentSpecializedSectionHelper:
|
|
1063
|
+
"Pre-load each session with files and/or an admin-curated conversation. Leave both blank for a stateless agent.",
|
|
1064
|
+
agentSandboxSeedLabel: "Sandbox seed folder",
|
|
1065
|
+
agentSandboxSeedHelper:
|
|
1066
|
+
"Name of a folder under AI_HUB_FILES_DIR/seeds/ that gets copied into each session's working directory. The agent gains read/write access inside that copy.",
|
|
1067
|
+
agentSandboxSeedInvalidError:
|
|
1068
|
+
"Must match ^[a-zA-Z0-9_-]+$ — letters, digits, dashes, and underscores only.",
|
|
1069
|
+
agentSandboxSeedNotFoundError:
|
|
1070
|
+
"No folder with that name exists under AI_HUB_FILES_DIR/seeds/. Create it on the server first.",
|
|
1071
|
+
agentForkSourceLabel: "Base conversation",
|
|
1072
|
+
agentForkSourceHelper:
|
|
1073
|
+
"Each new session forks from this base. Pick a rotating message (auto-refreshing) or paste a Letta conversation id (conv-…). Either way it must belong to the same Letta agent.",
|
|
1074
|
+
agentForkSourceNotFoundError:
|
|
1075
|
+
"No Letta conversation with that id was found.",
|
|
1076
|
+
agentForkSourceAgentMismatchError:
|
|
1077
|
+
"That conversation belongs to a different Letta agent. The base conversation must be on the same agent as letta_agent_id above.",
|
|
1078
|
+
agentForkSourceModeNone: "None — start every session fresh",
|
|
1079
|
+
agentForkSourceModeRotating: "Rotating message",
|
|
1080
|
+
agentForkSourceModeManual: "Conversation id",
|
|
1081
|
+
agentForkSourceRotatingSearchPlaceholder: "Search rotating messages…",
|
|
1082
|
+
agentForkSourceRotatingEmpty: "No rotating messages yet. Create one on the Rotating messages page.",
|
|
1083
|
+
agentForkSourceRotatingNotFoundError:
|
|
1084
|
+
"That rotating message no longer exists or is archived.",
|
|
1085
|
+
agentForkSourceRotatingMismatchError:
|
|
1086
|
+
"That rotating message runs against a different Letta agent. It must share the same agent as letta_agent_id above.",
|
|
1087
|
+
/* Rotating starting messages. */
|
|
1088
|
+
rotatingHeading: "Rotating messages",
|
|
1089
|
+
rotatingLoading: "Loading rotating messages…",
|
|
1090
|
+
rotatingEmpty: "No rotating messages yet.",
|
|
1091
|
+
rotatingGenericError: "Could not load rotating messages.",
|
|
1092
|
+
rotatingCreateButton: "+ Create rotating message",
|
|
1093
|
+
rotatingColumnName: "Name",
|
|
1094
|
+
rotatingColumnAgent: "Letta agent",
|
|
1095
|
+
rotatingColumnSchedule: "Schedule",
|
|
1096
|
+
rotatingColumnStatus: "Last run",
|
|
1097
|
+
rotatingColumnId: "Reference id",
|
|
1098
|
+
rotatingColumnActions: "Actions",
|
|
1099
|
+
rotatingEditButton: "Edit",
|
|
1100
|
+
rotatingRotateNowButton: "Rotate now",
|
|
1101
|
+
rotatingArchiveButton: "Archive",
|
|
1102
|
+
rotatingUnarchiveButton: "Unarchive",
|
|
1103
|
+
rotatingArchiveConfirmPrompt: "Archive rotating message “{name}”? Agents using it will fail to start new sessions until repointed.",
|
|
1104
|
+
rotatingShowArchivedToggle: "Show archived",
|
|
1105
|
+
rotatingStatusPending: "Not run yet",
|
|
1106
|
+
rotatingStatusOk: "OK",
|
|
1107
|
+
rotatingStatusError: "Failed",
|
|
1108
|
+
rotatingStatusArchived: "Archived",
|
|
1109
|
+
rotatingRotateNowRunning: "Rotating…",
|
|
1110
|
+
createRotatingModalTitle: "Create rotating message",
|
|
1111
|
+
editRotatingModalTitle: "Edit “{name}”",
|
|
1112
|
+
rotatingNameLabel: "Display name",
|
|
1113
|
+
rotatingNameHelper: "Operator-facing label. Not shown to end users.",
|
|
1114
|
+
rotatingNameRequiredError: "A display name is required.",
|
|
1115
|
+
rotatingPromptLabel: "Prompt",
|
|
1116
|
+
rotatingPromptHelper:
|
|
1117
|
+
"Sent to the agent each rotation. The agent's reply becomes the prepared opening message (e.g. “Summarize today's weather for Prague.”).",
|
|
1118
|
+
rotatingPromptRequiredError: "A prompt is required.",
|
|
1119
|
+
rotatingAgentLabel: "Letta agent id",
|
|
1120
|
+
rotatingAgentHelper:
|
|
1121
|
+
"The Letta agent the prompt runs against. Agents that reference this rotating message must share this Letta agent id.",
|
|
1122
|
+
rotatingAgentRequiredError: "A Letta agent id is required.",
|
|
1123
|
+
rotatingAgentNotFoundError: "No Letta agent with that id was found.",
|
|
1124
|
+
rotatingScheduleLabel: "Rotation schedule",
|
|
1125
|
+
rotatingScheduleEveryOption: "Every…",
|
|
1126
|
+
rotatingScheduleDailyOption: "Daily at…",
|
|
1127
|
+
rotatingScheduleCronOption: "Advanced (cron)",
|
|
1128
|
+
rotatingIntervalValueLabel: "Every",
|
|
1129
|
+
rotatingIntervalUnitHours: "hours",
|
|
1130
|
+
rotatingIntervalUnitDays: "days",
|
|
1131
|
+
rotatingDailyTimeLabel: "Time (UTC)",
|
|
1132
|
+
rotatingDailyTimeHelper: "24-hour HH:MM, in UTC.",
|
|
1133
|
+
rotatingCronLabel: "Cron expression",
|
|
1134
|
+
rotatingCronHelper: "5-field cron (minute hour day-of-month month day-of-week), evaluated in UTC. E.g. “0 6 * * *” = 06:00 UTC daily.",
|
|
1135
|
+
rotatingScheduleInvalidError: "That schedule isn't valid. Check the interval / time / cron expression.",
|
|
1136
|
+
rotatingSubmitGenericError: "Could not save the rotating message. Try again.",
|
|
1137
|
+
rotatingModalCancelButton: "Cancel",
|
|
1138
|
+
rotatingModalCreateButton: "Create",
|
|
1139
|
+
rotatingModalSaveButton: "Save",
|
|
1140
|
+
rotatingModalSubmittingButton: "Saving…",
|
|
1141
|
+
/* Step 12 — Sessions overview. */
|
|
1142
|
+
sessionsOverviewHeading: "Sessions",
|
|
1143
|
+
sessionsOverviewSearchPlaceholder: "Search titles…",
|
|
1144
|
+
sessionsOverviewOwnerFilterLabel: "Owner",
|
|
1145
|
+
sessionsOverviewOwnerFilterAll: "all users",
|
|
1146
|
+
sessionsOverviewAgentFilterLabel: "Agent",
|
|
1147
|
+
sessionsOverviewAgentFilterAll: "all agents",
|
|
1148
|
+
sessionsOverviewStatusFilterLabel: "Status",
|
|
1149
|
+
sessionsOverviewStatusActive: "active",
|
|
1150
|
+
sessionsOverviewStatusArchived: "archived",
|
|
1151
|
+
sessionsOverviewStatusAll: "all",
|
|
1152
|
+
sessionsOverviewColumnTitle: "Title",
|
|
1153
|
+
sessionsOverviewColumnOwner: "Owner",
|
|
1154
|
+
sessionsOverviewColumnAgent: "Agent",
|
|
1155
|
+
sessionsOverviewColumnLastMessage: "Last msg",
|
|
1156
|
+
sessionsOverviewColumnActions: "Actions",
|
|
1157
|
+
sessionsOverviewViewButton: "View",
|
|
1158
|
+
sessionsOverviewPrevPage: "← Prev",
|
|
1159
|
+
sessionsOverviewNextPage: "Next →",
|
|
1160
|
+
sessionsOverviewPageNumber: "Page {n}",
|
|
1161
|
+
sessionsOverviewLoading: "Loading sessions…",
|
|
1162
|
+
sessionsOverviewEmpty: "No sessions match the current filters.",
|
|
1163
|
+
sessionsOverviewGenericError: "Could not load sessions. Try again.",
|
|
1164
|
+
sessionsOverviewBackLink: "← Back to sessions",
|
|
1165
|
+
sessionsOverviewDetailHeading: "{title} — {owner} — {agent}",
|
|
1166
|
+
sessionsOverviewDetailLoading: "Loading messages…",
|
|
1167
|
+
sessionsOverviewDetailEmpty: "This session has no messages yet.",
|
|
1168
|
+
sessionsOverviewDetailGenericError:
|
|
1169
|
+
"Could not load messages. Try again.",
|
|
1170
|
+
sessionsOverviewDetailSandboxLabel: "Sandbox:",
|
|
1171
|
+
sessionsOverviewDetailSandboxPresent:
|
|
1172
|
+
"on disk under AI_HUB_FILES_DIR/sandboxes/<session-id>/",
|
|
1173
|
+
sessionsOverviewDetailSandboxAbsent: "— (no sandbox)",
|
|
1174
|
+
sessionsOverviewPurgeSandboxButton: "Purge sandbox",
|
|
1175
|
+
sessionsOverviewPurgeSandboxConfirmPrompt:
|
|
1176
|
+
"Delete the session's sandbox folder and all its contents? This cannot be undone.",
|
|
1177
|
+
sessionsOverviewPurgeSandboxConfirming: "Purging…",
|
|
1178
|
+
sessionsOverviewPurgeSandboxSuccessFlash: "Sandbox purged.",
|
|
1179
|
+
sessionsOverviewPurgeSandboxTurnRunningError:
|
|
1180
|
+
"Cannot purge sandbox while a turn is running. Wait for the turn to complete and try again.",
|
|
1181
|
+
sessionsOverviewPurgeSandboxGenericError:
|
|
1182
|
+
"Could not purge the sandbox. Try again.",
|
|
1183
|
+
/* Step 12 — Settings. */
|
|
1184
|
+
settingsHeading: "Settings",
|
|
1185
|
+
settingsLoading: "Loading settings…",
|
|
1186
|
+
settingsGenericError: "Could not load settings. Try again.",
|
|
1187
|
+
settingsLettaSectionHeading: "Letta connection",
|
|
1188
|
+
settingsLettaBaseUrlLabel: "Letta base URL",
|
|
1189
|
+
settingsLettaAdeUrlLabel:
|
|
1190
|
+
"Letta ADE URL (browser-facing — used for “Open Letta ADE” link)",
|
|
1191
|
+
settingsLettaAdeUrlHelper:
|
|
1192
|
+
"Optional; if blank, derived from the base URL with /v1 stripped.",
|
|
1193
|
+
settingsLettaApiKeyLabel: "Letta API key",
|
|
1194
|
+
settingsLettaApiKeyDbHelper:
|
|
1195
|
+
"Currently configured via the admin panel (overrides LETTA_API_KEY env). Type a new value to replace it, or clear the override to fall back to env.",
|
|
1196
|
+
settingsLettaApiKeyEnvHelper:
|
|
1197
|
+
"Currently using LETTA_API_KEY from the server's env. Type a value here to override env with an admin-panel value.",
|
|
1198
|
+
settingsLettaApiKeyNoneHelper:
|
|
1199
|
+
"No key configured (neither admin panel nor LETTA_API_KEY env). Paste the Letta server's password here, or set LETTA_API_KEY in .env.",
|
|
1200
|
+
settingsLettaApiKeyMaskedHelper:
|
|
1201
|
+
"Currently configured. Type a new value to replace it.",
|
|
1202
|
+
settingsLettaApiKeyUnsetHelper:
|
|
1203
|
+
"No key configured. Paste the Letta server's API key here.",
|
|
1204
|
+
settingsLettaApiKeyPlaceholder: "••••••••••••••••",
|
|
1205
|
+
settingsLettaApiKeyClearOverrideButton: "Clear admin override (use env value)",
|
|
1206
|
+
settingsSaveLettaButton: "Save connection",
|
|
1207
|
+
settingsSaveSavingButton: "Saving…",
|
|
1208
|
+
settingsSaveSuccessFlash: "Saved.",
|
|
1209
|
+
settingsSaveGenericError: "Could not save. Try again.",
|
|
1210
|
+
settingsThemeSectionHeading: "Theme",
|
|
1211
|
+
settingsThemeDefaultLabel: "Default theme",
|
|
1212
|
+
settingsThemeDefaultLight: "Light",
|
|
1213
|
+
settingsThemeDefaultDark: "Dark",
|
|
1214
|
+
settingsThemeSwitcherEnabledLabel: "Allow users to switch themes",
|
|
1215
|
+
settingsThemeSwitcherEnabledHelper:
|
|
1216
|
+
"When off, the deployment is single-theme: the theme switcher is hidden and every user sees the default theme.",
|
|
1217
|
+
settingsSaveThemeButton: "Save theme",
|
|
1218
|
+
settingsTogglesSectionHeading: "UI feature toggles",
|
|
1219
|
+
settingsTogglesGroupSessions: "Sessions panel",
|
|
1220
|
+
settingsTogglesGroupInput: "Input",
|
|
1221
|
+
settingsTogglesGroupAffordances: "Chat affordances",
|
|
1222
|
+
settingsTogglesSaveButton: "Save toggles",
|
|
1223
|
+
settingsSigningKeySectionHeading: "Signing key",
|
|
1224
|
+
settingsSigningKeyLastRotated: "Last rotated: {date}",
|
|
1225
|
+
settingsSigningKeyNeverRotated: "Never rotated since deploy.",
|
|
1226
|
+
settingsSigningKeyWarning:
|
|
1227
|
+
"Rotating the signing key invalidates every outstanding session. Every signed-in user (including you) will be logged out and need to log in again. There is no undo.",
|
|
1228
|
+
settingsRotateSigningKeyButton: "Rotate signing key",
|
|
1229
|
+
settingsRotateSigningKeyModalTitle: "Rotate signing key?",
|
|
1230
|
+
settingsRotateSigningKeyModalBody:
|
|
1231
|
+
"This will log out every signed-in user immediately, including you. They (and you) will need to log back in.",
|
|
1232
|
+
settingsRotateConfirmInputLabel: "Type ROTATE to confirm:",
|
|
1233
|
+
settingsRotateConfirmPlaceholder: "ROTATE",
|
|
1234
|
+
settingsRotateConfirmKeyword: "ROTATE",
|
|
1235
|
+
settingsRotateConfirmButton: "Rotate",
|
|
1236
|
+
settingsRotateConfirmingButton: "Rotating…",
|
|
1237
|
+
settingsRotateGenericError: "Could not rotate. Try again.",
|
|
1238
|
+
settingsMetricsSectionHeading: "Metrics scrape token",
|
|
1239
|
+
settingsMetricsLastRotated: "Last rotated: {date}",
|
|
1240
|
+
settingsMetricsNeverRotated: "Never rotated since deploy.",
|
|
1241
|
+
settingsMetricsWarning:
|
|
1242
|
+
"Rotating invalidates the current token immediately. Every scraper using the old value will start failing until you paste the new token into its config. The new token is shown ONCE on rotation — copy it before closing the dialog.",
|
|
1243
|
+
settingsRotateMetricsButton: "Rotate metrics token",
|
|
1244
|
+
settingsRotateMetricsModalTitle: "Rotate metrics scrape token?",
|
|
1245
|
+
settingsRotateMetricsModalBody:
|
|
1246
|
+
"Old scrapers will start failing until you paste the new value into their config. Your own session is NOT affected.",
|
|
1247
|
+
settingsMetricsRevealTitle: "Metrics token rotated",
|
|
1248
|
+
settingsMetricsRevealTokenLabel: "New bearer token",
|
|
1249
|
+
settingsMetricsRevealWarning:
|
|
1250
|
+
"This token will be shown only once. Copy it into your Prometheus / Alloy / scraper config before dismissing this dialog.",
|
|
1251
|
+
}),
|
|
1252
|
+
}) as AIHubTexts;
|
|
1253
|
+
|
|
1254
|
+
/**
|
|
1255
|
+
* Resolves the final `AIHubTexts` map by merging a wrapper-supplied partial
|
|
1256
|
+
* over the English defaults. Resolution is **shallow per namespace, deep per
|
|
1257
|
+
* key** — wrappers can override individual keys without re-declaring the
|
|
1258
|
+
* whole namespace.
|
|
1259
|
+
*
|
|
1260
|
+
* Example:
|
|
1261
|
+
*
|
|
1262
|
+
* ```ts
|
|
1263
|
+
* resolveAIHubTexts({ login: { signInButton: "Přihlásit" } })
|
|
1264
|
+
* .login.signInButton // "Přihlásit"
|
|
1265
|
+
* .login.signingInButton // "Signing in…" (default)
|
|
1266
|
+
* .changePassword.title // "Change Password" (default)
|
|
1267
|
+
* ```
|
|
1268
|
+
*
|
|
1269
|
+
* @param overrides - the wrapper-supplied partial. `undefined` is fine and
|
|
1270
|
+
* returns the defaults unchanged.
|
|
1271
|
+
* @returns the fully resolved `AIHubTexts`.
|
|
1272
|
+
*/
|
|
1273
|
+
export function resolveAIHubTexts(
|
|
1274
|
+
overrides: DeepPartial<AIHubTexts> | undefined,
|
|
1275
|
+
): AIHubTexts {
|
|
1276
|
+
if (!overrides) return defaultAIHubTexts;
|
|
1277
|
+
return {
|
|
1278
|
+
login: { ...defaultAIHubTexts.login, ...(overrides.login ?? {}) },
|
|
1279
|
+
changePassword: {
|
|
1280
|
+
...defaultAIHubTexts.changePassword,
|
|
1281
|
+
...(overrides.changePassword ?? {}),
|
|
1282
|
+
},
|
|
1283
|
+
chat: { ...defaultAIHubTexts.chat, ...(overrides.chat ?? {}) },
|
|
1284
|
+
admin: { ...defaultAIHubTexts.admin, ...(overrides.admin ?? {}) },
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
/**
|
|
1289
|
+
* Recursive `Partial` — wrappers only need to set the keys they want to
|
|
1290
|
+
* override; everything else falls back to the English default.
|
|
1291
|
+
*/
|
|
1292
|
+
export type DeepPartial<T> = {
|
|
1293
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
1294
|
+
};
|