@vertesia/ui 1.5.0 → 1.6.0-dev.20260918.061604Z

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 (336) hide show
  1. package/README.md +125 -0
  2. package/lib/boot/branding.d.ts +58 -0
  3. package/lib/boot/branding.d.ts.map +1 -0
  4. package/lib/boot/branding.js +62 -0
  5. package/lib/boot/branding.js.map +1 -0
  6. package/lib/boot/index.d.ts +27 -0
  7. package/lib/boot/index.d.ts.map +1 -0
  8. package/lib/boot/index.js +325 -0
  9. package/lib/boot/index.js.map +1 -0
  10. package/lib/boot/vite.d.ts +63 -0
  11. package/lib/boot/vite.d.ts.map +1 -0
  12. package/lib/boot/vite.js +108 -0
  13. package/lib/boot/vite.js.map +1 -0
  14. package/lib/core/components/shadcn/button.d.ts.map +1 -1
  15. package/lib/core/components/shadcn/button.js +1 -2
  16. package/lib/core/components/shadcn/button.js.map +1 -1
  17. package/lib/core/components/shadcn/filters/filter-styles.d.ts +1 -1
  18. package/lib/core/components/shadcn/filters/filter-styles.d.ts.map +1 -1
  19. package/lib/core/components/shadcn/filters/filter-styles.js +4 -4
  20. package/lib/core/components/shadcn/label.js +1 -1
  21. package/lib/core/components/shadcn/label.js.map +1 -1
  22. package/lib/env/index.d.ts +32 -1
  23. package/lib/env/index.d.ts.map +1 -1
  24. package/lib/env/index.js +55 -3
  25. package/lib/env/index.js.map +1 -1
  26. package/lib/features/agent/PayloadBuilder.d.ts +4 -0
  27. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  28. package/lib/features/agent/PayloadBuilder.js +6 -1
  29. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  30. package/lib/features/agent/chat/AgentRunFeedback.d.ts +66 -0
  31. package/lib/features/agent/chat/AgentRunFeedback.d.ts.map +1 -0
  32. package/lib/features/agent/chat/AgentRunFeedback.js +298 -0
  33. package/lib/features/agent/chat/AgentRunFeedback.js.map +1 -0
  34. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  35. package/lib/features/agent/chat/ModernAgentConversation.js +7 -5
  36. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  37. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -1
  38. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  39. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +11 -10
  40. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  41. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  42. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  43. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +3 -1
  44. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  45. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +28 -7
  46. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  47. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  48. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +2 -0
  49. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  50. package/lib/features/agent/chat/hooks/useAgentPlans.d.ts +1 -1
  51. package/lib/features/agent/chat/hooks/useAgentPlans.d.ts.map +1 -1
  52. package/lib/features/agent/chat/hooks/useAgentPlans.js +5 -5
  53. package/lib/features/agent/chat/hooks/useAgentPlans.js.map +1 -1
  54. package/lib/features/agent/chat/index.d.ts +1 -0
  55. package/lib/features/agent/chat/index.d.ts.map +1 -1
  56. package/lib/features/agent/chat/index.js +1 -0
  57. package/lib/features/agent/chat/index.js.map +1 -1
  58. package/lib/features/facets/AgentRunnerFacetsNav.d.ts +8 -0
  59. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  60. package/lib/features/facets/AgentRunnerFacetsNav.js +12 -0
  61. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  62. package/lib/features/permissions/UserPermissionsProvider.d.ts +15 -1
  63. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  64. package/lib/features/permissions/UserPermissionsProvider.js +20 -12
  65. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  66. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  67. package/lib/features/store/objects/search/DocumentSearchContext.js +6 -1
  68. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  69. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  70. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  71. package/lib/features/store/types/TypeRegistry.d.ts +130 -0
  72. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  73. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +130 -0
  74. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  75. package/lib/i18n/index.d.ts +5 -4
  76. package/lib/i18n/index.d.ts.map +1 -1
  77. package/lib/i18n/index.js +16 -2
  78. package/lib/i18n/index.js.map +1 -1
  79. package/lib/i18n/locales/ar.json +30 -0
  80. package/lib/i18n/locales/de.json +30 -0
  81. package/lib/i18n/locales/en.json +30 -0
  82. package/lib/i18n/locales/es.json +30 -0
  83. package/lib/i18n/locales/fr.json +30 -0
  84. package/lib/i18n/locales/it.json +30 -0
  85. package/lib/i18n/locales/ja.json +30 -0
  86. package/lib/i18n/locales/ko.json +30 -0
  87. package/lib/i18n/locales/pt.json +30 -0
  88. package/lib/i18n/locales/ru.json +30 -0
  89. package/lib/i18n/locales/tr.json +30 -0
  90. package/lib/i18n/locales/zh-TW.json +30 -0
  91. package/lib/i18n/locales/zh.json +30 -0
  92. package/lib/layout/ErrorPage.js +1 -1
  93. package/lib/layout/ErrorPage.js.map +1 -1
  94. package/lib/layout/Navbar.d.ts.map +1 -1
  95. package/lib/layout/Navbar.js +3 -2
  96. package/lib/layout/Navbar.js.map +1 -1
  97. package/lib/session/UserSession.d.ts.map +1 -1
  98. package/lib/session/UserSession.js +2 -3
  99. package/lib/session/UserSession.js.map +1 -1
  100. package/lib/session/UserSessionProvider.d.ts +2 -1
  101. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  102. package/lib/session/UserSessionProvider.js +13 -4
  103. package/lib/session/UserSessionProvider.js.map +1 -1
  104. package/lib/session/auth/composable.d.ts.map +1 -1
  105. package/lib/session/auth/composable.js +88 -3
  106. package/lib/session/auth/composable.js.map +1 -1
  107. package/lib/session/auth/domainRouting.d.ts +22 -12
  108. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  109. package/lib/session/auth/domainRouting.js +35 -21
  110. package/lib/session/auth/domainRouting.js.map +1 -1
  111. package/lib/session/auth/firebase.d.ts.map +1 -1
  112. package/lib/session/auth/firebase.js +10 -0
  113. package/lib/session/auth/firebase.js.map +1 -1
  114. package/lib/session/auth/useAuthState.d.ts +9 -4
  115. package/lib/session/auth/useAuthState.d.ts.map +1 -1
  116. package/lib/session/auth/useAuthState.js +9 -4
  117. package/lib/session/auth/useAuthState.js.map +1 -1
  118. package/lib/session/index.d.ts.map +1 -1
  119. package/lib/session/index.js +3 -1
  120. package/lib/session/index.js.map +1 -1
  121. package/lib/shell/AuthScreenPreview.d.ts +12 -0
  122. package/lib/shell/AuthScreenPreview.d.ts.map +1 -0
  123. package/lib/shell/AuthScreenPreview.js +140 -0
  124. package/lib/shell/AuthScreenPreview.js.map +1 -0
  125. package/lib/shell/BrandedAuthScreens.d.ts +19 -0
  126. package/lib/shell/BrandedAuthScreens.d.ts.map +1 -0
  127. package/lib/shell/BrandedAuthScreens.js +64 -0
  128. package/lib/shell/BrandedAuthScreens.js.map +1 -0
  129. package/lib/shell/SplashScreen.d.ts +13 -2
  130. package/lib/shell/SplashScreen.d.ts.map +1 -1
  131. package/lib/shell/SplashScreen.js +20 -19
  132. package/lib/shell/SplashScreen.js.map +1 -1
  133. package/lib/shell/VertesiaShell.d.ts +15 -4
  134. package/lib/shell/VertesiaShell.d.ts.map +1 -1
  135. package/lib/shell/VertesiaShell.js +8 -3
  136. package/lib/shell/VertesiaShell.js.map +1 -1
  137. package/lib/shell/apps/StandaloneApp.js +5 -1
  138. package/lib/shell/apps/StandaloneApp.js.map +1 -1
  139. package/lib/shell/index.d.ts +6 -0
  140. package/lib/shell/index.d.ts.map +1 -1
  141. package/lib/shell/index.js +5 -0
  142. package/lib/shell/index.js.map +1 -1
  143. package/lib/shell/login/SignInAuthPending.js +1 -1
  144. package/lib/shell/login/SignInAuthPending.js.map +1 -1
  145. package/lib/shell/login/SignInEmailStep.d.ts.map +1 -1
  146. package/lib/shell/login/SignInEmailStep.js +2 -2
  147. package/lib/shell/login/SignInEmailStep.js.map +1 -1
  148. package/lib/shell/login/SignInFlow.d.ts +68 -0
  149. package/lib/shell/login/SignInFlow.d.ts.map +1 -0
  150. package/lib/shell/login/SignInFlow.js +108 -0
  151. package/lib/shell/login/SignInFlow.js.map +1 -0
  152. package/lib/shell/login/SignInIcons.d.ts +1 -1
  153. package/lib/shell/login/SignInIcons.d.ts.map +1 -1
  154. package/lib/shell/login/SignInPageShell.d.ts +13 -0
  155. package/lib/shell/login/SignInPageShell.d.ts.map +1 -0
  156. package/lib/shell/login/SignInPageShell.js +14 -0
  157. package/lib/shell/login/SignInPageShell.js.map +1 -0
  158. package/lib/shell/login/SignInPrimitives.d.ts +3 -3
  159. package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
  160. package/lib/shell/login/SignInPrimitives.js +13 -11
  161. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  162. package/lib/shell/login/SignInRestrictedEnvStep.d.ts +5 -0
  163. package/lib/shell/login/SignInRestrictedEnvStep.d.ts.map +1 -1
  164. package/lib/shell/login/SignInRestrictedEnvStep.js +8 -4
  165. package/lib/shell/login/SignInRestrictedEnvStep.js.map +1 -1
  166. package/lib/shell/login/SigninScreen.d.ts +38 -3
  167. package/lib/shell/login/SigninScreen.d.ts.map +1 -1
  168. package/lib/shell/login/SigninScreen.js +33 -86
  169. package/lib/shell/login/SigninScreen.js.map +1 -1
  170. package/lib/shell/login/SignupForm.d.ts +3 -1
  171. package/lib/shell/login/SignupForm.d.ts.map +1 -1
  172. package/lib/shell/login/SignupForm.js +7 -3
  173. package/lib/shell/login/SignupForm.js.map +1 -1
  174. package/lib/shell/login/signInUtils.d.ts +12 -1
  175. package/lib/shell/login/signInUtils.d.ts.map +1 -1
  176. package/lib/shell/login/signInUtils.js +34 -11
  177. package/lib/shell/login/signInUtils.js.map +1 -1
  178. package/lib/vertesia-ui-boot.js +237 -0
  179. package/lib/vertesia-ui-boot.js.map +1 -0
  180. package/lib/vertesia-ui-core.js +88 -46
  181. package/lib/vertesia-ui-core.js.map +1 -1
  182. package/lib/vertesia-ui-env.js +1 -1
  183. package/lib/vertesia-ui-env.js.map +1 -1
  184. package/lib/vertesia-ui-features.js +350 -317
  185. package/lib/vertesia-ui-features.js.map +1 -1
  186. package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js +5 -0
  187. package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js.map +1 -0
  188. package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js +5 -0
  189. package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js.map +1 -0
  190. package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js +5 -0
  191. package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js.map +1 -0
  192. package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js +5 -0
  193. package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js.map +1 -0
  194. package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js +5 -0
  195. package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js.map +1 -0
  196. package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js +5 -0
  197. package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js.map +1 -0
  198. package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js +5 -0
  199. package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js.map +1 -0
  200. package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js +5 -0
  201. package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js.map +1 -0
  202. package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js +5 -0
  203. package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js.map +1 -0
  204. package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js +5 -0
  205. package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js.map +1 -0
  206. package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js +5 -0
  207. package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js.map +1 -0
  208. package/lib/vertesia-ui-i18n.js +2 -2
  209. package/lib/vertesia-ui-i18n.js.map +1 -1
  210. package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js +5 -0
  211. package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js.map +1 -0
  212. package/lib/vertesia-ui-layout.js +43 -19
  213. package/lib/vertesia-ui-layout.js.map +1 -1
  214. package/lib/vertesia-ui-rich-text.js +123 -74
  215. package/lib/vertesia-ui-rich-text.js.map +1 -1
  216. package/lib/vertesia-ui-router.js.map +1 -1
  217. package/lib/vertesia-ui-session.js +1 -1
  218. package/lib/vertesia-ui-session.js.map +1 -1
  219. package/lib/vertesia-ui-shell.js +87 -33
  220. package/lib/vertesia-ui-shell.js.map +1 -1
  221. package/lib/vertesia-ui-widgets.js +154 -98
  222. package/lib/vertesia-ui-widgets.js.map +1 -1
  223. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  224. package/llms.txt +6 -2
  225. package/package.json +45 -36
  226. package/src/__tests__/a11y.test.tsx +25 -0
  227. package/src/__tests__/theme.test.ts +91 -0
  228. package/src/boot/branding.test.ts +72 -0
  229. package/src/boot/branding.ts +108 -0
  230. package/src/boot/index.test.ts +216 -0
  231. package/src/boot/index.ts +356 -0
  232. package/src/boot/vite.test.ts +93 -0
  233. package/src/boot/vite.ts +118 -0
  234. package/src/core/components/shadcn/button.tsx +1 -2
  235. package/src/core/components/shadcn/filters/filter-styles.ts +4 -4
  236. package/src/core/components/shadcn/label.tsx +1 -1
  237. package/src/env/index.test.ts +127 -0
  238. package/src/env/index.ts +73 -3
  239. package/src/features/agent/PayloadBuilder.tsx +10 -1
  240. package/src/features/agent/chat/AgentRunFeedback.test.tsx +347 -0
  241. package/src/features/agent/chat/AgentRunFeedback.tsx +465 -0
  242. package/src/features/agent/chat/ModernAgentConversation.test.tsx +1 -1
  243. package/src/features/agent/chat/ModernAgentConversation.tsx +52 -47
  244. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +145 -0
  245. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +42 -24
  246. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +4 -0
  247. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +38 -5
  248. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +2 -0
  249. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +14 -0
  250. package/src/features/agent/chat/hooks/useAgentPlans.test.ts +52 -0
  251. package/src/features/agent/chat/hooks/useAgentPlans.ts +5 -5
  252. package/src/features/agent/chat/hooks/useFileProcessing.test.tsx +0 -5
  253. package/src/features/agent/chat/index.ts +6 -0
  254. package/src/features/facets/AgentRunnerFacetsNav.tsx +26 -0
  255. package/src/features/permissions/UserPermissionsProvider.test.tsx +50 -1
  256. package/src/features/permissions/UserPermissionsProvider.tsx +82 -44
  257. package/src/features/store/objects/search/DocumentSearchContext.ts +8 -3
  258. package/src/features/store/objects/selection/SelectionActions.tsx +4 -1
  259. package/src/i18n/index.tsx +25 -2
  260. package/src/i18n/locales/ar.json +30 -0
  261. package/src/i18n/locales/de.json +30 -0
  262. package/src/i18n/locales/en.json +30 -0
  263. package/src/i18n/locales/es.json +30 -0
  264. package/src/i18n/locales/fr.json +30 -0
  265. package/src/i18n/locales/it.json +30 -0
  266. package/src/i18n/locales/ja.json +30 -0
  267. package/src/i18n/locales/ko.json +30 -0
  268. package/src/i18n/locales/pt.json +30 -0
  269. package/src/i18n/locales/ru.json +30 -0
  270. package/src/i18n/locales/tr.json +30 -0
  271. package/src/i18n/locales/zh-TW.json +30 -0
  272. package/src/i18n/locales/zh.json +30 -0
  273. package/src/layout/ErrorPage.tsx +1 -1
  274. package/src/layout/Navbar.test.tsx +58 -0
  275. package/src/layout/Navbar.tsx +5 -2
  276. package/src/router/path.test.ts +5 -5
  277. package/src/session/UserSession.ts +2 -4
  278. package/src/session/UserSessionProvider.strict-mode.test.tsx +44 -0
  279. package/src/session/UserSessionProvider.test.ts +62 -1
  280. package/src/session/UserSessionProvider.tsx +12 -4
  281. package/src/session/auth/composable.renewal.test.ts +170 -0
  282. package/src/session/auth/composable.test.ts +23 -1
  283. package/src/session/auth/composable.ts +101 -2
  284. package/src/session/auth/domainRouting.test.ts +35 -65
  285. package/src/session/auth/domainRouting.ts +51 -34
  286. package/src/session/auth/firebase.test.ts +25 -0
  287. package/src/session/auth/firebase.ts +10 -0
  288. package/src/session/auth/useAuthState.ts +11 -4
  289. package/src/session/index.ts +3 -1
  290. package/src/shell/AuthScreenPreview.test.tsx +44 -0
  291. package/src/shell/AuthScreenPreview.tsx +228 -0
  292. package/src/shell/BrandedAuthScreens.test.tsx +181 -0
  293. package/src/shell/BrandedAuthScreens.tsx +117 -0
  294. package/src/shell/SplashScreen.test.tsx +37 -0
  295. package/src/shell/SplashScreen.tsx +44 -39
  296. package/src/shell/VertesiaShell.tsx +49 -22
  297. package/src/shell/apps/StandaloneApp.tsx +5 -1
  298. package/src/shell/index.tsx +6 -0
  299. package/src/shell/login/SignInAuthPending.tsx +3 -3
  300. package/src/shell/login/SignInEmailStep.test.tsx +32 -0
  301. package/src/shell/login/SignInEmailStep.tsx +13 -9
  302. package/src/shell/login/SignInFlow.tsx +213 -0
  303. package/src/shell/login/SignInPageShell.tsx +62 -0
  304. package/src/shell/login/SignInPrimitives.tsx +14 -11
  305. package/src/shell/login/SignInRestrictedEnvStep.tsx +19 -7
  306. package/src/shell/login/SigninScreen.test.tsx +104 -0
  307. package/src/shell/login/SigninScreen.tsx +115 -145
  308. package/src/shell/login/SignupForm.tsx +8 -3
  309. package/src/shell/login/signInUtils.ts +42 -9
  310. package/src/widgets/markdown/CollaborativeMarkdownRenderer.test.tsx +11 -3
  311. package/src/widgets/markdown/markdown.css +21 -21
  312. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +0 -5
  313. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +0 -1
  314. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +0 -5
  315. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +0 -1
  316. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +0 -5
  317. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +0 -1
  318. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +0 -5
  319. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +0 -1
  320. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +0 -5
  321. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +0 -1
  322. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +0 -5
  323. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +0 -1
  324. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +0 -5
  325. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +0 -1
  326. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +0 -5
  327. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +0 -1
  328. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +0 -5
  329. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +0 -1
  330. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +0 -5
  331. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +0 -1
  332. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +0 -5
  333. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +0 -1
  334. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +0 -5
  335. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +0 -1
  336. package/src/session/auth/authState.test.ts +0 -35
