@agent-native/core 0.75.5 → 0.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +48 -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 +38 -2
  18. package/corpus/core/src/agent/production-agent.ts +54 -0
  19. package/corpus/core/src/agent/run-manager.ts +27 -0
  20. package/corpus/core/src/agent/run-store.ts +185 -4
  21. package/corpus/core/src/client/CommandMenu.tsx +16 -0
  22. package/corpus/core/src/client/app-providers.tsx +26 -1
  23. package/corpus/core/src/client/i18n.tsx +605 -0
  24. package/corpus/core/src/client/index.ts +28 -0
  25. package/corpus/core/src/index.browser.ts +25 -0
  26. package/corpus/core/src/localization/actions/get-localization-preference.ts +23 -0
  27. package/corpus/core/src/localization/actions/set-localization-preference.ts +30 -0
  28. package/corpus/core/src/localization/index.ts +2 -0
  29. package/corpus/core/src/localization/server.ts +131 -0
  30. package/corpus/core/src/localization/shared.ts +163 -0
  31. package/corpus/core/src/server/action-discovery.ts +8 -0
  32. package/corpus/core/src/server/agent-chat-plugin.ts +71 -0
  33. package/corpus/core/src/server/auth.ts +13 -0
  34. package/corpus/core/src/server/index.ts +8 -0
  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/CommandPalette.tsx +12 -12
  50. package/corpus/templates/analytics/app/components/layout/Header.tsx +18 -15
  51. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  52. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +9 -3
  53. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +28 -26
  54. package/corpus/templates/analytics/app/i18n/ar-SA.ts +3 -0
  55. package/corpus/templates/analytics/app/i18n/de-DE.ts +3 -0
  56. package/corpus/templates/analytics/app/i18n/en-US.ts +3 -0
  57. package/corpus/templates/analytics/app/i18n/es-ES.ts +3 -0
  58. package/corpus/templates/analytics/app/i18n/fr-FR.ts +3 -0
  59. package/corpus/templates/analytics/app/i18n/hi-IN.ts +3 -0
  60. package/corpus/templates/analytics/app/i18n/index.ts +31 -0
  61. package/corpus/templates/analytics/app/i18n/ja-JP.ts +3 -0
  62. package/corpus/templates/analytics/app/i18n/ko-KR.ts +3 -0
  63. package/corpus/templates/analytics/app/i18n/pt-BR.ts +3 -0
  64. package/corpus/templates/analytics/app/i18n/zh-CN.ts +3 -0
  65. package/corpus/templates/analytics/app/i18n-data.ts +433 -0
  66. package/corpus/templates/analytics/app/pages/Settings.tsx +50 -16
  67. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +2 -2
  68. package/corpus/templates/analytics/app/root.tsx +14 -1
  69. package/corpus/templates/analytics/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  70. package/corpus/templates/analytics/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  71. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +6 -0
  72. package/corpus/templates/assets/app/components/layout/Header.tsx +17 -8
  73. package/corpus/templates/assets/app/components/layout/Layout.tsx +10 -6
  74. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +40 -23
  75. package/corpus/templates/assets/app/i18n/ar-SA.ts +3 -0
  76. package/corpus/templates/assets/app/i18n/de-DE.ts +3 -0
  77. package/corpus/templates/assets/app/i18n/en-US.ts +3 -0
  78. package/corpus/templates/assets/app/i18n/es-ES.ts +3 -0
  79. package/corpus/templates/assets/app/i18n/fr-FR.ts +3 -0
  80. package/corpus/templates/assets/app/i18n/hi-IN.ts +3 -0
  81. package/corpus/templates/assets/app/i18n/index.ts +31 -0
  82. package/corpus/templates/assets/app/i18n/ja-JP.ts +3 -0
  83. package/corpus/templates/assets/app/i18n/ko-KR.ts +3 -0
  84. package/corpus/templates/assets/app/i18n/pt-BR.ts +3 -0
  85. package/corpus/templates/assets/app/i18n/zh-CN.ts +3 -0
  86. package/corpus/templates/assets/app/i18n-data.ts +668 -0
  87. package/corpus/templates/assets/app/root.tsx +40 -15
  88. package/corpus/templates/assets/app/routes/_index.tsx +9 -10
  89. package/corpus/templates/assets/app/routes/settings.tsx +37 -6
  90. package/corpus/templates/assets/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  91. package/corpus/templates/assets/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  92. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  93. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +6 -0
  94. package/corpus/templates/brain/app/components/layout/Layout.tsx +12 -8
  95. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +23 -12
  96. package/corpus/templates/brain/app/i18n/ar-SA.ts +3 -0
  97. package/corpus/templates/brain/app/i18n/de-DE.ts +3 -0
  98. package/corpus/templates/brain/app/i18n/en-US.ts +3 -0
  99. package/corpus/templates/brain/app/i18n/es-ES.ts +3 -0
  100. package/corpus/templates/brain/app/i18n/fr-FR.ts +3 -0
  101. package/corpus/templates/brain/app/i18n/hi-IN.ts +3 -0
  102. package/corpus/templates/brain/app/i18n/index.ts +31 -0
  103. package/corpus/templates/brain/app/i18n/ja-JP.ts +3 -0
  104. package/corpus/templates/brain/app/i18n/ko-KR.ts +3 -0
  105. package/corpus/templates/brain/app/i18n/pt-BR.ts +3 -0
  106. package/corpus/templates/brain/app/i18n/zh-CN.ts +3 -0
  107. package/corpus/templates/brain/app/i18n-data.ts +624 -0
  108. package/corpus/templates/brain/app/root.tsx +27 -12
  109. package/corpus/templates/brain/app/routes/knowledge.tsx +6 -6
  110. package/corpus/templates/brain/app/routes/ops.tsx +4 -4
  111. package/corpus/templates/brain/app/routes/search.tsx +4 -4
  112. package/corpus/templates/brain/app/routes/settings.tsx +48 -11
  113. package/corpus/templates/brain/app/routes/sources.tsx +3 -3
  114. package/corpus/templates/brain/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  115. package/corpus/templates/brain/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  116. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +6 -0
  117. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +2 -0
  118. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +16 -9
  119. package/corpus/templates/calendar/app/i18n/ar-SA.ts +57 -0
  120. package/corpus/templates/calendar/app/i18n/de-DE.ts +58 -0
  121. package/corpus/templates/calendar/app/i18n/en-US.ts +57 -0
  122. package/corpus/templates/calendar/app/i18n/es-ES.ts +58 -0
  123. package/corpus/templates/calendar/app/i18n/fr-FR.ts +58 -0
  124. package/corpus/templates/calendar/app/i18n/hi-IN.ts +57 -0
  125. package/corpus/templates/calendar/app/i18n/index.ts +31 -0
  126. package/corpus/templates/calendar/app/i18n/ja-JP.ts +58 -0
  127. package/corpus/templates/calendar/app/i18n/ko-KR.ts +57 -0
  128. package/corpus/templates/calendar/app/i18n/pt-BR.ts +57 -0
  129. package/corpus/templates/calendar/app/i18n/zh-CN.ts +57 -0
  130. package/corpus/templates/calendar/app/i18n-data.ts +516 -0
  131. package/corpus/templates/calendar/app/pages/CalendarView.tsx +2 -0
  132. package/corpus/templates/calendar/app/pages/Settings.tsx +63 -28
  133. package/corpus/templates/calendar/app/root.tsx +78 -7
  134. package/corpus/templates/calendar/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  135. package/corpus/templates/calendar/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  136. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  137. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +6 -0
  138. package/corpus/templates/chat/app/components/layout/Header.tsx +17 -11
  139. package/corpus/templates/chat/app/components/layout/Layout.tsx +12 -8
  140. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +47 -18
  141. package/corpus/templates/chat/app/i18n/ar-SA.ts +62 -0
  142. package/corpus/templates/chat/app/i18n/de-DE.ts +63 -0
  143. package/corpus/templates/chat/app/i18n/en-US.ts +63 -0
  144. package/corpus/templates/chat/app/i18n/es-ES.ts +63 -0
  145. package/corpus/templates/chat/app/i18n/fr-FR.ts +63 -0
  146. package/corpus/templates/chat/app/i18n/hi-IN.ts +63 -0
  147. package/corpus/templates/chat/app/i18n/index.ts +31 -0
  148. package/corpus/templates/chat/app/i18n/ja-JP.ts +63 -0
  149. package/corpus/templates/chat/app/i18n/ko-KR.ts +63 -0
  150. package/corpus/templates/chat/app/i18n/pt-BR.ts +63 -0
  151. package/corpus/templates/chat/app/i18n/zh-CN.ts +61 -0
  152. package/corpus/templates/chat/app/i18n-data.ts +475 -0
  153. package/corpus/templates/chat/app/root.tsx +18 -5
  154. package/corpus/templates/chat/app/routes/_index.tsx +9 -8
  155. package/corpus/templates/chat/app/routes/settings.tsx +86 -0
  156. package/corpus/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  157. package/corpus/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  158. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +6 -0
  159. package/corpus/templates/clips/app/components/layout/Header.tsx +23 -17
  160. package/corpus/templates/clips/app/components/library/empty-state.tsx +10 -34
  161. package/corpus/templates/clips/app/components/library/library-layout.tsx +45 -34
  162. package/corpus/templates/clips/app/i18n/ar-SA.ts +182 -0
  163. package/corpus/templates/clips/app/i18n/de-DE.ts +184 -0
  164. package/corpus/templates/clips/app/i18n/en-US.ts +179 -0
  165. package/corpus/templates/clips/app/i18n/es-ES.ts +183 -0
  166. package/corpus/templates/clips/app/i18n/fr-FR.ts +184 -0
  167. package/corpus/templates/clips/app/i18n/hi-IN.ts +180 -0
  168. package/corpus/templates/clips/app/i18n/index.ts +41 -0
  169. package/corpus/templates/clips/app/i18n/ja-JP.ts +180 -0
  170. package/corpus/templates/clips/app/i18n/ko-KR.ts +178 -0
  171. package/corpus/templates/clips/app/i18n/pt-BR.ts +183 -0
  172. package/corpus/templates/clips/app/i18n/zh-CN.ts +173 -0
  173. package/corpus/templates/clips/app/root.tsx +104 -10
  174. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +154 -95
  175. package/corpus/templates/clips/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-06-24-clips-now-includes-a-language-picker-and-simplified-chinese-ui.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  178. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +6 -0
  179. package/corpus/templates/content/app/components/EmptyState.tsx +7 -5
  180. package/corpus/templates/content/app/components/ThemeToggle.tsx +4 -2
  181. package/corpus/templates/content/app/components/layout/Header.tsx +2 -0
  182. package/corpus/templates/content/app/components/layout/Layout.tsx +8 -7
  183. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +41 -1
  184. package/corpus/templates/content/app/i18n/ar-SA.ts +3 -0
  185. package/corpus/templates/content/app/i18n/de-DE.ts +3 -0
  186. package/corpus/templates/content/app/i18n/en-US.ts +3 -0
  187. package/corpus/templates/content/app/i18n/es-ES.ts +3 -0
  188. package/corpus/templates/content/app/i18n/fr-FR.ts +3 -0
  189. package/corpus/templates/content/app/i18n/hi-IN.ts +3 -0
  190. package/corpus/templates/content/app/i18n/index.ts +31 -0
  191. package/corpus/templates/content/app/i18n/ja-JP.ts +3 -0
  192. package/corpus/templates/content/app/i18n/ko-KR.ts +3 -0
  193. package/corpus/templates/content/app/i18n/pt-BR.ts +3 -0
  194. package/corpus/templates/content/app/i18n/zh-CN.ts +3 -0
  195. package/corpus/templates/content/app/i18n-data.ts +490 -0
  196. package/corpus/templates/content/app/root.tsx +110 -23
  197. package/corpus/templates/content/app/routes/_app.settings.tsx +84 -0
  198. package/corpus/templates/content/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  199. package/corpus/templates/content/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  200. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +6 -0
  201. package/corpus/templates/design/app/components/layout/Header.tsx +16 -8
  202. package/corpus/templates/design/app/components/layout/Layout.tsx +8 -6
  203. package/corpus/templates/design/app/components/layout/Sidebar.tsx +25 -9
  204. package/corpus/templates/design/app/i18n/ar-SA.ts +3 -0
  205. package/corpus/templates/design/app/i18n/de-DE.ts +3 -0
  206. package/corpus/templates/design/app/i18n/en-US.ts +3 -0
  207. package/corpus/templates/design/app/i18n/es-ES.ts +3 -0
  208. package/corpus/templates/design/app/i18n/fr-FR.ts +3 -0
  209. package/corpus/templates/design/app/i18n/hi-IN.ts +3 -0
  210. package/corpus/templates/design/app/i18n/index.ts +31 -0
  211. package/corpus/templates/design/app/i18n/ja-JP.ts +3 -0
  212. package/corpus/templates/design/app/i18n/ko-KR.ts +3 -0
  213. package/corpus/templates/design/app/i18n/pt-BR.ts +3 -0
  214. package/corpus/templates/design/app/i18n/zh-CN.ts +3 -0
  215. package/corpus/templates/design/app/i18n-data.ts +350 -0
  216. package/corpus/templates/design/app/root.tsx +40 -15
  217. package/corpus/templates/design/app/routes/settings.tsx +43 -0
  218. package/corpus/templates/design/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  220. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +6 -0
  221. package/corpus/templates/dispatch/app/i18n/ar-SA.ts +3 -0
  222. package/corpus/templates/dispatch/app/i18n/de-DE.ts +3 -0
  223. package/corpus/templates/dispatch/app/i18n/en-US.ts +3 -0
  224. package/corpus/templates/dispatch/app/i18n/es-ES.ts +3 -0
  225. package/corpus/templates/dispatch/app/i18n/fr-FR.ts +3 -0
  226. package/corpus/templates/dispatch/app/i18n/hi-IN.ts +3 -0
  227. package/corpus/templates/dispatch/app/i18n/index.ts +31 -0
  228. package/corpus/templates/dispatch/app/i18n/ja-JP.ts +3 -0
  229. package/corpus/templates/dispatch/app/i18n/ko-KR.ts +3 -0
  230. package/corpus/templates/dispatch/app/i18n/pt-BR.ts +3 -0
  231. package/corpus/templates/dispatch/app/i18n/zh-CN.ts +3 -0
  232. package/corpus/templates/dispatch/app/i18n-data.ts +267 -0
  233. package/corpus/templates/dispatch/app/root.tsx +18 -4
  234. package/corpus/templates/dispatch/app/routes/settings.tsx +86 -0
  235. package/corpus/templates/dispatch/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  236. package/corpus/templates/dispatch/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  237. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +6 -0
  238. package/corpus/templates/forms/app/components/layout/Header.tsx +16 -9
  239. package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -4
  240. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +34 -17
  241. package/corpus/templates/forms/app/i18n/ar-SA.ts +58 -0
  242. package/corpus/templates/forms/app/i18n/de-DE.ts +59 -0
  243. package/corpus/templates/forms/app/i18n/en-US.ts +59 -0
  244. package/corpus/templates/forms/app/i18n/es-ES.ts +59 -0
  245. package/corpus/templates/forms/app/i18n/fr-FR.ts +59 -0
  246. package/corpus/templates/forms/app/i18n/hi-IN.ts +59 -0
  247. package/corpus/templates/forms/app/i18n/index.ts +31 -0
  248. package/corpus/templates/forms/app/i18n/ja-JP.ts +59 -0
  249. package/corpus/templates/forms/app/i18n/ko-KR.ts +59 -0
  250. package/corpus/templates/forms/app/i18n/pt-BR.ts +59 -0
  251. package/corpus/templates/forms/app/i18n/zh-CN.ts +56 -0
  252. package/corpus/templates/forms/app/root.tsx +65 -16
  253. package/corpus/templates/forms/app/routes/_app.settings.tsx +85 -0
  254. package/corpus/templates/forms/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  255. package/corpus/templates/forms/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  256. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +29 -17
  257. package/corpus/templates/macros/app/components/layout/Header.tsx +16 -10
  258. package/corpus/templates/macros/app/i18n/ar-SA.ts +54 -0
  259. package/corpus/templates/macros/app/i18n/de-DE.ts +55 -0
  260. package/corpus/templates/macros/app/i18n/en-US.ts +55 -0
  261. package/corpus/templates/macros/app/i18n/es-ES.ts +55 -0
  262. package/corpus/templates/macros/app/i18n/fr-FR.ts +55 -0
  263. package/corpus/templates/macros/app/i18n/hi-IN.ts +55 -0
  264. package/corpus/templates/macros/app/i18n/index.ts +31 -0
  265. package/corpus/templates/macros/app/i18n/ja-JP.ts +55 -0
  266. package/corpus/templates/macros/app/i18n/ko-KR.ts +55 -0
  267. package/corpus/templates/macros/app/i18n/pt-BR.ts +55 -0
  268. package/corpus/templates/macros/app/i18n/zh-CN.ts +53 -0
  269. package/corpus/templates/macros/app/root.tsx +65 -15
  270. package/corpus/templates/macros/app/routes/settings.tsx +85 -0
  271. package/corpus/templates/macros/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  272. package/corpus/templates/macros/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  273. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +6 -0
  274. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +9 -4
  275. package/corpus/templates/mail/app/i18n/ar-SA.ts +33 -0
  276. package/corpus/templates/mail/app/i18n/de-DE.ts +33 -0
  277. package/corpus/templates/mail/app/i18n/en-US.ts +32 -0
  278. package/corpus/templates/mail/app/i18n/es-ES.ts +33 -0
  279. package/corpus/templates/mail/app/i18n/fr-FR.ts +33 -0
  280. package/corpus/templates/mail/app/i18n/hi-IN.ts +32 -0
  281. package/corpus/templates/mail/app/i18n/index.ts +31 -0
  282. package/corpus/templates/mail/app/i18n/ja-JP.ts +32 -0
  283. package/corpus/templates/mail/app/i18n/ko-KR.ts +33 -0
  284. package/corpus/templates/mail/app/i18n/pt-BR.ts +34 -0
  285. package/corpus/templates/mail/app/i18n/zh-CN.ts +32 -0
  286. package/corpus/templates/mail/app/pages/SettingsPage.tsx +67 -13
  287. package/corpus/templates/mail/app/root.tsx +20 -0
  288. package/corpus/templates/mail/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  289. package/corpus/templates/mail/changelog/2026-06-24-settings-now-link-directly-to-agent-settings-for-model-api-k.md +6 -0
  290. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  291. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +6 -0
  292. package/corpus/templates/plan/app/components/layout/Header.tsx +19 -12
  293. package/corpus/templates/plan/app/components/layout/Layout.tsx +11 -7
  294. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +41 -28
  295. package/corpus/templates/plan/app/i18n/ar-SA.ts +77 -0
  296. package/corpus/templates/plan/app/i18n/de-DE.ts +78 -0
  297. package/corpus/templates/plan/app/i18n/en-US.ts +78 -0
  298. package/corpus/templates/plan/app/i18n/es-ES.ts +78 -0
  299. package/corpus/templates/plan/app/i18n/fr-FR.ts +78 -0
  300. package/corpus/templates/plan/app/i18n/hi-IN.ts +78 -0
  301. package/corpus/templates/plan/app/i18n/index.ts +31 -0
  302. package/corpus/templates/plan/app/i18n/ja-JP.ts +79 -0
  303. package/corpus/templates/plan/app/i18n/ko-KR.ts +77 -0
  304. package/corpus/templates/plan/app/i18n/pt-BR.ts +78 -0
  305. package/corpus/templates/plan/app/i18n/zh-CN.ts +74 -0
  306. package/corpus/templates/plan/app/root.tsx +45 -8
  307. package/corpus/templates/plan/app/routes/settings.tsx +86 -0
  308. package/corpus/templates/plan/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  309. package/corpus/templates/plan/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  310. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +6 -0
  311. package/corpus/templates/slides/app/components/layout/Header.tsx +23 -11
  312. package/corpus/templates/slides/app/components/layout/Layout.tsx +7 -6
  313. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +23 -11
  314. package/corpus/templates/slides/app/i18n/ar-SA.ts +54 -0
  315. package/corpus/templates/slides/app/i18n/de-DE.ts +56 -0
  316. package/corpus/templates/slides/app/i18n/en-US.ts +55 -0
  317. package/corpus/templates/slides/app/i18n/es-ES.ts +55 -0
  318. package/corpus/templates/slides/app/i18n/fr-FR.ts +55 -0
  319. package/corpus/templates/slides/app/i18n/hi-IN.ts +55 -0
  320. package/corpus/templates/slides/app/i18n/index.ts +31 -0
  321. package/corpus/templates/slides/app/i18n/ja-JP.ts +55 -0
  322. package/corpus/templates/slides/app/i18n/ko-KR.ts +55 -0
  323. package/corpus/templates/slides/app/i18n/pt-BR.ts +55 -0
  324. package/corpus/templates/slides/app/i18n/zh-CN.ts +53 -0
  325. package/corpus/templates/slides/app/root.tsx +50 -8
  326. package/corpus/templates/slides/app/routes/settings.tsx +85 -0
  327. package/corpus/templates/slides/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  328. package/corpus/templates/slides/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  329. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +6 -0
  330. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +14 -9
  331. package/corpus/templates/videos/app/components/Sidebar.tsx +16 -9
  332. package/corpus/templates/videos/app/components/StudioHeader.tsx +12 -8
  333. package/corpus/templates/videos/app/components/layout/Header.tsx +21 -15
  334. package/corpus/templates/videos/app/components/layout/Layout.tsx +10 -7
  335. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +21 -6
  336. package/corpus/templates/videos/app/i18n/ar-SA.ts +73 -0
  337. package/corpus/templates/videos/app/i18n/de-DE.ts +75 -0
  338. package/corpus/templates/videos/app/i18n/en-US.ts +74 -0
  339. package/corpus/templates/videos/app/i18n/es-ES.ts +75 -0
  340. package/corpus/templates/videos/app/i18n/fr-FR.ts +75 -0
  341. package/corpus/templates/videos/app/i18n/hi-IN.ts +74 -0
  342. package/corpus/templates/videos/app/i18n/index.ts +31 -0
  343. package/corpus/templates/videos/app/i18n/ja-JP.ts +74 -0
  344. package/corpus/templates/videos/app/i18n/ko-KR.ts +74 -0
  345. package/corpus/templates/videos/app/i18n/pt-BR.ts +75 -0
  346. package/corpus/templates/videos/app/i18n/zh-CN.ts +72 -0
  347. package/corpus/templates/videos/app/pages/Index.tsx +11 -9
  348. package/corpus/templates/videos/app/root.tsx +45 -7
  349. package/corpus/templates/videos/app/routes/settings.tsx +85 -0
  350. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  351. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  352. package/dist/agent/durable-background.d.ts +15 -0
  353. package/dist/agent/durable-background.d.ts.map +1 -1
  354. package/dist/agent/durable-background.js +28 -2
  355. package/dist/agent/durable-background.js.map +1 -1
  356. package/dist/agent/production-agent.d.ts.map +1 -1
  357. package/dist/agent/production-agent.js +34 -1
  358. package/dist/agent/production-agent.js.map +1 -1
  359. package/dist/agent/run-manager.d.ts +8 -0
  360. package/dist/agent/run-manager.d.ts.map +1 -1
  361. package/dist/agent/run-manager.js +18 -1
  362. package/dist/agent/run-manager.js.map +1 -1
  363. package/dist/agent/run-store.d.ts +99 -0
  364. package/dist/agent/run-store.d.ts.map +1 -1
  365. package/dist/agent/run-store.js +155 -4
  366. package/dist/agent/run-store.js.map +1 -1
  367. package/dist/client/CommandMenu.d.ts +3 -0
  368. package/dist/client/CommandMenu.d.ts.map +1 -1
  369. package/dist/client/CommandMenu.js +9 -0
  370. package/dist/client/CommandMenu.js.map +1 -1
  371. package/dist/client/app-providers.d.ts +8 -1
  372. package/dist/client/app-providers.d.ts.map +1 -1
  373. package/dist/client/app-providers.js +7 -5
  374. package/dist/client/app-providers.js.map +1 -1
  375. package/dist/client/i18n.d.ts +54 -0
  376. package/dist/client/i18n.d.ts.map +1 -0
  377. package/dist/client/i18n.js +354 -0
  378. package/dist/client/i18n.js.map +1 -0
  379. package/dist/client/index.d.ts +2 -1
  380. package/dist/client/index.d.ts.map +1 -1
  381. package/dist/client/index.js +2 -1
  382. package/dist/client/index.js.map +1 -1
  383. package/dist/index.browser.d.ts +1 -1
  384. package/dist/index.browser.d.ts.map +1 -1
  385. package/dist/index.browser.js +1 -1
  386. package/dist/index.browser.js.map +1 -1
  387. package/dist/localization/actions/get-localization-preference.d.ts +4 -0
  388. package/dist/localization/actions/get-localization-preference.d.ts.map +1 -0
  389. package/dist/localization/actions/get-localization-preference.js +16 -0
  390. package/dist/localization/actions/get-localization-preference.js.map +1 -0
  391. package/dist/localization/actions/set-localization-preference.d.ts +6 -0
  392. package/dist/localization/actions/set-localization-preference.d.ts.map +1 -0
  393. package/dist/localization/actions/set-localization-preference.js +24 -0
  394. package/dist/localization/actions/set-localization-preference.js.map +1 -0
  395. package/dist/localization/index.d.ts +3 -0
  396. package/dist/localization/index.d.ts.map +1 -0
  397. package/dist/localization/index.js +3 -0
  398. package/dist/localization/index.js.map +1 -0
  399. package/dist/localization/server.d.ts +25 -0
  400. package/dist/localization/server.d.ts.map +1 -0
  401. package/dist/localization/server.js +69 -0
  402. package/dist/localization/server.js.map +1 -0
  403. package/dist/localization/shared.d.ts +25 -0
  404. package/dist/localization/shared.d.ts.map +1 -0
  405. package/dist/localization/shared.js +134 -0
  406. package/dist/localization/shared.js.map +1 -0
  407. package/dist/server/action-discovery.d.ts.map +1 -1
  408. package/dist/server/action-discovery.js +8 -0
  409. package/dist/server/action-discovery.js.map +1 -1
  410. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  411. package/dist/server/agent-chat-plugin.js +58 -1
  412. package/dist/server/agent-chat-plugin.js.map +1 -1
  413. package/dist/server/auth.d.ts.map +1 -1
  414. package/dist/server/auth.js +12 -0
  415. package/dist/server/auth.js.map +1 -1
  416. package/dist/server/index.d.ts +1 -0
  417. package/dist/server/index.d.ts.map +1 -1
  418. package/dist/server/index.js +1 -0
  419. package/dist/server/index.js.map +1 -1
  420. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  421. package/dist/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  422. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  423. package/dist/templates/default/AGENTS.md +16 -15
  424. package/dist/templates/default/app/i18n/en-US.ts +29 -0
  425. package/dist/templates/default/app/i18n/index.ts +13 -0
  426. package/dist/templates/default/app/root.tsx +20 -1
  427. package/dist/templates/default/app/routes/_index.tsx +24 -9
  428. package/dist/templates/default/app/routes/settings.tsx +67 -0
  429. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  430. package/dist/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  431. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +6 -0
  432. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  433. package/dist/vite/action-types-plugin.js +8 -0
  434. package/dist/vite/action-types-plugin.js.map +1 -1
  435. package/docs/AGENTS.md +1 -0
  436. package/docs/content/client.md +15 -0
  437. package/docs/content/internationalization.md +145 -0
  438. package/docs/content/locales/ar-SA/internationalization.md +102 -0
  439. package/docs/content/locales/de-DE/internationalization.md +102 -0
  440. package/docs/content/locales/es-ES/internationalization.md +102 -0
  441. package/docs/content/locales/fr-FR/internationalization.md +102 -0
  442. package/docs/content/locales/hi-IN/internationalization.md +102 -0
  443. package/docs/content/locales/ja-JP/internationalization.md +114 -0
  444. package/docs/content/locales/ko-KR/internationalization.md +102 -0
  445. package/docs/content/locales/pt-BR/internationalization.md +102 -0
  446. package/docs/content/locales/zh-CN/internationalization.md +102 -0
  447. package/docs/content/skills-guide.md +19 -18
  448. package/package.json +7 -1
  449. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  450. package/src/templates/default/.agents/skills/internationalization/SKILL.md +77 -0
  451. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +6 -0
  452. package/src/templates/default/AGENTS.md +16 -15
  453. package/src/templates/default/app/i18n/en-US.ts +29 -0
  454. package/src/templates/default/app/i18n/index.ts +13 -0
  455. package/src/templates/default/app/root.tsx +20 -1
  456. package/src/templates/default/app/routes/_index.tsx +24 -9
  457. package/src/templates/default/app/routes/settings.tsx +67 -0
  458. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  459. package/src/templates/workspace-core/.agents/skills/internationalization/SKILL.md +77 -0
  460. 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>
