@agent-native/core 0.75.4 → 0.76.0

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 (459) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +47 -0
  3. package/corpus/core/docs/AGENTS.md +1 -0
  4. package/corpus/core/docs/content/client.md +15 -0
  5. package/corpus/core/docs/content/internationalization.md +145 -0
  6. package/corpus/core/docs/content/locales/ar-SA/internationalization.md +102 -0
  7. package/corpus/core/docs/content/locales/de-DE/internationalization.md +102 -0
  8. package/corpus/core/docs/content/locales/es-ES/internationalization.md +102 -0
  9. package/corpus/core/docs/content/locales/fr-FR/internationalization.md +102 -0
  10. package/corpus/core/docs/content/locales/hi-IN/internationalization.md +102 -0
  11. package/corpus/core/docs/content/locales/ja-JP/internationalization.md +114 -0
  12. package/corpus/core/docs/content/locales/ko-KR/internationalization.md +102 -0
  13. package/corpus/core/docs/content/locales/pt-BR/internationalization.md +102 -0
  14. package/corpus/core/docs/content/locales/zh-CN/internationalization.md +102 -0
  15. package/corpus/core/docs/content/skills-guide.md +19 -18
  16. package/corpus/core/package.json +7 -1
  17. package/corpus/core/src/agent/durable-background.ts +62 -28
  18. package/corpus/core/src/agent/production-agent.ts +16 -12
  19. package/corpus/core/src/cli/skills.ts +22 -4
  20. package/corpus/core/src/client/CommandMenu.tsx +16 -0
  21. package/corpus/core/src/client/app-providers.tsx +26 -1
  22. package/corpus/core/src/client/i18n.tsx +605 -0
  23. package/corpus/core/src/client/index.ts +28 -0
  24. package/corpus/core/src/deploy/build.ts +47 -113
  25. package/corpus/core/src/deploy/workspace-deploy.ts +62 -30
  26. package/corpus/core/src/index.browser.ts +25 -0
  27. package/corpus/core/src/localization/actions/get-localization-preference.ts +23 -0
  28. package/corpus/core/src/localization/actions/set-localization-preference.ts +30 -0
  29. package/corpus/core/src/localization/index.ts +2 -0
  30. package/corpus/core/src/localization/server.ts +131 -0
  31. package/corpus/core/src/localization/shared.ts +163 -0
  32. package/corpus/core/src/server/action-discovery.ts +8 -0
  33. package/corpus/core/src/server/index.ts +8 -0
  34. package/corpus/core/src/server/self-dispatch.ts +29 -2
  35. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  36. package/corpus/core/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  37. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  38. package/corpus/core/src/templates/default/AGENTS.md +16 -15
  39. package/corpus/core/src/templates/default/app/i18n/en-US.ts +29 -0
  40. package/corpus/core/src/templates/default/app/i18n/index.ts +13 -0
  41. package/corpus/core/src/templates/default/app/root.tsx +20 -1
  42. package/corpus/core/src/templates/default/app/routes/_index.tsx +24 -9
  43. package/corpus/core/src/templates/default/app/routes/settings.tsx +67 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  45. package/corpus/core/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
  47. package/corpus/core/src/vite/action-types-plugin.ts +10 -0
  48. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +6 -0
  49. package/corpus/templates/analytics/app/components/layout/Header.tsx +18 -15
  50. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  51. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +9 -3
  52. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +5 -3
  53. package/corpus/templates/analytics/app/i18n/ar-SA.ts +3 -0
  54. package/corpus/templates/analytics/app/i18n/de-DE.ts +3 -0
  55. package/corpus/templates/analytics/app/i18n/en-US.ts +3 -0
  56. package/corpus/templates/analytics/app/i18n/es-ES.ts +3 -0
  57. package/corpus/templates/analytics/app/i18n/fr-FR.ts +3 -0
  58. package/corpus/templates/analytics/app/i18n/hi-IN.ts +3 -0
  59. package/corpus/templates/analytics/app/i18n/index.ts +31 -0
  60. package/corpus/templates/analytics/app/i18n/ja-JP.ts +3 -0
  61. package/corpus/templates/analytics/app/i18n/ko-KR.ts +3 -0
  62. package/corpus/templates/analytics/app/i18n/pt-BR.ts +3 -0
  63. package/corpus/templates/analytics/app/i18n/zh-CN.ts +3 -0
  64. package/corpus/templates/analytics/app/i18n-data.ts +433 -0
  65. package/corpus/templates/analytics/app/pages/Settings.tsx +50 -16
  66. package/corpus/templates/analytics/app/root.tsx +14 -1
  67. package/corpus/templates/analytics/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  68. package/corpus/templates/analytics/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  69. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +6 -0
  70. package/corpus/templates/assets/app/components/layout/Header.tsx +17 -8
  71. package/corpus/templates/assets/app/components/layout/Layout.tsx +10 -6
  72. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +40 -23
  73. package/corpus/templates/assets/app/i18n/ar-SA.ts +3 -0
  74. package/corpus/templates/assets/app/i18n/de-DE.ts +3 -0
  75. package/corpus/templates/assets/app/i18n/en-US.ts +3 -0
  76. package/corpus/templates/assets/app/i18n/es-ES.ts +3 -0
  77. package/corpus/templates/assets/app/i18n/fr-FR.ts +3 -0
  78. package/corpus/templates/assets/app/i18n/hi-IN.ts +3 -0
  79. package/corpus/templates/assets/app/i18n/index.ts +31 -0
  80. package/corpus/templates/assets/app/i18n/ja-JP.ts +3 -0
  81. package/corpus/templates/assets/app/i18n/ko-KR.ts +3 -0
  82. package/corpus/templates/assets/app/i18n/pt-BR.ts +3 -0
  83. package/corpus/templates/assets/app/i18n/zh-CN.ts +3 -0
  84. package/corpus/templates/assets/app/i18n-data.ts +668 -0
  85. package/corpus/templates/assets/app/root.tsx +40 -15
  86. package/corpus/templates/assets/app/routes/_index.tsx +9 -10
  87. package/corpus/templates/assets/app/routes/settings.tsx +37 -6
  88. package/corpus/templates/assets/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  89. package/corpus/templates/assets/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  90. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  91. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +6 -0
  92. package/corpus/templates/brain/app/components/layout/Layout.tsx +12 -8
  93. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +23 -12
  94. package/corpus/templates/brain/app/i18n/ar-SA.ts +3 -0
  95. package/corpus/templates/brain/app/i18n/de-DE.ts +3 -0
  96. package/corpus/templates/brain/app/i18n/en-US.ts +3 -0
  97. package/corpus/templates/brain/app/i18n/es-ES.ts +3 -0
  98. package/corpus/templates/brain/app/i18n/fr-FR.ts +3 -0
  99. package/corpus/templates/brain/app/i18n/hi-IN.ts +3 -0
  100. package/corpus/templates/brain/app/i18n/index.ts +31 -0
  101. package/corpus/templates/brain/app/i18n/ja-JP.ts +3 -0
  102. package/corpus/templates/brain/app/i18n/ko-KR.ts +3 -0
  103. package/corpus/templates/brain/app/i18n/pt-BR.ts +3 -0
  104. package/corpus/templates/brain/app/i18n/zh-CN.ts +3 -0
  105. package/corpus/templates/brain/app/i18n-data.ts +624 -0
  106. package/corpus/templates/brain/app/root.tsx +27 -12
  107. package/corpus/templates/brain/app/routes/settings.tsx +45 -8
  108. package/corpus/templates/brain/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  109. package/corpus/templates/brain/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  110. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +6 -0
  111. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +2 -0
  112. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +16 -9
  113. package/corpus/templates/calendar/app/i18n/ar-SA.ts +57 -0
  114. package/corpus/templates/calendar/app/i18n/de-DE.ts +58 -0
  115. package/corpus/templates/calendar/app/i18n/en-US.ts +57 -0
  116. package/corpus/templates/calendar/app/i18n/es-ES.ts +58 -0
  117. package/corpus/templates/calendar/app/i18n/fr-FR.ts +58 -0
  118. package/corpus/templates/calendar/app/i18n/hi-IN.ts +57 -0
  119. package/corpus/templates/calendar/app/i18n/index.ts +31 -0
  120. package/corpus/templates/calendar/app/i18n/ja-JP.ts +58 -0
  121. package/corpus/templates/calendar/app/i18n/ko-KR.ts +57 -0
  122. package/corpus/templates/calendar/app/i18n/pt-BR.ts +57 -0
  123. package/corpus/templates/calendar/app/i18n/zh-CN.ts +57 -0
  124. package/corpus/templates/calendar/app/i18n-data.ts +516 -0
  125. package/corpus/templates/calendar/app/pages/CalendarView.tsx +2 -0
  126. package/corpus/templates/calendar/app/pages/Settings.tsx +63 -28
  127. package/corpus/templates/calendar/app/root.tsx +78 -7
  128. package/corpus/templates/calendar/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  129. package/corpus/templates/calendar/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  130. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  131. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +6 -0
  132. package/corpus/templates/chat/app/components/layout/Header.tsx +17 -11
  133. package/corpus/templates/chat/app/components/layout/Layout.tsx +12 -8
  134. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +47 -18
  135. package/corpus/templates/chat/app/i18n/ar-SA.ts +62 -0
  136. package/corpus/templates/chat/app/i18n/de-DE.ts +63 -0
  137. package/corpus/templates/chat/app/i18n/en-US.ts +63 -0
  138. package/corpus/templates/chat/app/i18n/es-ES.ts +63 -0
  139. package/corpus/templates/chat/app/i18n/fr-FR.ts +63 -0
  140. package/corpus/templates/chat/app/i18n/hi-IN.ts +63 -0
  141. package/corpus/templates/chat/app/i18n/index.ts +31 -0
  142. package/corpus/templates/chat/app/i18n/ja-JP.ts +63 -0
  143. package/corpus/templates/chat/app/i18n/ko-KR.ts +63 -0
  144. package/corpus/templates/chat/app/i18n/pt-BR.ts +63 -0
  145. package/corpus/templates/chat/app/i18n/zh-CN.ts +61 -0
  146. package/corpus/templates/chat/app/i18n-data.ts +475 -0
  147. package/corpus/templates/chat/app/root.tsx +18 -5
  148. package/corpus/templates/chat/app/routes/_index.tsx +9 -8
  149. package/corpus/templates/chat/app/routes/settings.tsx +86 -0
  150. package/corpus/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  151. package/corpus/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  152. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +6 -0
  153. package/corpus/templates/clips/app/components/layout/Header.tsx +23 -17
  154. package/corpus/templates/clips/app/components/library/empty-state.tsx +10 -34
  155. package/corpus/templates/clips/app/components/library/library-layout.tsx +45 -34
  156. package/corpus/templates/clips/app/i18n/ar-SA.ts +182 -0
  157. package/corpus/templates/clips/app/i18n/de-DE.ts +184 -0
  158. package/corpus/templates/clips/app/i18n/en-US.ts +179 -0
  159. package/corpus/templates/clips/app/i18n/es-ES.ts +183 -0
  160. package/corpus/templates/clips/app/i18n/fr-FR.ts +184 -0
  161. package/corpus/templates/clips/app/i18n/hi-IN.ts +180 -0
  162. package/corpus/templates/clips/app/i18n/index.ts +41 -0
  163. package/corpus/templates/clips/app/i18n/ja-JP.ts +180 -0
  164. package/corpus/templates/clips/app/i18n/ko-KR.ts +178 -0
  165. package/corpus/templates/clips/app/i18n/pt-BR.ts +183 -0
  166. package/corpus/templates/clips/app/i18n/zh-CN.ts +173 -0
  167. package/corpus/templates/clips/app/root.tsx +104 -10
  168. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +154 -95
  169. package/corpus/templates/clips/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-06-24-chrome-extension-setup-now-shows-a-clear-all-done-confirmati.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-06-24-clips-now-includes-a-language-picker-and-simplified-chinese-ui.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  173. package/corpus/templates/clips/chrome-extension/src/permission.html +60 -0
  174. package/corpus/templates/clips/chrome-extension/src/permission.ts +28 -15
  175. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +6 -0
  176. package/corpus/templates/content/app/components/EmptyState.tsx +7 -5
  177. package/corpus/templates/content/app/components/ThemeToggle.tsx +4 -2
  178. package/corpus/templates/content/app/components/layout/Header.tsx +2 -0
  179. package/corpus/templates/content/app/components/layout/Layout.tsx +8 -7
  180. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +41 -1
  181. package/corpus/templates/content/app/i18n/ar-SA.ts +3 -0
  182. package/corpus/templates/content/app/i18n/de-DE.ts +3 -0
  183. package/corpus/templates/content/app/i18n/en-US.ts +3 -0
  184. package/corpus/templates/content/app/i18n/es-ES.ts +3 -0
  185. package/corpus/templates/content/app/i18n/fr-FR.ts +3 -0
  186. package/corpus/templates/content/app/i18n/hi-IN.ts +3 -0
  187. package/corpus/templates/content/app/i18n/index.ts +31 -0
  188. package/corpus/templates/content/app/i18n/ja-JP.ts +3 -0
  189. package/corpus/templates/content/app/i18n/ko-KR.ts +3 -0
  190. package/corpus/templates/content/app/i18n/pt-BR.ts +3 -0
  191. package/corpus/templates/content/app/i18n/zh-CN.ts +3 -0
  192. package/corpus/templates/content/app/i18n-data.ts +490 -0
  193. package/corpus/templates/content/app/root.tsx +110 -23
  194. package/corpus/templates/content/app/routes/_app.settings.tsx +84 -0
  195. package/corpus/templates/content/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  196. package/corpus/templates/content/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  197. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +6 -0
  198. package/corpus/templates/design/app/components/layout/Header.tsx +16 -8
  199. package/corpus/templates/design/app/components/layout/Layout.tsx +8 -6
  200. package/corpus/templates/design/app/components/layout/Sidebar.tsx +25 -9
  201. package/corpus/templates/design/app/i18n/ar-SA.ts +3 -0
  202. package/corpus/templates/design/app/i18n/de-DE.ts +3 -0
  203. package/corpus/templates/design/app/i18n/en-US.ts +3 -0
  204. package/corpus/templates/design/app/i18n/es-ES.ts +3 -0
  205. package/corpus/templates/design/app/i18n/fr-FR.ts +3 -0
  206. package/corpus/templates/design/app/i18n/hi-IN.ts +3 -0
  207. package/corpus/templates/design/app/i18n/index.ts +31 -0
  208. package/corpus/templates/design/app/i18n/ja-JP.ts +3 -0
  209. package/corpus/templates/design/app/i18n/ko-KR.ts +3 -0
  210. package/corpus/templates/design/app/i18n/pt-BR.ts +3 -0
  211. package/corpus/templates/design/app/i18n/zh-CN.ts +3 -0
  212. package/corpus/templates/design/app/i18n-data.ts +350 -0
  213. package/corpus/templates/design/app/root.tsx +40 -15
  214. package/corpus/templates/design/app/routes/settings.tsx +43 -0
  215. package/corpus/templates/design/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  217. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +6 -0
  218. package/corpus/templates/dispatch/app/i18n/ar-SA.ts +3 -0
  219. package/corpus/templates/dispatch/app/i18n/de-DE.ts +3 -0
  220. package/corpus/templates/dispatch/app/i18n/en-US.ts +3 -0
  221. package/corpus/templates/dispatch/app/i18n/es-ES.ts +3 -0
  222. package/corpus/templates/dispatch/app/i18n/fr-FR.ts +3 -0
  223. package/corpus/templates/dispatch/app/i18n/hi-IN.ts +3 -0
  224. package/corpus/templates/dispatch/app/i18n/index.ts +31 -0
  225. package/corpus/templates/dispatch/app/i18n/ja-JP.ts +3 -0
  226. package/corpus/templates/dispatch/app/i18n/ko-KR.ts +3 -0
  227. package/corpus/templates/dispatch/app/i18n/pt-BR.ts +3 -0
  228. package/corpus/templates/dispatch/app/i18n/zh-CN.ts +3 -0
  229. package/corpus/templates/dispatch/app/i18n-data.ts +267 -0
  230. package/corpus/templates/dispatch/app/root.tsx +18 -4
  231. package/corpus/templates/dispatch/app/routes/settings.tsx +86 -0
  232. package/corpus/templates/dispatch/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  233. package/corpus/templates/dispatch/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  234. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +6 -0
  235. package/corpus/templates/forms/app/components/layout/Header.tsx +16 -9
  236. package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -4
  237. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +34 -17
  238. package/corpus/templates/forms/app/i18n/ar-SA.ts +58 -0
  239. package/corpus/templates/forms/app/i18n/de-DE.ts +59 -0
  240. package/corpus/templates/forms/app/i18n/en-US.ts +59 -0
  241. package/corpus/templates/forms/app/i18n/es-ES.ts +59 -0
  242. package/corpus/templates/forms/app/i18n/fr-FR.ts +59 -0
  243. package/corpus/templates/forms/app/i18n/hi-IN.ts +59 -0
  244. package/corpus/templates/forms/app/i18n/index.ts +31 -0
  245. package/corpus/templates/forms/app/i18n/ja-JP.ts +59 -0
  246. package/corpus/templates/forms/app/i18n/ko-KR.ts +59 -0
  247. package/corpus/templates/forms/app/i18n/pt-BR.ts +59 -0
  248. package/corpus/templates/forms/app/i18n/zh-CN.ts +56 -0
  249. package/corpus/templates/forms/app/root.tsx +65 -16
  250. package/corpus/templates/forms/app/routes/_app.settings.tsx +85 -0
  251. package/corpus/templates/forms/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  252. package/corpus/templates/forms/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  253. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +29 -17
  254. package/corpus/templates/macros/app/components/layout/Header.tsx +16 -10
  255. package/corpus/templates/macros/app/i18n/ar-SA.ts +54 -0
  256. package/corpus/templates/macros/app/i18n/de-DE.ts +55 -0
  257. package/corpus/templates/macros/app/i18n/en-US.ts +55 -0
  258. package/corpus/templates/macros/app/i18n/es-ES.ts +55 -0
  259. package/corpus/templates/macros/app/i18n/fr-FR.ts +55 -0
  260. package/corpus/templates/macros/app/i18n/hi-IN.ts +55 -0
  261. package/corpus/templates/macros/app/i18n/index.ts +31 -0
  262. package/corpus/templates/macros/app/i18n/ja-JP.ts +55 -0
  263. package/corpus/templates/macros/app/i18n/ko-KR.ts +55 -0
  264. package/corpus/templates/macros/app/i18n/pt-BR.ts +55 -0
  265. package/corpus/templates/macros/app/i18n/zh-CN.ts +53 -0
  266. package/corpus/templates/macros/app/root.tsx +65 -15
  267. package/corpus/templates/macros/app/routes/settings.tsx +85 -0
  268. package/corpus/templates/macros/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  269. package/corpus/templates/macros/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  270. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +6 -0
  271. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +9 -4
  272. package/corpus/templates/mail/app/i18n/ar-SA.ts +33 -0
  273. package/corpus/templates/mail/app/i18n/de-DE.ts +33 -0
  274. package/corpus/templates/mail/app/i18n/en-US.ts +32 -0
  275. package/corpus/templates/mail/app/i18n/es-ES.ts +33 -0
  276. package/corpus/templates/mail/app/i18n/fr-FR.ts +33 -0
  277. package/corpus/templates/mail/app/i18n/hi-IN.ts +32 -0
  278. package/corpus/templates/mail/app/i18n/index.ts +31 -0
  279. package/corpus/templates/mail/app/i18n/ja-JP.ts +32 -0
  280. package/corpus/templates/mail/app/i18n/ko-KR.ts +33 -0
  281. package/corpus/templates/mail/app/i18n/pt-BR.ts +34 -0
  282. package/corpus/templates/mail/app/i18n/zh-CN.ts +32 -0
  283. package/corpus/templates/mail/app/pages/SettingsPage.tsx +67 -13
  284. package/corpus/templates/mail/app/root.tsx +20 -0
  285. package/corpus/templates/mail/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  286. package/corpus/templates/mail/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  287. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  288. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +6 -0
  289. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +22 -4
  290. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +22 -4
  291. package/corpus/templates/plan/app/components/layout/Header.tsx +19 -12
  292. package/corpus/templates/plan/app/components/layout/Layout.tsx +11 -7
  293. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +41 -28
  294. package/corpus/templates/plan/app/i18n/ar-SA.ts +77 -0
  295. package/corpus/templates/plan/app/i18n/de-DE.ts +78 -0
  296. package/corpus/templates/plan/app/i18n/en-US.ts +78 -0
  297. package/corpus/templates/plan/app/i18n/es-ES.ts +78 -0
  298. package/corpus/templates/plan/app/i18n/fr-FR.ts +78 -0
  299. package/corpus/templates/plan/app/i18n/hi-IN.ts +78 -0
  300. package/corpus/templates/plan/app/i18n/index.ts +31 -0
  301. package/corpus/templates/plan/app/i18n/ja-JP.ts +79 -0
  302. package/corpus/templates/plan/app/i18n/ko-KR.ts +77 -0
  303. package/corpus/templates/plan/app/i18n/pt-BR.ts +78 -0
  304. package/corpus/templates/plan/app/i18n/zh-CN.ts +74 -0
  305. package/corpus/templates/plan/app/root.tsx +45 -8
  306. package/corpus/templates/plan/app/routes/settings.tsx +86 -0
  307. package/corpus/templates/plan/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  308. package/corpus/templates/plan/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  309. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +6 -0
  310. package/corpus/templates/slides/app/components/layout/Header.tsx +23 -11
  311. package/corpus/templates/slides/app/components/layout/Layout.tsx +7 -6
  312. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +23 -11
  313. package/corpus/templates/slides/app/i18n/ar-SA.ts +54 -0
  314. package/corpus/templates/slides/app/i18n/de-DE.ts +56 -0
  315. package/corpus/templates/slides/app/i18n/en-US.ts +55 -0
  316. package/corpus/templates/slides/app/i18n/es-ES.ts +55 -0
  317. package/corpus/templates/slides/app/i18n/fr-FR.ts +55 -0
  318. package/corpus/templates/slides/app/i18n/hi-IN.ts +55 -0
  319. package/corpus/templates/slides/app/i18n/index.ts +31 -0
  320. package/corpus/templates/slides/app/i18n/ja-JP.ts +55 -0
  321. package/corpus/templates/slides/app/i18n/ko-KR.ts +55 -0
  322. package/corpus/templates/slides/app/i18n/pt-BR.ts +55 -0
  323. package/corpus/templates/slides/app/i18n/zh-CN.ts +53 -0
  324. package/corpus/templates/slides/app/root.tsx +50 -8
  325. package/corpus/templates/slides/app/routes/settings.tsx +85 -0
  326. package/corpus/templates/slides/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  327. package/corpus/templates/slides/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  328. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +6 -0
  329. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +14 -9
  330. package/corpus/templates/videos/app/components/Sidebar.tsx +16 -9
  331. package/corpus/templates/videos/app/components/StudioHeader.tsx +12 -8
  332. package/corpus/templates/videos/app/components/layout/Header.tsx +21 -15
  333. package/corpus/templates/videos/app/components/layout/Layout.tsx +10 -7
  334. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +21 -6
  335. package/corpus/templates/videos/app/i18n/ar-SA.ts +73 -0
  336. package/corpus/templates/videos/app/i18n/de-DE.ts +75 -0
  337. package/corpus/templates/videos/app/i18n/en-US.ts +74 -0
  338. package/corpus/templates/videos/app/i18n/es-ES.ts +75 -0
  339. package/corpus/templates/videos/app/i18n/fr-FR.ts +75 -0
  340. package/corpus/templates/videos/app/i18n/hi-IN.ts +74 -0
  341. package/corpus/templates/videos/app/i18n/index.ts +31 -0
  342. package/corpus/templates/videos/app/i18n/ja-JP.ts +74 -0
  343. package/corpus/templates/videos/app/i18n/ko-KR.ts +74 -0
  344. package/corpus/templates/videos/app/i18n/pt-BR.ts +75 -0
  345. package/corpus/templates/videos/app/i18n/zh-CN.ts +72 -0
  346. package/corpus/templates/videos/app/pages/Index.tsx +11 -9
  347. package/corpus/templates/videos/app/root.tsx +45 -7
  348. package/corpus/templates/videos/app/routes/settings.tsx +85 -0
  349. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  350. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  351. package/dist/agent/durable-background.d.ts +32 -28
  352. package/dist/agent/durable-background.d.ts.map +1 -1
  353. package/dist/agent/durable-background.js +59 -28
  354. package/dist/agent/durable-background.js.map +1 -1
  355. package/dist/agent/production-agent.d.ts.map +1 -1
  356. package/dist/agent/production-agent.js +16 -12
  357. package/dist/agent/production-agent.js.map +1 -1
  358. package/dist/cli/skills.d.ts +1 -1
  359. package/dist/cli/skills.d.ts.map +1 -1
  360. package/dist/cli/skills.js +22 -4
  361. package/dist/cli/skills.js.map +1 -1
  362. package/dist/client/CommandMenu.d.ts +3 -0
  363. package/dist/client/CommandMenu.d.ts.map +1 -1
  364. package/dist/client/CommandMenu.js +9 -0
  365. package/dist/client/CommandMenu.js.map +1 -1
  366. package/dist/client/app-providers.d.ts +8 -1
  367. package/dist/client/app-providers.d.ts.map +1 -1
  368. package/dist/client/app-providers.js +7 -5
  369. package/dist/client/app-providers.js.map +1 -1
  370. package/dist/client/i18n.d.ts +54 -0
  371. package/dist/client/i18n.d.ts.map +1 -0
  372. package/dist/client/i18n.js +354 -0
  373. package/dist/client/i18n.js.map +1 -0
  374. package/dist/client/index.d.ts +2 -1
  375. package/dist/client/index.d.ts.map +1 -1
  376. package/dist/client/index.js +2 -1
  377. package/dist/client/index.js.map +1 -1
  378. package/dist/deploy/build.d.ts +32 -36
  379. package/dist/deploy/build.d.ts.map +1 -1
  380. package/dist/deploy/build.js +47 -104
  381. package/dist/deploy/build.js.map +1 -1
  382. package/dist/deploy/workspace-deploy.js +62 -30
  383. package/dist/deploy/workspace-deploy.js.map +1 -1
  384. package/dist/index.browser.d.ts +1 -1
  385. package/dist/index.browser.d.ts.map +1 -1
  386. package/dist/index.browser.js +1 -1
  387. package/dist/index.browser.js.map +1 -1
  388. package/dist/localization/actions/get-localization-preference.d.ts +4 -0
  389. package/dist/localization/actions/get-localization-preference.d.ts.map +1 -0
  390. package/dist/localization/actions/get-localization-preference.js +16 -0
  391. package/dist/localization/actions/get-localization-preference.js.map +1 -0
  392. package/dist/localization/actions/set-localization-preference.d.ts +6 -0
  393. package/dist/localization/actions/set-localization-preference.d.ts.map +1 -0
  394. package/dist/localization/actions/set-localization-preference.js +24 -0
  395. package/dist/localization/actions/set-localization-preference.js.map +1 -0
  396. package/dist/localization/index.d.ts +3 -0
  397. package/dist/localization/index.d.ts.map +1 -0
  398. package/dist/localization/index.js +3 -0
  399. package/dist/localization/index.js.map +1 -0
  400. package/dist/localization/server.d.ts +25 -0
  401. package/dist/localization/server.d.ts.map +1 -0
  402. package/dist/localization/server.js +69 -0
  403. package/dist/localization/server.js.map +1 -0
  404. package/dist/localization/shared.d.ts +25 -0
  405. package/dist/localization/shared.d.ts.map +1 -0
  406. package/dist/localization/shared.js +134 -0
  407. package/dist/localization/shared.js.map +1 -0
  408. package/dist/server/action-discovery.d.ts.map +1 -1
  409. package/dist/server/action-discovery.js +8 -0
  410. package/dist/server/action-discovery.js.map +1 -1
  411. package/dist/server/index.d.ts +1 -0
  412. package/dist/server/index.d.ts.map +1 -1
  413. package/dist/server/index.js +1 -0
  414. package/dist/server/index.js.map +1 -1
  415. package/dist/server/self-dispatch.d.ts +0 -10
  416. package/dist/server/self-dispatch.d.ts.map +1 -1
  417. package/dist/server/self-dispatch.js +27 -2
  418. package/dist/server/self-dispatch.js.map +1 -1
  419. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  420. package/dist/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  421. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  422. package/dist/templates/default/AGENTS.md +16 -15
  423. package/dist/templates/default/app/i18n/en-US.ts +29 -0
  424. package/dist/templates/default/app/i18n/index.ts +13 -0
  425. package/dist/templates/default/app/root.tsx +20 -1
  426. package/dist/templates/default/app/routes/_index.tsx +24 -9
  427. package/dist/templates/default/app/routes/settings.tsx +67 -0
  428. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  429. package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  430. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
  431. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  432. package/dist/vite/action-types-plugin.js +8 -0
  433. package/dist/vite/action-types-plugin.js.map +1 -1
  434. package/docs/AGENTS.md +1 -0
  435. package/docs/content/client.md +15 -0
  436. package/docs/content/internationalization.md +145 -0
  437. package/docs/content/locales/ar-SA/internationalization.md +102 -0
  438. package/docs/content/locales/de-DE/internationalization.md +102 -0
  439. package/docs/content/locales/es-ES/internationalization.md +102 -0
  440. package/docs/content/locales/fr-FR/internationalization.md +102 -0
  441. package/docs/content/locales/hi-IN/internationalization.md +102 -0
  442. package/docs/content/locales/ja-JP/internationalization.md +114 -0
  443. package/docs/content/locales/ko-KR/internationalization.md +102 -0
  444. package/docs/content/locales/pt-BR/internationalization.md +102 -0
  445. package/docs/content/locales/zh-CN/internationalization.md +102 -0
  446. package/docs/content/skills-guide.md +19 -18
  447. package/package.json +7 -1
  448. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  449. package/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  450. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  451. package/src/templates/default/AGENTS.md +16 -15
  452. package/src/templates/default/app/i18n/en-US.ts +29 -0
  453. package/src/templates/default/app/i18n/index.ts +13 -0
  454. package/src/templates/default/app/root.tsx +20 -1
  455. package/src/templates/default/app/routes/_index.tsx +24 -9
  456. package/src/templates/default/app/routes/settings.tsx +67 -0
  457. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  458. package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  459. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