@@ -1,8 +1,9 @@
1
1
  import { act, fireEvent, render, screen } from '@testing-library/react';
2
2
  import { VertesiaClient } from '@vertesia/client';
3
3
  import type { AuthTokenPayload, SystemRoleDefinition } from '@vertesia/common';
4
+ import { Button } from '@vertesia/ui/core';
4
5
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { UserPermissionProvider } from './UserPermissionsProvider';
6
+ import { type PermissionLoadingScreenProps, UserPermissionProvider } from './UserPermissionsProvider';
6
7
 
7
8
  const session = {
8
9
  client: new VertesiaClient({ serverUrl: 'https://studio.example.test', storeUrl: 'https://store.example.test' }),
@@ -169,4 +170,52 @@ describe('role mapping recovery', () => {
169
170
  expect(screen.getByText('Protected workspace')).toBeTruthy();
170
171
  expect(fetch).not.toHaveBeenCalled();
171
172
  });
173
+ it.each([401, 403, 500])('supplies working recovery actions to a custom screen for status %s', async (status) => {
174
+ const fetch = vi
175
+ .spyOn(session.client.iam.roles, 'listSystem')
176
+ .mockRejectedValue(Object.assign(new Error('Request failed'), { status }));
177
+ const CustomScreen = ({ status: phase, onAction, actionLabel }: PermissionLoadingScreenProps) => (
178
+ <main>
179
+ <p>Custom {phase}</p>
180
+ {phase === 'error' && <Button onClick={onAction}>{actionLabel}</Button>}
181
+ </main>
182
+ );
183
+ const view = render(
184
+ <UserPermissionProvider LoadingScreen={CustomScreen}>
185
+ <div>Protected workspace</div>
186
+ </UserPermissionProvider>,
187
+ );
188
+ expect(view.container.firstElementChild?.tagName).toBe('MAIN');
189
+ expect(screen.getByText('Custom loading')).toBeTruthy();
190
+ expect(screen.queryByText('Protected workspace')).toBeNull();
191
+ await advance(0);
192
+ expect(screen.getByText('Custom error')).toBeTruthy();
193
+ expect(screen.queryByText('Protected workspace')).toBeNull();
194
+ fetch.mockResolvedValue([]);
195
+ fireEvent.click(screen.getByRole('button'));
196
+ await advance(0);
197
+ if (status === 401 || status === 403) {
198
+ expect(session.signOut).toHaveBeenCalledOnce();
199
+ expect(screen.queryByText('Protected workspace')).toBeNull();
200
+ } else {
201
+ expect(screen.getByText('Protected workspace')).toBeTruthy();
202
+ expect(screen.queryByText('Custom error')).toBeNull();
203
+ }
204
+ });
205
+
206
+ it('reports automatic retrying to a custom screen before revealing protected content', async () => {
207
+ vi.spyOn(session.client.iam.roles, 'listSystem')
208
+ .mockRejectedValueOnce(Object.assign(new Error('Unavailable'), { status: 503 }))
209
+ .mockResolvedValue([]);
210
+ render(
211
+ <UserPermissionProvider LoadingScreen={({ status }) => <main>Custom {status}</main>}>
212
+ <div>Protected workspace</div>
213
+ </UserPermissionProvider>,
214
+ );
215
+ await advance(0);
216
+ expect(screen.getByText('Custom retrying')).toBeTruthy();
217
+ expect(screen.queryByText('Protected workspace')).toBeNull();
218
+ await advance(1_000);
219
+ expect(screen.getByText('Protected workspace')).toBeTruthy();
220
+ });
172
221
  });