@@ -163,12 +163,12 @@ export default function KnowledgeRoute() {
163
163
  <Card>
164
164
  <CardContent className="flex flex-col gap-3 p-4 lg:flex-row lg:items-center">
165
165
  <div className="relative min-w-0 flex-1">
166
- <IconSearch className="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
166
+ <IconSearch className="pointer-events-none absolute start-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
167
167
  <Input
168
168
  value={query}
169
169
  onChange={(event) => updateParam("q", event.target.value)}
170
170
  placeholder="Search memories, topics, source names..."
171
- className="pl-9"
171
+ className="ps-9"
172
172
  />
173
173
  </div>
174
174
  <div className="flex flex-col gap-2 sm:flex-row">
@@ -217,8 +217,8 @@ export default function KnowledgeRoute() {
217
217
  <TableHead>Source</TableHead>
218
218
  <TableHead>Status</TableHead>
219
219
  <TableHead>Company context</TableHead>
220
- <TableHead className="text-right">Confidence</TableHead>
221
- <TableHead className="text-right">Cites</TableHead>
220
+ <TableHead className="text-end">Confidence</TableHead>
221
+ <TableHead className="text-end">Cites</TableHead>
222
222
  </TableRow>
223
223
  </TableHeader>
224
224
  <TableBody>
@@ -262,12 +262,12 @@ export default function KnowledgeRoute() {
262
262
  onPreview={() => void openCanonicalPreview(row)}
263
263
  />
264
264
  </TableCell>
265
- <TableCell className="text-right">
265
+ <TableCell className="text-end">
266
266
  {typeof row.confidence === "number"
267
267
  ? formatPercent(row.confidence)
268
268
  : "n/a"}
269
269
  </TableCell>
270
- <TableCell className="text-right">
270
+ <TableCell className="text-end">
271
271
  {row.citations ?? 0}
272
272
  </TableCell>
273
273
  </TableRow>
@@ -416,11 +416,11 @@ export default function OpsRoute() {
416
416
  <TableHead>Status</TableHead>
417
417
  <TableHead>Capture</TableHead>
418
418
  <TableHead>Source</TableHead>
419
- <TableHead className="text-right">Attempts</TableHead>
419
+ <TableHead className="text-end">Attempts</TableHead>
420
420
  <TableHead>Run after</TableHead>
421
421
  <TableHead>Updated</TableHead>
422
422
  <TableHead>Reason</TableHead>
423
- <TableHead className="text-right">Action</TableHead>
423
+ <TableHead className="text-end">Action</TableHead>
424
424
  </TableRow>
425
425
  </TableHeader>
426
426
  <TableBody>
@@ -474,7 +474,7 @@ export default function OpsRoute() {
474
474
  </p>
475
475
  </div>
476
476
  </TableCell>
477
- <TableCell className="text-right tabular-nums">
477
+ <TableCell className="text-end tabular-nums">
478
478
  {item.attempts}
479
479
  </TableCell>
480
480
  <TableCell className="whitespace-nowrap text-sm text-muted-foreground">
@@ -491,7 +491,7 @@ export default function OpsRoute() {
491
491
  "No issue recorded"}
492
492
  </p>
493
493
  </TableCell>
494
- <TableCell className="text-right">
494
+ <TableCell className="text-end">
495
495
  <Button
496
496
  size="sm"
497
497
  variant="outline"
@@ -144,12 +144,12 @@ export default function SearchRoute() {
144
144
  <Card>
145
145
  <CardContent className="grid gap-3 p-4">
146
146
  <div className="relative">
147
- <IconSearch className="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
147
+ <IconSearch className="pointer-events-none absolute start-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
148
148
  <Input
149
149
  value={query}
150
150
  onChange={(event) => updateParam("q", event.target.value)}
151
151
  placeholder="Search decisions, customer facts, source names, transcripts, or policy snippets..."
152
- className="h-11 pl-9 text-base"
152
+ className="h-11 ps-9 text-base"
153
153
  autoFocus
154
154
  />
155
155
  </div>
@@ -420,10 +420,10 @@ function SearchResultDetails({
420
420
  </Badge>
421
421
  ) : null}
422
422
  </div>
423
- <SheetTitle className="text-left text-xl leading-7">
423
+ <SheetTitle className="text-start text-xl leading-7">
424
424
  {result.title}
425
425
  </SheetTitle>
426
- <SheetDescription className="text-left leading-6">
426
+ <SheetDescription className="text-start leading-6">
427
427
  {body}
428
428
  </SheetDescription>
429
429
  </SheetHeader>
@@ -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">
@@ -571,9 +608,9 @@ function NumberField({
571
608
  max={max}
572
609
  value={value}
573
610
  onChange={(event) => onChange(Number(event.target.value))}
574
- className="rounded-r-none"
611
+ className="rounded-e-none"
575
612
  />
576
- <div className="flex min-w-20 items-center justify-center rounded-r-md border border-l-0 border-input bg-muted px-3 text-sm text-muted-foreground">
613
+ <div className="flex min-w-20 items-center justify-center rounded-e-md border border-s-0 border-input bg-muted px-3 text-sm text-muted-foreground">
577
614
  {suffix}
578
615
  </div>
579
616
  </div>
@@ -616,7 +653,7 @@ function PolicyRow({ label, value }: { label: string; value: string }) {
616
653
  return (
617
654
  <div className="flex items-center justify-between gap-3">
618
655
  <span className="min-w-0 text-muted-foreground">{label}</span>
619
- <span className="max-w-40 truncate text-right font-medium capitalize">
656
+ <span className="max-w-40 truncate text-end font-medium capitalize">
620
657
  {value.replace(/_/g, " ")}
621
658
  </span>
622
659
  </div>
@@ -1074,7 +1074,7 @@ function ProviderCatalog({
1074
1074
  variant="outline"
1075
1075
  className={`${grantStateClass(grantState)} w-fit max-w-full`}
1076
1076
  >
1077
- <GrantIcon className="mr-1 size-3" />
1077
+ <GrantIcon className="me-1 size-3" />
1078
1078
  {grantStateLabel(grantState)}
1079
1079
  </Badge>
1080
1080
  <Badge
@@ -2037,7 +2037,7 @@ export default function SourcesRoute() {
2037
2037
  {enqueueCapturesDistillation.isPending ? (
2038
2038
  <IconLoader2 className="size-4 animate-spin" />
2039
2039
  ) : (
2040
- <IconSend className="size-4" />
2040
+ <IconSend className="size-4 rtl:-scale-x-100" />
2041
2041
  )}
2042
2042
  Queue selected
2043
2043
  </Button>
@@ -2205,7 +2205,7 @@ export default function SourcesRoute() {
2205
2205
  {enqueueDistillation.isPending ? (
2206
2206
  <IconLoader2 className="size-4 animate-spin" />
2207
2207
  ) : (
2208
- <IconSend className="size-4" />
2208
+ <IconSend className="size-4 rtl:-scale-x-100" />
2209
2209
  )}
2210
2210
  {queueActionLabel(queue)}
2211
2211
  </Button>
@@ -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;