@@ -16,8 +16,10 @@ import {
16
16
  CommandMenu,
17
17
  appPath,
18
18
  createAgentNativeQueryClient,
19
+ getLocaleInitScript,
19
20
  getThemeInitScript,
20
21
  useCommandMenuShortcut,
22
+ useT,
21
23
  } from "@agent-native/core/client";
22
24
  import { configureTracking } from "@agent-native/core/client";
23
25
  import { Layout as AppLayout } from "@/components/layout/Layout";
@@ -27,6 +29,7 @@ import { TAB_ID } from "@/lib/tab-id";
27
29
  import changelog from "../CHANGELOG.md?raw";
28
30
  import type { LinksFunction } from "react-router";
29
31
  import stylesheet from "./global.css?url";
32
+ import { i18nCatalog } from "./i18n";
30
33
 
31
34
  configureTracking({
32
35
  getDefaultProps: (_name, properties) => ({
@@ -52,6 +55,7 @@ function getHydrationStableThemeInitScript() {
52
55
  }
53
56
 
54
57
  const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
58
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
55
59
 
56
60
  export function Layout({ children }: { children: React.ReactNode }) {
57
61
  return (
@@ -67,6 +71,11 @@ export function Layout({ children }: { children: React.ReactNode }) {
67
71
  suppressHydrationWarning
68
72
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
69
73
  />
74
+ <script
75
+ data-agent-native-locale-init
76
+ suppressHydrationWarning
77
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
78
+ />
70
79
  <link rel="manifest" href={appPath("/manifest.json")} />
71
80
  <meta name="theme-color" content="#18181b" />
72
81
  <meta name="mobile-web-app-capable" content="yes" />
@@ -120,6 +129,7 @@ function DbSyncSetup() {
120
129
 
121
130
  function ThemeToggleItem() {
122
131
  const { resolvedTheme, setTheme } = useTheme();
132
+ const t = useT();
123
133
  const isDark = resolvedTheme === "dark";
124
134
  return (
125
135
  <CommandMenu.Item
@@ -127,7 +137,7 @@ function ThemeToggleItem() {
127
137
  keywords={["theme", "dark", "light", "mode"]}
128
138
  >
129
139
  {isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
130
- Toggle {isDark ? "light" : "dark"} mode
140
+ {t("root.toggleTheme")}
131
141
  </CommandMenu.Item>
132
142
  );
133
143
  }
@@ -135,6 +145,7 @@ function ThemeToggleItem() {
135
145
  function AppContent() {
136
146
  const [cmdkOpen, setCmdkOpen] = useState(false);
137
147
  const navigate = useNavigate();
148
+ const t = useT();
138
149
  useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
139
150
  return (
140
151
  <>
@@ -144,33 +155,33 @@ function AppContent() {
144
155
  changelog={changelog}
145
156
  changelogKey="brain"
146
157
  >
147
- <CommandMenu.Group heading="Navigate">
158
+ <CommandMenu.Group heading={t("root.commandNavigate")}>
148
159
  <CommandMenu.Item onSelect={() => navigate("/")}>
149
- Ask Brain
160
+ {t("navigation.askBrain")}
150
161
  </CommandMenu.Item>
151
162
  <CommandMenu.Item onSelect={() => navigate("/search")}>
152
- Search
163
+ {t("navigation.search")}
153
164
  </CommandMenu.Item>
154
165
  <CommandMenu.Item onSelect={() => navigate("/knowledge")}>
155
- Knowledge
166
+ {t("navigation.knowledge")}
156
167
  </CommandMenu.Item>
157
168
  <CommandMenu.Item onSelect={() => navigate("/review")}>
158
- Review queue
169
+ {t("navigation.reviewQueue")}
159
170
  </CommandMenu.Item>
160
171
  <CommandMenu.Item onSelect={() => navigate("/sources")}>
161
- Sources
172
+ {t("navigation.sources")}
162
173
  </CommandMenu.Item>
163
174
  <CommandMenu.Item onSelect={() => navigate("/ops")}>
164
- Ops
175
+ {t("navigation.ops")}
165
176
  </CommandMenu.Item>
166
177
  <CommandMenu.Item onSelect={() => navigate("/extensions")}>
167
- Extensions
178
+ {t("navigation.extensions")}
168
179
  </CommandMenu.Item>
169
180
  <CommandMenu.Item onSelect={() => navigate("/settings")}>
170
- Settings
181
+ {t("navigation.settings")}
171
182
  </CommandMenu.Item>
172
183
  </CommandMenu.Group>
173
- <CommandMenu.Group heading="Appearance">
184
+ <CommandMenu.Group heading={t("root.commandAppearance")}>
174
185
  <ThemeToggleItem />
175
186
  </CommandMenu.Group>
176
187
  </CommandMenu>
@@ -201,7 +212,11 @@ export default function Root() {
201
212
  );
202
213
 
203
214
  return (
204
- <AppProviders queryClient={queryClient} tooltipDelayDuration={250}>
215
+ <AppProviders
216
+ queryClient={queryClient}
217
+ tooltipDelayDuration={250}
218
+ i18n={{ catalog: i18nCatalog }}
219
+ >
205
220
  <DbSyncSetup />
206
221
  <AppContent />
207
222
  </AppProviders>
@@ -1,8 +1,11 @@
1
1
  import { useEffect, useMemo, useState } from "react";
2
2
  import {
3
3
  ChangelogSettingsCard,
4
+ LanguagePicker,
5
+ openAgentSettings,
4
6
  useActionMutation,
5
7
  useActionQuery,
8
+ useT,
6
9
  } from "@agent-native/core/client";
7
10
  import changelog from "../../CHANGELOG.md?raw";
8
11
  import {
@@ -89,6 +92,7 @@ type ToneValue = (typeof toneOptions)[number]["value"];
89
92
  type SourcePolicyValue = (typeof sourcePolicyOptions)[number]["value"];
90
93
 
91
94
  export default function SettingsRoute() {
95
+ const t = useT();
92
96
  const settingsQuery = useActionQuery<SettingsResponse>(
93
97
  "get-brain-settings" as any,
94
98
  {} as any,
@@ -129,9 +133,9 @@ export default function SettingsRoute() {
129
133
  return (
130
134
  <div className="min-h-full bg-background">
131
135
  <PageHeader
132
- eyebrow="Customize"
133
- title="Customize Brain"
134
- description="Name the assistant, shape its voice, and set the policies it follows when turning company sources into knowledge."
136
+ eyebrow={t("settings.eyebrow")}
137
+ title={t("settings.title")}
138
+ description={t("settings.description")}
135
139
  actions={
136
140
  <Button
137
141
  size="sm"
@@ -141,10 +145,10 @@ export default function SettingsRoute() {
141
145
  >
142
146
  <IconDeviceFloppy className="size-4" />
143
147
  {saveSettings.isPending
144
- ? "Saving"
148
+ ? t("common.saving")
145
149
  : isDirty
146
- ? "Save changes"
147
- : "Saved"}
150
+ ? t("common.saveChanges")
151
+ : t("common.saved")}
148
152
  </Button>
149
153
  }
150
154
  />
@@ -391,14 +395,47 @@ export default function SettingsRoute() {
391
395
  </main>
392
396
 
393
397
  <aside className="grid content-start gap-5">
398
+ <Card>
399
+ <CardHeader>
400
+ <CardTitle className="flex items-center gap-2 text-base">
401
+ <IconAdjustments className="size-4 text-primary" />
402
+ {t("settings.languageTitle")}
403
+ </CardTitle>
404
+ <CardDescription>
405
+ {t("settings.languageDescription")}
406
+ </CardDescription>
407
+ </CardHeader>
408
+ <CardContent className="space-y-1.5">
409
+ <Label>{t("settings.languageLabel")}</Label>
410
+ <LanguagePicker label={t("settings.languageLabel")} />
411
+ </CardContent>
412
+ </Card>
413
+
414
+ <Card>
415
+ <CardHeader>
416
+ <CardTitle className="flex items-center gap-2 text-base">
417
+ <IconAdjustments className="size-4 text-primary" />
418
+ {t("settings.agentTitle")}
419
+ </CardTitle>
420
+ <CardDescription>
421
+ {t("settings.agentDescription")}
422
+ </CardDescription>
423
+ </CardHeader>
424
+ <CardContent>
425
+ <Button variant="outline" onClick={() => openAgentSettings()}>
426
+ {t("settings.openAgentSettings")}
427
+ </Button>
428
+ </CardContent>
429
+ </Card>
430
+
394
431
  <Card>
395
432
  <CardHeader>
396
433
  <CardTitle className="flex items-center gap-2 text-base">
397
434
  <IconFileText className="size-4 text-primary" />
398
- Current Policy
435
+ {t("settings.currentPolicy")}
399
436
  </CardTitle>
400
437
  <CardDescription>
401
- The effective settings saved for this Brain workspace.
438
+ {t("settings.currentPolicyDescription")}
402
439
  </CardDescription>
403
440
  </CardHeader>
404
441
  <CardContent className="grid gap-3 text-sm">
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-06-24
4
+ ---
5
+
6
+ Added a language picker and localized app chrome for supported languages.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-24
4
+ ---
5
+
6
+ Settings now link directly to Agent settings for model, API key, automation, and voice preferences.
@@ -66,6 +66,11 @@ el.dataset.selectedId = selectedItem?.id || "";
66
66
 
67
67
  **Use configuration-driven rendering** — Extract visual decisions (colors, layouts, sizes) into JSON config files in `data/`. The agent can modify the config (Tier 1) instead of the component source (Tier 2).
68
68
 
69
+ **Keep localized copy in catalogs** — When editing visible UI copy, labels,
70
+ toasts, empty states, prompts, or formatting, read `internationalization` and
71
+ update `app/i18n/en-US.ts` plus existing locale catalogs instead of leaving new
72
+ inline strings in components.
73
+
69
74
  ## Don't
70
75
 
71
76
  - Don't modify `.env` files or files containing secrets
@@ -80,3 +85,4 @@ el.dataset.selectedId = selectedItem?.id || "";
80
85
  - **actions** — The agent can create or modify actions to add new capabilities
81
86
  - **delegate-to-agent** — Self-modification requests come through the agent chat
82
87
  - **real-time-sync** — Database writes trigger change events to update the UI
88
+ - **internationalization** — UI copy, language catalogs, locale switching, and RTL-safe edits
@@ -12,6 +12,7 @@ import { Button } from "@/components/ui/button";
12
12
  import {
13
13
  AgentSidebar,
14
14
  AgentToggleButton,
15
+ LanguagePicker,
15
16
  NotificationsBell,
16
17
  useAppearanceSync,
17
18
  } from "@agent-native/core/client";
@@ -287,6 +288,7 @@ export function AppLayout({ children }: AppLayoutProps) {
287
288
  </div>
288
289
  <div className="flex shrink-0 items-center gap-2">
289
290
  {headerControls?.right}
291
+ <LanguagePicker variant="icon" />
290
292
  {!isMobile && (
291
293
  <NotificationsBell emptyDescription="Calendar can pop browser alerts while this app is open. Clips desktop handles fuller meeting prompts with one-click notes." />
292
294
  )}
@@ -52,6 +52,7 @@ import {
52
52
  appPath,
53
53
  DevDatabaseLink,
54
54
  FeedbackButton,
55
+ useT,
55
56
  } from "@agent-native/core/client";
56
57
  import { EVENT_CATEGORY_COLORS } from "@/lib/event-colors";
57
58
  import {
@@ -85,10 +86,14 @@ import { OrgSwitcher } from "@agent-native/core/client/org";
85
86
  import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
86
87
 
87
88
  const navItems = [
88
- { path: "/", label: "Calendar", icon: IconCalendar },
89
- { path: "/booking-links", label: "Booking Links", icon: IconLink },
90
- { path: "/team", label: "Team", icon: IconUsers },
91
- { path: "/settings", label: "Settings", icon: IconSettings },
89
+ { path: "/", labelKey: "navigation.calendar", icon: IconCalendar },
90
+ {
91
+ path: "/booking-links",
92
+ labelKey: "navigation.bookingLinks",
93
+ icon: IconLink,
94
+ },
95
+ { path: "/team", labelKey: "navigation.team", icon: IconUsers },
96
+ { path: "/settings", labelKey: "navigation.settings", icon: IconSettings },
92
97
  ];
93
98
 
94
99
  interface SidebarProps {
@@ -304,6 +309,7 @@ function MiniCalendar({
304
309
  }
305
310
 
306
311
  function GoogleConnectSidebarButton() {
312
+ const t = useT();
307
313
  const [wantAuthUrl, setWantAuthUrl] = useState(false);
308
314
  const authUrl = useGoogleAuthUrl(wantAuthUrl);
309
315
  const {
@@ -332,10 +338,10 @@ function GoogleConnectSidebarButton() {
332
338
  <div className="border-t border-border p-3">
333
339
  <div className="rounded-lg bg-primary/10 p-3">
334
340
  <p className="mb-1 text-xs font-semibold text-foreground">
335
- Connect Google Calendar
341
+ {t("settings.connectGoogleCalendar")}
336
342
  </p>
337
343
  <p className="mb-2.5 text-[11px] leading-relaxed text-muted-foreground">
338
- Sync your events and manage everything in one place.
344
+ {t("settings.connectGoogleDescription")}
339
345
  </p>
340
346
  <Button
341
347
  size="sm"
@@ -348,7 +354,7 @@ function GoogleConnectSidebarButton() {
348
354
  }
349
355
  >
350
356
  <IconExternalLink className="h-3 w-3" />
351
- {authUrl.isLoading ? "Connecting..." : "Connect"}
357
+ {authUrl.isLoading ? t("common.connecting") : t("common.connect")}
352
358
  </Button>
353
359
  </div>
354
360
  </div>
@@ -590,6 +596,7 @@ function GoogleAccountsSection({
590
596
  export function Sidebar({ open, onClose }: SidebarProps) {
591
597
  const location = useLocation();
592
598
  const navigate = useNavigate();
599
+ const t = useT();
593
600
  const {
594
601
  selectedDate,
595
602
  setSelectedDate,
@@ -669,7 +676,7 @@ export function Sidebar({ open, onClose }: SidebarProps) {
669
676
  className="hidden h-4 w-auto shrink-0 dark:block"
670
677
  />
671
678
  <span className="text-base font-semibold tracking-tight">
672
- Calendar
679
+ {t("navigation.brand")}
673
680
  </span>
674
681
  </Link>
675
682
  </div>
@@ -702,7 +709,7 @@ export function Sidebar({ open, onClose }: SidebarProps) {
702
709
  )}
703
710
  >
704
711
  <item.icon className="h-4 w-4" />
705
- {item.label}
712
+ {t(item.labelKey)}
706
713
  </Link>
707
714
  );
708
715
  })}
@@ -0,0 +1,57 @@
1
+ const messages = {
2
+ common: {
3
+ connect: "اتصال",
4
+ connected: "متصل",
5
+ connecting: "جار الاتصال",
6
+ disconnect: "قطع الاتصال",
7
+ notConnected: "غير متصل",
8
+ saving: "جار الحفظ...",
9
+ },
10
+ navigation: {
11
+ bookingLinks: "روابط الحجز",
12
+ brand: "التقويم",
13
+ calendar: "التقويم",
14
+ settings: "الإعدادات",
15
+ team: "الفريق",
16
+ },
17
+ root: {
18
+ commandActions: "الإجراءات",
19
+ commandAppearance: "المظهر",
20
+ commandSearch: "بحث",
21
+ toggleTheme: "تبديل السمة",
22
+ },
23
+ settings: {
24
+ openAgentSettings: "فتح إعدادات الوكيل",
25
+ agentDescription:
26
+ "افتح إعدادات الوكيل في الشريط الجانبي لإدارة النموذج ومفاتيح API والأتمتة والصوت وعناصر التحكم الأخرى.",
27
+ agentTitle: "إعدادات الوكيل",
28
+ appearance: "المظهر",
29
+ appearanceDescription: "Customize how the app looks.",
30
+ connectGoogleCalendar: "Connect Google Calendar",
31
+ connectGoogleDescription:
32
+ "Connect Google Calendar to sync events and availability.",
33
+ description: "إدارة التفضيلات والخدمات المتصلة.",
34
+ disconnectFailed: "Disconnect failed",
35
+ general: "عام",
36
+ generalDescription: "General workspace preferences.",
37
+ googleCalendar: "Google Calendar",
38
+ googleDescription:
39
+ "Connect Google Calendar to sync events and availability.",
40
+ googleDisconnected: "Google Calendar disconnected",
41
+ googleFailed: "Google Calendar failed",
42
+ languageDescription: "اختر لغة الواجهة لمساحة العمل هذه.",
43
+ languageLabel: "لغة الواجهة",
44
+ languageTitle: "اللغة",
45
+ saveFailed: "Failed to save settings",
46
+ saveSettings: "Save settings",
47
+ saved: "Settings saved",
48
+ timezone: "Timezone",
49
+ title: "الإعدادات",
50
+ zoomConnectFailed: "Failed to connect Zoom",
51
+ zoomDisconnectFailed: "Failed to disconnect Zoom",
52
+ zoomDisconnected: "Zoom disconnected",
53
+ zoomOpened: "Zoom connection opened",
54
+ },
55
+ };
56
+
57
+ export default messages;
@@ -0,0 +1,58 @@
1
+ const messages = {
2
+ common: {
3
+ connect: "Verbinden",
4
+ connected: "Verbunden",
5
+ connecting: "Verbindung wird hergestellt",
6
+ disconnect: "Trennen",
7
+ notConnected: "Nicht verbunden",
8
+ saving: "Speichern...",
9
+ },
10
+ navigation: {
11
+ bookingLinks: "Buchungslinks",
12
+ brand: "Kalender",
13
+ calendar: "Kalender",
14
+ settings: "Einstellungen",
15
+ team: "Team",
16
+ },
17
+ root: {
18
+ commandActions: "Aktionen",
19
+ commandAppearance: "Darstellung",
20
+ commandSearch: "Suchen",
21
+ toggleTheme: "Design wechseln",
22
+ },
23
+ settings: {
24
+ openAgentSettings: "Agent-Einstellungen öffnen",
25
+ agentDescription:
26
+ "Öffne die Agent-Einstellungen in der Seitenleiste für Modell, API-Schlüssel, Automatisierungen, Sprache und weitere Steuerungen.",
27
+ agentTitle: "Agent-Einstellungen",
28
+ appearance: "Darstellung",
29
+ appearanceDescription: "Customize how the app looks.",
30
+ connectGoogleCalendar: "Connect Google Calendar",
31
+ connectGoogleDescription:
32
+ "Connect Google Calendar to sync events and availability.",
33
+ description: "Verwalte Einstellungen und verbundene Dienste.",
34
+ disconnectFailed: "Disconnect failed",
35
+ general: "Allgemein",
36
+ generalDescription: "General workspace preferences.",
37
+ googleCalendar: "Google Calendar",
38
+ googleDescription:
39
+ "Connect Google Calendar to sync events and availability.",
40
+ googleDisconnected: "Google Calendar disconnected",
41
+ googleFailed: "Google Calendar failed",
42
+ languageDescription:
43
+ "Wähle die Oberflächensprache für diesen Arbeitsbereich.",
44
+ languageLabel: "Oberflächensprache",
45
+ languageTitle: "Sprache",
46
+ saveFailed: "Failed to save settings",
47
+ saveSettings: "Save settings",
48
+ saved: "Settings saved",
49
+ timezone: "Timezone",
50
+ title: "Einstellungen",
51
+ zoomConnectFailed: "Failed to connect Zoom",
52
+ zoomDisconnectFailed: "Failed to disconnect Zoom",
53
+ zoomDisconnected: "Zoom disconnected",
54
+ zoomOpened: "Zoom connection opened",
55
+ },
56
+ };
57
+
58
+ export default messages;
@@ -0,0 +1,57 @@
1
+ const messages = {
2
+ common: {
3
+ connect: "Connect",
4
+ connected: "Connected",
5
+ connecting: "Connecting",
6
+ disconnect: "Disconnect",
7
+ notConnected: "Not connected",
8
+ saving: "Saving...",
9
+ },
10
+ navigation: {
11
+ bookingLinks: "Booking links",
12
+ brand: "Calendar",
13
+ calendar: "Calendar",
14
+ settings: "Settings",
15
+ team: "Team",
16
+ },
17
+ root: {
18
+ commandActions: "Actions",
19
+ commandAppearance: "Appearance",
20
+ commandSearch: "Search",
21
+ toggleTheme: "Toggle theme",
22
+ },
23
+ settings: {
24
+ openAgentSettings: "Open agent settings",
25
+ agentDescription:
26
+ "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
27
+ agentTitle: "Agent settings",
28
+ appearance: "Appearance",
29
+ appearanceDescription: "Customize how the app looks.",
30
+ connectGoogleCalendar: "Connect Google Calendar",
31
+ connectGoogleDescription:
32
+ "Connect Google Calendar to sync events and availability.",
33
+ description: "Manage preferences and connected services.",
34
+ disconnectFailed: "Disconnect failed",
35
+ general: "General",
36
+ generalDescription: "General workspace preferences.",
37
+ googleCalendar: "Google Calendar",
38
+ googleDescription:
39
+ "Connect Google Calendar to sync events and availability.",
40
+ googleDisconnected: "Google Calendar disconnected",
41
+ googleFailed: "Google Calendar failed",
42
+ languageDescription: "Choose the interface language for this workspace.",
43
+ languageLabel: "Interface language",
44
+ languageTitle: "Language",
45
+ saveFailed: "Failed to save settings",
46
+ saveSettings: "Save settings",
47
+ saved: "Settings saved",
48
+ timezone: "Timezone",
49
+ title: "Settings",
50
+ zoomConnectFailed: "Failed to connect Zoom",
51
+ zoomDisconnectFailed: "Failed to disconnect Zoom",
52
+ zoomDisconnected: "Zoom disconnected",
53
+ zoomOpened: "Zoom connection opened",
54
+ },
55
+ };
56
+
57
+ export default messages;
@@ -0,0 +1,58 @@
1
+ const messages = {
2
+ common: {
3
+ connect: "Conectar",
4
+ connected: "Conectado",
5
+ connecting: "Conectando",
6
+ disconnect: "Desconectar",
7
+ notConnected: "No conectado",
8
+ saving: "Guardando...",
9
+ },
10
+ navigation: {
11
+ bookingLinks: "Enlaces de reserva",
12
+ brand: "Calendario",
13
+ calendar: "Calendario",
14
+ settings: "Ajustes",
15
+ team: "Equipo",
16
+ },
17
+ root: {
18
+ commandActions: "Acciones",
19
+ commandAppearance: "Apariencia",
20
+ commandSearch: "Buscar",
21
+ toggleTheme: "Cambiar tema",
22
+ },
23
+ settings: {
24
+ openAgentSettings: "Abrir ajustes del agente",
25
+ agentDescription:
26
+ "Abre los ajustes del agente en la barra lateral para modelos, claves API, automatizaciones, voz y otros controles.",
27
+ agentTitle: "Ajustes del agente",
28
+ appearance: "Apariencia",
29
+ appearanceDescription: "Customize how the app looks.",
30
+ connectGoogleCalendar: "Connect Google Calendar",
31
+ connectGoogleDescription:
32
+ "Connect Google Calendar to sync events and availability.",
33
+ description: "Gestiona preferencias y servicios conectados.",
34
+ disconnectFailed: "Disconnect failed",
35
+ general: "General",
36
+ generalDescription: "General workspace preferences.",
37
+ googleCalendar: "Google Calendar",
38
+ googleDescription:
39
+ "Connect Google Calendar to sync events and availability.",
40
+ googleDisconnected: "Google Calendar disconnected",
41
+ googleFailed: "Google Calendar failed",
42
+ languageDescription:
43
+ "Elige el idioma de la interfaz para este espacio de trabajo.",
44
+ languageLabel: "Idioma de la interfaz",
45
+ languageTitle: "Idioma",
46
+ saveFailed: "Failed to save settings",
47
+ saveSettings: "Save settings",
48
+ saved: "Settings saved",
49
+ timezone: "Timezone",
50
+ title: "Ajustes",
51
+ zoomConnectFailed: "Failed to connect Zoom",
52
+ zoomDisconnectFailed: "Failed to disconnect Zoom",
53
+ zoomDisconnected: "Zoom disconnected",
54
+ zoomOpened: "Zoom connection opened",
55
+ },
56
+ };
57
+
58
+ export default messages;
@@ -0,0 +1,58 @@
1
+ const messages = {
2
+ common: {
3
+ connect: "Connecter",
4
+ connected: "Connecté",
5
+ connecting: "Connexion",
6
+ disconnect: "Déconnecter",
7
+ notConnected: "Non connecté",
8
+ saving: "Enregistrement...",
9
+ },
10
+ navigation: {
11
+ bookingLinks: "Liens de réservation",
12
+ brand: "Calendrier",
13
+ calendar: "Calendrier",
14
+ settings: "Paramètres",
15
+ team: "Équipe",
16
+ },
17
+ root: {
18
+ commandActions: "Actions",
19
+ commandAppearance: "Apparence",
20
+ commandSearch: "Rechercher",
21
+ toggleTheme: "Changer de thème",
22
+ },
23
+ settings: {
24
+ openAgentSettings: "Ouvrir les paramètres de l’agent",
25
+ agentDescription:
26
+ "Ouvrez les paramètres de l’agent dans la barre latérale pour les modèles, clés API, automatisations, voix et autres contrôles.",
27
+ agentTitle: "Paramètres de l’agent",
28
+ appearance: "Apparence",
29
+ appearanceDescription: "Customize how the app looks.",
30
+ connectGoogleCalendar: "Connect Google Calendar",
31
+ connectGoogleDescription:
32
+ "Connect Google Calendar to sync events and availability.",
33
+ description: "Gérez les préférences et les services connectés.",
34
+ disconnectFailed: "Disconnect failed",
35
+ general: "Général",
36
+ generalDescription: "General workspace preferences.",
37
+ googleCalendar: "Google Calendar",
38
+ googleDescription:
39
+ "Connect Google Calendar to sync events and availability.",
40
+ googleDisconnected: "Google Calendar disconnected",
41
+ googleFailed: "Google Calendar failed",
42
+ languageDescription:
43
+ "Choisissez la langue de l’interface pour cet espace de travail.",
44
+ languageLabel: "Langue de l’interface",
45
+ languageTitle: "Langue",
46
+ saveFailed: "Failed to save settings",
47
+ saveSettings: "Save settings",
48
+ saved: "Settings saved",
49
+ timezone: "Timezone",
50
+ title: "Paramètres",
51
+ zoomConnectFailed: "Failed to connect Zoom",
52
+ zoomDisconnectFailed: "Failed to disconnect Zoom",
53
+ zoomDisconnected: "Zoom disconnected",
54
+ zoomOpened: "Zoom connection opened",
55
+ },
56
+ };
57
+
58
+ export default messages;