@@ -2,7 +2,7 @@ import { type AuthTokenPayload, type Permission, PrincipalType, type SystemRoleD
2
2
  import { Button, errorMessage, Spinner } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
5
- import { createContext, useContext, useMemo } from 'react';
5
+ import { type ComponentType, createContext, useContext, useMemo } from 'react';
6
6
  import { isAnyOf } from './helpers';
7
7
  import { roleMappingsErrorStatus, useRoleMappings } from './useRoleMappings';
8
8
 
@@ -67,11 +67,23 @@ export function useUserPermissions() {
67
67
  return perms;
68
68
  }
69
69
 
70
+ export interface PermissionLoadingScreenProps {
71
+ status: 'loading' | 'retrying' | 'error';
72
+ error?: unknown;
73
+ title: string;
74
+ description: string;
75
+ loadingIcon?: React.ReactNode;
76
+ /** Localized label and action appropriate to the failure (retry, or sign out for 401/403). */
77
+ actionLabel: string;
78
+ onAction: () => void;
79
+ }
80
+
70
81
  interface UserPermissionProviderProps {
82
+ LoadingScreen?: ComponentType<PermissionLoadingScreenProps>;
71
83
  children: React.ReactNode;
72
84
  loadingIcon?: React.ReactNode;
73
85
  }
74
- export function UserPermissionProvider({ children, loadingIcon }: UserPermissionProviderProps) {
86
+ export function UserPermissionProvider({ children, loadingIcon, LoadingScreen }: UserPermissionProviderProps) {
75
87
  const { t } = useUITranslation();
76
88
  const session = useUserSession();
77
89
  const authToken = session.authToken;
@@ -100,51 +112,77 @@ export function UserPermissionProvider({ children, loadingIcon }: UserPermission
100
112
  : failed
101
113
  ? t('permissions.connectionFailed')
102
114
  : t('permissions.connecting');
115
+ const description = needsSignIn
116
+ ? t('auth.recovery.credential.body')
117
+ : denied
118
+ ? t('permissions.accessDenied')
119
+ : failed
120
+ ? t('permissions.tryAgainLater')
121
+ : state.status === 'retrying'
122
+ ? t('permissions.retrying')
123
+ : t('permissions.loadingPermissions');
124
+ const actionLabel =
125
+ needsSignIn || denied ? t('auth.recovery.useDifferentAccount') : t('auth.recovery.tryAgain');
126
+ const onAction = needsSignIn || denied ? () => session.signOut() : retry;
127
+ const Screen = LoadingScreen ?? DefaultPermissionLoadingScreen;
103
128
  return (
104
- <div className="flex min-h-dvh items-center justify-center bg-background px-6 text-foreground">
105
- <div className="w-full max-w-md space-y-6 text-center">
106
- <div aria-hidden="true" className="flex justify-center">
107
- {loadingIcon || (!failed && <Spinner size="2xl" className="text-info" />)}
108
- </div>
109
- <div
110
- role={failed ? 'alert' : 'status'}
111
- aria-live={failed ? 'assertive' : 'polite'}
112
- className="space-y-2"
113
- >
114
- <h1 className="text-xl font-semibold">{title}</h1>
115
- <p className="text-muted">
116
- {needsSignIn
117
- ? t('auth.recovery.credential.body')
118
- : denied
119
- ? t('permissions.accessDenied')
120
- : failed
121
- ? t('permissions.tryAgainLater')
122
- : state.status === 'retrying'
123
- ? t('permissions.retrying')
124
- : t('permissions.loadingPermissions')}
125
- </p>
126
- </div>
127
- {failed && (
128
- <>
129
- <Button variant="outline" onClick={needsSignIn || denied ? () => session.signOut() : retry}>
130
- {needsSignIn || denied
131
- ? t('auth.recovery.useDifferentAccount')
132
- : t('auth.recovery.tryAgain')}
133
- </Button>
134
- {state.error != null && (
135
- <details className="text-start text-sm text-muted">
136
- <summary className="cursor-pointer">{t('auth.recovery.technicalDetails')}</summary>
137
- <pre className="mt-2 max-h-48 overflow-auto whitespace-pre-wrap wrap-break-word">
138
- {errorMessage(state.error)}
139
- </pre>
140
- </details>
141
- )}
142
- </>
143
- )}
144
- </div>
145
- </div>
129
+ <Screen
130
+ status={failed ? 'error' : state.status === 'retrying' ? 'retrying' : 'loading'}
131
+ error={failed ? state.error : undefined}
132
+ title={title}
133
+ description={description}
134
+ loadingIcon={loadingIcon}
135
+ actionLabel={actionLabel}
136
+ onAction={onAction}
137
+ />
146
138
  );
147
139
  }
148
140
 
149
141
  return perms && <UserPermissionsContext.Provider value={perms}>{children}</UserPermissionsContext.Provider>;
150
142
  }
143
+
144
+ /** Shared permission-loading and recovery layout. */
145
+ export function DefaultPermissionLoadingScreen({
146
+ status,
147
+ error,
148
+ title,
149
+ description,
150
+ loadingIcon,
151
+ actionLabel,
152
+ onAction,
153
+ }: PermissionLoadingScreenProps) {
154
+ const { t } = useUITranslation();
155
+ const failed = status === 'error';
156
+ return (
157
+ <div className="flex min-h-dvh items-center justify-center bg-background px-6 text-foreground">
158
+ <div className="w-full max-w-md space-y-6 text-center">
159
+ <div aria-hidden="true" className="flex justify-center">
160
+ {loadingIcon || (!failed && <Spinner size="2xl" className="text-info" />)}
161
+ </div>
162
+ <div
163
+ role={failed ? 'alert' : 'status'}
164
+ aria-live={failed ? 'assertive' : 'polite'}
165
+ className="space-y-2"
166
+ >
167
+ <h1 className="text-xl font-semibold">{title}</h1>
168
+ <p className="text-muted">{description}</p>
169
+ </div>
170
+ {failed && (
171
+ <>
172
+ <Button variant="outline" onClick={onAction}>
173
+ {actionLabel}
174
+ </Button>
175
+ {error != null && (
176
+ <details className="text-start text-sm text-muted">
177
+ <summary className="cursor-pointer">{t('auth.recovery.technicalDetails')}</summary>
178
+ <pre className="mt-2 max-h-48 overflow-auto whitespace-pre-wrap wrap-break-word">
179
+ {errorMessage(error)}
180
+ </pre>
181
+ </details>
182
+ )}
183
+ </>
184
+ )}
185
+ </div>
186
+ </div>
187
+ );
188
+ }
@@ -176,9 +176,14 @@ export class DocumentSearch implements SearchInterface {
176
176
  }
177
177
 
178
178
  computeFacets(_query: ObjectSearchQuery) {
179
- this._facetsRequest().then((facets) => {
180
- this.facets.value = facets;
181
- });
179
+ this._facetsRequest()
180
+ .then((facets) => {
181
+ this.facets.value = facets;
182
+ })
183
+ .catch((err: unknown) => {
184
+ const error = err instanceof Error ? err : new Error(String(err));
185
+ this.result.value = { ...this.result.value, error };
186
+ });
182
187
  }
183
188
 
184
189
  async _search(loadMore = false, noFacets = false): Promise<boolean> {
@@ -110,7 +110,10 @@ export function UploadObjectsButton({
110
110
  function optionLayout(option: ObjectsActionSpec) {
111
111
  return {
112
112
  label: option.name,
113
- className: clsx('flex-1 px-2 py-2 hover:bg-muted nowrap', option.destructive ? 'text-destructive' : ''),
113
+ className: clsx(
114
+ 'flex-1 px-2 py-2 hover:bg-muted whitespace-nowrap',
115
+ option.destructive ? 'text-destructive' : '',
116
+ ),
114
117
  };
115
118
  }
116
119
 
@@ -1,4 +1,5 @@
1
- import { type ReactNode, useEffect } from 'react';
1
+ import type { i18n } from 'i18next';
2
+ import { createContext, type ReactNode, useContext, useEffect, useMemo } from 'react';
2
3
  import { I18nextProvider, Trans, useTranslation } from 'react-i18next';
3
4
  import { i18nInstance, NAMESPACE } from './instance.js';
4
5
  import { useLanguage } from './LanguageProvider.js';
@@ -48,8 +49,30 @@ export function LanguageBoundI18nProvider({ children }: { children: ReactNode })
48
49
  * Hook for components inside @vertesia/ui to get translation functions.
49
50
  * Always binds to the 'vertesia.ui' namespace on the scoped instance.
50
51
  */
52
+ const TranslationInstanceContext = createContext<i18n | undefined>(undefined);
53
+
54
+ /** Overrides are scoped to this subtree and never mutate the shared translation resources. */
55
+ export function UITranslationOverrides({
56
+ overrides,
57
+ children,
58
+ }: {
59
+ overrides: Record<string, string>;
60
+ children: ReactNode;
61
+ }) {
62
+ const parent = useContext(TranslationInstanceContext) ?? i18nInstance;
63
+ const { i18n: current } = useTranslation(NAMESPACE, { i18n: parent });
64
+ const language = current.resolvedLanguage ?? current.language;
65
+ const instance = useMemo(() => {
66
+ const clone = parent.cloneInstance({ forkResourceStore: true, lng: language, initAsync: false });
67
+ clone.addResourceBundle(language, NAMESPACE, overrides, true, true);
68
+ return clone;
69
+ }, [parent, language, overrides]);
70
+ return <TranslationInstanceContext.Provider value={instance}>{children}</TranslationInstanceContext.Provider>;
71
+ }
72
+
51
73
  export function useUITranslation() {
52
- return useTranslation(NAMESPACE, { i18n: i18nInstance });
74
+ const instance = useContext(TranslationInstanceContext) ?? i18nInstance;
75
+ return useTranslation(NAMESPACE, { i18n: instance });
53
76
  }
54
77
 
55
78
  export { i18nInstance, NAMESPACE } from './instance.js';
@@ -101,6 +101,35 @@
101
101
  "agent.failedToInterrupt": "فشل الإيقاف",
102
102
  "agent.failedToLoadDocument": "فشل تحميل المستند",
103
103
  "agent.failedToSend": "فشل إرسال الرسالة",
104
+ "agent.feedback.commentHelp": "يُحتسب فقط ما إذا كنت قد تركت تعليقًا؛ أما النص نفسه فيبقى داخل مشروعك.",
105
+ "agent.feedback.commentLabel": "تعليق",
106
+ "agent.feedback.commentPlaceholder": "ما الذي سار على ما يرام، وما الذي حدث فيه خلل؟",
107
+ "agent.feedback.detailHelp": "تم حفظ تقييمك. أضف سببًا إذا أردت قول المزيد.",
108
+ "agent.feedback.detailTitle": "أخبرنا المزيد",
109
+ "agent.feedback.failed": "تعذّر إرسال تقييمك",
110
+ "agent.feedback.notRecorded": "لم يتم تسجيل تقييمك",
111
+ "agent.feedback.rateMessageDown": "تقييم هذه الإجابة بالسلب",
112
+ "agent.feedback.rateMessageUp": "تقييم هذه الإجابة بالإيجاب",
113
+ "agent.feedback.rateRunDown": "تقييم هذا التشغيل بالسلب",
114
+ "agent.feedback.rateRunUp": "تقييم هذا التشغيل بالإيجاب",
115
+ "agent.feedback.reason.accurate": "دقيق",
116
+ "agent.feedback.reason.fast": "سريع",
117
+ "agent.feedback.reason.helpful": "مفيد",
118
+ "agent.feedback.reason.incomplete": "غير مكتمل",
119
+ "agent.feedback.reason.misunderstood_request": "أساء فهم طلبي",
120
+ "agent.feedback.reason.other": "شيء آخر",
121
+ "agent.feedback.reason.too_slow": "بطيء جدًا",
122
+ "agent.feedback.reason.tool_failure": "فشلت إحدى الأدوات",
123
+ "agent.feedback.reason.unsafe_action": "قام بإجراء غير آمن",
124
+ "agent.feedback.reason.well_explained": "شرح جيد",
125
+ "agent.feedback.reason.wrong_result": "نتيجة خاطئة",
126
+ "agent.feedback.reasonLabel": "السبب",
127
+ "agent.feedback.reasonPlaceholder": "اختر سببًا (اختياري)",
128
+ "agent.feedback.skip": "ليس الآن",
129
+ "agent.feedback.status.disabled": "لا يتم جمع التقييمات في هذه البيئة.",
130
+ "agent.feedback.submit": "إرسال",
131
+ "agent.feedback.tellUsMore": "أخبرنا المزيد",
132
+ "agent.feedback.thanks": "شكرًا على ملاحظاتك",
104
133
  "agent.filesProcessing": "لا تزال الملفات قيد المعالجة",
105
134
  "agent.fileStagedTooltip": "ملف مُعدّ - سيتم رفعه عند بدء المحادثة",
106
135
  "agent.fullscreen": "ملء الشاشة",
@@ -333,6 +362,7 @@
333
362
  "layout.pageNotFound": "الصفحة غير موجودة",
334
363
  "layout.search": "بحث",
335
364
  "layout.searchPlaceholder": "بحث...",
365
+ "layout.toggleNavigationMenu": "تبديل قائمة التنقل",
336
366
  "login.accept": "قبول",
337
367
  "login.reject": "رفض",
338
368
  "login.reviewInvites": "مراجعة الدعوات",
@@ -93,6 +93,35 @@
93
93
  "agent.failedToInterrupt": "Unterbrechung fehlgeschlagen",
94
94
  "agent.failedToLoadDocument": "Dokument konnte nicht geladen werden",
95
95
  "agent.failedToSend": "Nachricht konnte nicht gesendet werden",
96
+ "agent.feedback.commentHelp": "Gezählt wird nur, ob Sie einen Kommentar hinterlassen haben; der Text selbst bleibt in Ihrem Projekt.",
97
+ "agent.feedback.commentLabel": "Kommentar",
98
+ "agent.feedback.commentPlaceholder": "Was lief gut, was lief schief?",
99
+ "agent.feedback.detailHelp": "Ihre Bewertung wurde gespeichert. Fügen Sie einen Grund hinzu, wenn Sie mehr sagen möchten.",
100
+ "agent.feedback.detailTitle": "Erzählen Sie uns mehr",
101
+ "agent.feedback.failed": "Bewertung konnte nicht gesendet werden",
102
+ "agent.feedback.notRecorded": "Ihre Bewertung wurde nicht erfasst",
103
+ "agent.feedback.rateMessageDown": "Diese Antwort negativ bewerten",
104
+ "agent.feedback.rateMessageUp": "Diese Antwort positiv bewerten",
105
+ "agent.feedback.rateRunDown": "Diesen Lauf negativ bewerten",
106
+ "agent.feedback.rateRunUp": "Diesen Lauf positiv bewerten",
107
+ "agent.feedback.reason.accurate": "Korrekt",
108
+ "agent.feedback.reason.fast": "Schnell",
109
+ "agent.feedback.reason.helpful": "Hilfreich",
110
+ "agent.feedback.reason.incomplete": "Unvollständig",
111
+ "agent.feedback.reason.misunderstood_request": "Hat meine Anfrage missverstanden",
112
+ "agent.feedback.reason.other": "Etwas anderes",
113
+ "agent.feedback.reason.too_slow": "Zu langsam",
114
+ "agent.feedback.reason.tool_failure": "Ein Tool ist fehlgeschlagen",
115
+ "agent.feedback.reason.unsafe_action": "Hat etwas Unsicheres getan",
116
+ "agent.feedback.reason.well_explained": "Gut erklärt",
117
+ "agent.feedback.reason.wrong_result": "Falsches Ergebnis",
118
+ "agent.feedback.reasonLabel": "Grund",
119
+ "agent.feedback.reasonPlaceholder": "Grund auswählen (optional)",
120
+ "agent.feedback.skip": "Jetzt nicht",
121
+ "agent.feedback.status.disabled": "In dieser Umgebung werden keine Bewertungen erfasst.",
122
+ "agent.feedback.submit": "Senden",
123
+ "agent.feedback.tellUsMore": "Erzählen Sie uns mehr",
124
+ "agent.feedback.thanks": "Danke für Ihr Feedback",
96
125
  "agent.filesProcessing": "Dateien werden noch verarbeitet",
97
126
  "agent.fileStagedTooltip": "Datei bereitgestellt - wird beim Start der Konversation hochgeladen",
98
127
  "agent.fullscreen": "Vollbild",
@@ -321,6 +350,7 @@
321
350
  "layout.pageNotFound": "Seite nicht gefunden",
322
351
  "layout.search": "Suche",
323
352
  "layout.searchPlaceholder": "Suchen...",
353
+ "layout.toggleNavigationMenu": "Navigationsmenü umschalten",
324
354
  "login.accept": "Akzeptieren",
325
355
  "login.reject": "Ablehnen",
326
356
  "login.reviewInvites": "Einladungen überprüfen",
@@ -147,6 +147,35 @@
147
147
  "agent.failedToLoadArtifact": "Failed to load artifact",
148
148
  "agent.failedToLoadDocument": "Failed to load document",
149
149
  "agent.failedToSend": "Failed to Send Message",
150
+ "agent.feedback.commentHelp": "Only whether you left a comment is ever counted; the text itself stays in your project.",
151
+ "agent.feedback.commentLabel": "Comment",
152
+ "agent.feedback.commentPlaceholder": "What went well, or what went wrong?",
153
+ "agent.feedback.detailHelp": "Your rating is saved. Add a reason if you want to say more.",
154
+ "agent.feedback.detailTitle": "Tell us more",
155
+ "agent.feedback.failed": "Could not send your rating",
156
+ "agent.feedback.notRecorded": "Your rating was not recorded",
157
+ "agent.feedback.rateMessageDown": "Rate this answer down",
158
+ "agent.feedback.rateMessageUp": "Rate this answer up",
159
+ "agent.feedback.rateRunDown": "Rate this run down",
160
+ "agent.feedback.rateRunUp": "Rate this run up",
161
+ "agent.feedback.reason.accurate": "Accurate",
162
+ "agent.feedback.reason.fast": "Fast",
163
+ "agent.feedback.reason.helpful": "Helpful",
164
+ "agent.feedback.reason.incomplete": "Incomplete",
165
+ "agent.feedback.reason.misunderstood_request": "Misunderstood my request",
166
+ "agent.feedback.reason.other": "Something else",
167
+ "agent.feedback.reason.too_slow": "Too slow",
168
+ "agent.feedback.reason.tool_failure": "A tool failed",
169
+ "agent.feedback.reason.unsafe_action": "Did something unsafe",
170
+ "agent.feedback.reason.well_explained": "Well explained",
171
+ "agent.feedback.reason.wrong_result": "Wrong result",
172
+ "agent.feedback.reasonLabel": "Reason",
173
+ "agent.feedback.reasonPlaceholder": "Pick a reason (optional)",
174
+ "agent.feedback.skip": "Not now",
175
+ "agent.feedback.status.disabled": "Ratings are not collected in this environment.",
176
+ "agent.feedback.submit": "Send",
177
+ "agent.feedback.tellUsMore": "Tell us more",
178
+ "agent.feedback.thanks": "Thanks for the feedback",
150
179
  "agent.fileStagedTooltip": "File staged and will upload when conversation starts",
151
180
  "agent.filesProcessing": "Files Still Processing",
152
181
  "agent.fullEditor": "Full editor",
@@ -631,6 +660,7 @@
631
660
  "layout.pageNotFound": "Page Not Found",
632
661
  "layout.search": "Search",
633
662
  "layout.searchPlaceholder": "Search...",
663
+ "layout.toggleNavigationMenu": "Toggle navigation menu",
634
664
  "login.accept": "Accept",
635
665
  "login.reject": "Reject",
636
666
  "login.reviewInvites": "Review Invites",
@@ -94,6 +94,35 @@
94
94
  "agent.failedToInterrupt": "Error al interrumpir",
95
95
  "agent.failedToLoadDocument": "Error al cargar el documento",
96
96
  "agent.failedToSend": "Error al enviar el mensaje",
97
+ "agent.feedback.commentHelp": "Solo se cuenta si dejaste un comentario; el texto en sí permanece en tu proyecto.",
98
+ "agent.feedback.commentLabel": "Comentario",
99
+ "agent.feedback.commentPlaceholder": "¿Qué salió bien o qué salió mal?",
100
+ "agent.feedback.detailHelp": "Tu valoración se ha guardado. Añade un motivo si quieres decir más.",
101
+ "agent.feedback.detailTitle": "Cuéntanos más",
102
+ "agent.feedback.failed": "No se pudo enviar tu valoración",
103
+ "agent.feedback.notRecorded": "Tu valoración no se registró",
104
+ "agent.feedback.rateMessageDown": "Valorar negativamente esta respuesta",
105
+ "agent.feedback.rateMessageUp": "Valorar positivamente esta respuesta",
106
+ "agent.feedback.rateRunDown": "Valorar negativamente esta ejecución",
107
+ "agent.feedback.rateRunUp": "Valorar positivamente esta ejecución",
108
+ "agent.feedback.reason.accurate": "Preciso",
109
+ "agent.feedback.reason.fast": "Rápido",
110
+ "agent.feedback.reason.helpful": "Útil",
111
+ "agent.feedback.reason.incomplete": "Incompleto",
112
+ "agent.feedback.reason.misunderstood_request": "Malinterpretó mi solicitud",
113
+ "agent.feedback.reason.other": "Otra cosa",
114
+ "agent.feedback.reason.too_slow": "Demasiado lento",
115
+ "agent.feedback.reason.tool_failure": "Falló una herramienta",
116
+ "agent.feedback.reason.unsafe_action": "Hizo algo inseguro",
117
+ "agent.feedback.reason.well_explained": "Bien explicado",
118
+ "agent.feedback.reason.wrong_result": "Resultado incorrecto",
119
+ "agent.feedback.reasonLabel": "Motivo",
120
+ "agent.feedback.reasonPlaceholder": "Elige un motivo (opcional)",
121
+ "agent.feedback.skip": "Ahora no",
122
+ "agent.feedback.status.disabled": "En este entorno no se recogen valoraciones.",
123
+ "agent.feedback.submit": "Enviar",
124
+ "agent.feedback.tellUsMore": "Cuéntanos más",
125
+ "agent.feedback.thanks": "Gracias por tus comentarios",
97
126
  "agent.filesProcessing": "Archivos aún en procesamiento",
98
127
  "agent.fileStagedTooltip": "Archivo preparado - se subirá cuando la conversación comience",
99
128
  "agent.fullscreen": "Pantalla completa",
@@ -323,6 +352,7 @@
323
352
  "layout.pageNotFound": "Página no encontrada",
324
353
  "layout.search": "Buscar",
325
354
  "layout.searchPlaceholder": "Buscar...",
355
+ "layout.toggleNavigationMenu": "Alternar menú de navegación",
326
356
  "login.accept": "Aceptar",
327
357
  "login.reject": "Rechazar",
328
358
  "login.reviewInvites": "Revisar invitaciones",
@@ -94,6 +94,35 @@
94
94
  "agent.failedToInterrupt": "Échec de l'interruption",
95
95
  "agent.failedToLoadDocument": "Échec du chargement du document",
96
96
  "agent.failedToSend": "Échec de l'envoi du message",
97
+ "agent.feedback.commentHelp": "Seule la présence d'un commentaire est comptabilisée ; le texte lui-même reste dans votre projet.",
98
+ "agent.feedback.commentLabel": "Commentaire",
99
+ "agent.feedback.commentPlaceholder": "Qu'est-ce qui a bien fonctionné, ou mal fonctionné ?",
100
+ "agent.feedback.detailHelp": "Votre évaluation est enregistrée. Ajoutez une raison si vous souhaitez en dire plus.",
101
+ "agent.feedback.detailTitle": "Dites-nous en plus",
102
+ "agent.feedback.failed": "Impossible d'envoyer votre évaluation",
103
+ "agent.feedback.notRecorded": "Votre évaluation n'a pas été enregistrée",
104
+ "agent.feedback.rateMessageDown": "Évaluer négativement cette réponse",
105
+ "agent.feedback.rateMessageUp": "Évaluer positivement cette réponse",
106
+ "agent.feedback.rateRunDown": "Évaluer négativement cette exécution",
107
+ "agent.feedback.rateRunUp": "Évaluer positivement cette exécution",
108
+ "agent.feedback.reason.accurate": "Exact",
109
+ "agent.feedback.reason.fast": "Rapide",
110
+ "agent.feedback.reason.helpful": "Utile",
111
+ "agent.feedback.reason.incomplete": "Incomplet",
112
+ "agent.feedback.reason.misunderstood_request": "A mal compris ma demande",
113
+ "agent.feedback.reason.other": "Autre chose",
114
+ "agent.feedback.reason.too_slow": "Trop lent",
115
+ "agent.feedback.reason.tool_failure": "Un outil a échoué",
116
+ "agent.feedback.reason.unsafe_action": "A effectué une action risquée",
117
+ "agent.feedback.reason.well_explained": "Bien expliqué",
118
+ "agent.feedback.reason.wrong_result": "Résultat incorrect",
119
+ "agent.feedback.reasonLabel": "Raison",
120
+ "agent.feedback.reasonPlaceholder": "Choisissez une raison (facultatif)",
121
+ "agent.feedback.skip": "Pas maintenant",
122
+ "agent.feedback.status.disabled": "Les évaluations ne sont pas collectées dans cet environnement.",
123
+ "agent.feedback.submit": "Envoyer",
124
+ "agent.feedback.tellUsMore": "Dites-nous en plus",
125
+ "agent.feedback.thanks": "Merci pour votre retour",
97
126
  "agent.filesProcessing": "Fichiers en cours de traitement",
98
127
  "agent.fileStagedTooltip": "Fichier en attente - sera importé au début de la conversation",
99
128
  "agent.fullscreen": "Plein écran",
@@ -323,6 +352,7 @@
323
352
  "layout.pageNotFound": "Page non trouvée",
324
353
  "layout.search": "Rechercher",
325
354
  "layout.searchPlaceholder": "Rechercher...",
355
+ "layout.toggleNavigationMenu": "Afficher ou masquer le menu de navigation",
326
356
  "login.accept": "Accepter",
327
357
  "login.reject": "Refuser",
328
358
  "login.reviewInvites": "Examiner les invitations",
@@ -94,6 +94,35 @@
94
94
  "agent.failedToInterrupt": "Impossibile interrompere",
95
95
  "agent.failedToLoadDocument": "Impossibile caricare il documento",
96
96
  "agent.failedToSend": "Impossibile inviare il messaggio",
97
+ "agent.feedback.commentHelp": "Viene conteggiato solo se hai lasciato un commento; il testo resta nel tuo progetto.",
98
+ "agent.feedback.commentLabel": "Commento",
99
+ "agent.feedback.commentPlaceholder": "Cosa è andato bene o cosa è andato storto?",
100
+ "agent.feedback.detailHelp": "La tua valutazione è stata salvata. Aggiungi un motivo se vuoi dire di più.",
101
+ "agent.feedback.detailTitle": "Raccontaci di più",
102
+ "agent.feedback.failed": "Impossibile inviare la tua valutazione",
103
+ "agent.feedback.notRecorded": "La tua valutazione non è stata registrata",
104
+ "agent.feedback.rateMessageDown": "Valuta negativamente questa risposta",
105
+ "agent.feedback.rateMessageUp": "Valuta positivamente questa risposta",
106
+ "agent.feedback.rateRunDown": "Valuta negativamente questa esecuzione",
107
+ "agent.feedback.rateRunUp": "Valuta positivamente questa esecuzione",
108
+ "agent.feedback.reason.accurate": "Accurato",
109
+ "agent.feedback.reason.fast": "Veloce",
110
+ "agent.feedback.reason.helpful": "Utile",
111
+ "agent.feedback.reason.incomplete": "Incompleto",
112
+ "agent.feedback.reason.misunderstood_request": "Ha frainteso la mia richiesta",
113
+ "agent.feedback.reason.other": "Altro",
114
+ "agent.feedback.reason.too_slow": "Troppo lento",
115
+ "agent.feedback.reason.tool_failure": "Uno strumento non ha funzionato",
116
+ "agent.feedback.reason.unsafe_action": "Ha fatto qualcosa di non sicuro",
117
+ "agent.feedback.reason.well_explained": "Ben spiegato",
118
+ "agent.feedback.reason.wrong_result": "Risultato errato",
119
+ "agent.feedback.reasonLabel": "Motivo",
120
+ "agent.feedback.reasonPlaceholder": "Scegli un motivo (facoltativo)",
121
+ "agent.feedback.skip": "Non ora",
122
+ "agent.feedback.status.disabled": "In questo ambiente le valutazioni non vengono raccolte.",
123
+ "agent.feedback.submit": "Invia",
124
+ "agent.feedback.tellUsMore": "Raccontaci di più",
125
+ "agent.feedback.thanks": "Grazie per il tuo feedback",
97
126
  "agent.filesProcessing": "File ancora in elaborazione",
98
127
  "agent.fileStagedTooltip": "File in attesa - verrà caricato all'inizio della conversazione",
99
128
  "agent.fullscreen": "Schermo intero",
@@ -323,6 +352,7 @@
323
352
  "layout.pageNotFound": "Pagina non trovata",
324
353
  "layout.search": "Cerca",
325
354
  "layout.searchPlaceholder": "Cerca...",
355
+ "layout.toggleNavigationMenu": "Attiva o disattiva il menu di navigazione",
326
356
  "login.accept": "Accetta",
327
357
  "login.reject": "Rifiuta",
328
358
  "login.reviewInvites": "Rivedi inviti",
@@ -93,6 +93,35 @@
93
93
  "agent.failedToInterrupt": "中断に失敗しました",
94
94
  "agent.failedToLoadDocument": "ドキュメントの読み込みに失敗しました",
95
95
  "agent.failedToSend": "メッセージの送信に失敗しました",
96
+ "agent.feedback.commentHelp": "コメントを残したかどうかのみが集計されます。本文はプロジェクト内に留まります。",
97
+ "agent.feedback.commentLabel": "コメント",
98
+ "agent.feedback.commentPlaceholder": "よかった点、うまくいかなかった点は何ですか?",
99
+ "agent.feedback.detailHelp": "評価を保存しました。詳しく伝えたい場合は理由を追加してください。",
100
+ "agent.feedback.detailTitle": "詳しく教えてください",
101
+ "agent.feedback.failed": "評価を送信できませんでした",
102
+ "agent.feedback.notRecorded": "評価は記録されませんでした",
103
+ "agent.feedback.rateMessageDown": "この回答を低く評価",
104
+ "agent.feedback.rateMessageUp": "この回答を高く評価",
105
+ "agent.feedback.rateRunDown": "この実行を低く評価",
106
+ "agent.feedback.rateRunUp": "この実行を高く評価",
107
+ "agent.feedback.reason.accurate": "正確",
108
+ "agent.feedback.reason.fast": "速い",
109
+ "agent.feedback.reason.helpful": "役に立った",
110
+ "agent.feedback.reason.incomplete": "不完全",
111
+ "agent.feedback.reason.misunderstood_request": "リクエストを誤解した",
112
+ "agent.feedback.reason.other": "その他",
113
+ "agent.feedback.reason.too_slow": "遅すぎる",
114
+ "agent.feedback.reason.tool_failure": "ツールが失敗した",
115
+ "agent.feedback.reason.unsafe_action": "安全でない操作をした",
116
+ "agent.feedback.reason.well_explained": "説明が分かりやすい",
117
+ "agent.feedback.reason.wrong_result": "結果が誤っている",
118
+ "agent.feedback.reasonLabel": "理由",
119
+ "agent.feedback.reasonPlaceholder": "理由を選択(任意)",
120
+ "agent.feedback.skip": "後で",
121
+ "agent.feedback.status.disabled": "この環境では評価を収集していません。",
122
+ "agent.feedback.submit": "送信",
123
+ "agent.feedback.tellUsMore": "詳しく教えてください",
124
+ "agent.feedback.thanks": "フィードバックありがとうございます",
96
125
  "agent.filesProcessing": "ファイルを処理中",
97
126
  "agent.fileStagedTooltip": "ファイルがステージ済み - 会話開始時にアップロードされます",
98
127
  "agent.fullscreen": "フルスクリーン",
@@ -321,6 +350,7 @@
321
350
  "layout.pageNotFound": "ページが見つかりません",
322
351
  "layout.search": "検索",
323
352
  "layout.searchPlaceholder": "検索...",
353
+ "layout.toggleNavigationMenu": "ナビゲーションメニューを切り替え",
324
354
  "login.accept": "承認",
325
355
  "login.reject": "拒否",
326
356
  "login.reviewInvites": "招待を確認",