@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
@@ -0,0 +1,32 @@
1
+ const messages = {
2
+ agent: {
3
+ emptyState: "可以问我任何关于邮件的问题",
4
+ suggestionSummarize: "总结我的未读邮件",
5
+ suggestionReplies: "今天哪些邮件需要我回复?",
6
+ suggestionWidget: "为我的收件箱创建自定义小组件",
7
+ },
8
+ settings: {
9
+ openAgentSettings: "打开代理设置",
10
+ agentDescription:
11
+ "打开代理侧边栏设置,管理模型、API 密钥、自动化、语音和其他代理控制项。",
12
+ agentTitle: "代理设置",
13
+ title: "设置",
14
+ general: "通用",
15
+ generalDescription: "Mail 的语言和账号级偏好设置。",
16
+ languageTitle: "语言",
17
+ languageDescription:
18
+ "选择此账号的界面语言。Mail 会在不同设备上记住你的选择。",
19
+ languageLabel: "界面语言",
20
+ whatsNew: "最新变化",
21
+ whatsNewDescription: "Agent-Native Mail 最近面向用户的更新。",
22
+ drafting: "起草",
23
+ automations: "自动化",
24
+ gmailFilters: "Gmail 筛选器",
25
+ aliases: "别名",
26
+ tracking: "跟踪",
27
+ slack: "Slack",
28
+ team: "团队",
29
+ },
30
+ };
31
+
32
+ export default messages;
@@ -7,6 +7,9 @@ import {
7
7
  useChatModels,
8
8
  useChangeVersions,
9
9
  ChangelogSettingsCard,
10
+ LanguagePicker,
11
+ openAgentSettings,
12
+ useT,
10
13
  } from "@agent-native/core/client";
11
14
  import { appApiPath } from "@agent-native/core/client";
12
15
  import changelog from "../../CHANGELOG.md?raw";
@@ -27,6 +30,7 @@ import {
27
30
  IconFilter,
28
31
  IconInfoCircle,
29
32
  IconHistory,
33
+ IconSettings,
30
34
  } from "@tabler/icons-react";
31
35
  import { cn } from "@/lib/utils";
32
36
  import { Button } from "@/components/ui/button";
@@ -1384,15 +1388,60 @@ function SlackIntakeSection() {
1384
1388
 
1385
1389
  // ─── What's New Section ──────────────────────────────────────────────────────
1386
1390
 
1391
+ function GeneralSection() {
1392
+ const t = useT();
1393
+ return (
1394
+ <div className="flex-1 overflow-y-auto p-4 sm:p-8">
1395
+ <div className="mb-6">
1396
+ <h2 className="text-[16px] font-semibold text-foreground">
1397
+ {t("settings.general")}
1398
+ </h2>
1399
+ <p className="mt-0.5 text-[13px] text-muted-foreground">
1400
+ {t("settings.generalDescription")}
1401
+ </p>
1402
+ </div>
1403
+
1404
+ <div className="max-w-2xl rounded-lg border border-border/20 bg-card/50 p-4">
1405
+ <div className="mb-3">
1406
+ <h3 className="text-[13px] font-semibold text-foreground">
1407
+ {t("settings.languageTitle")}
1408
+ </h3>
1409
+ <p className="mt-0.5 text-[12px] text-muted-foreground">
1410
+ {t("settings.languageDescription")}
1411
+ </p>
1412
+ </div>
1413
+ <div className="max-w-sm">
1414
+ <LanguagePicker label={t("settings.languageLabel")} />
1415
+ </div>
1416
+ </div>
1417
+
1418
+ <div className="mt-4 max-w-2xl rounded-lg border border-border/20 bg-card/50 p-4">
1419
+ <div className="mb-3">
1420
+ <h3 className="text-[13px] font-semibold text-foreground">
1421
+ {t("settings.agentTitle")}
1422
+ </h3>
1423
+ <p className="mt-0.5 text-[12px] text-muted-foreground">
1424
+ {t("settings.agentDescription")}
1425
+ </p>
1426
+ </div>
1427
+ <Button variant="outline" size="sm" onClick={() => openAgentSettings()}>
1428
+ {t("settings.openAgentSettings")}
1429
+ </Button>
1430
+ </div>
1431
+ </div>
1432
+ );
1433
+ }
1434
+
1387
1435
  function WhatsNewSection() {
1436
+ const t = useT();
1388
1437
  return (
1389
1438
  <div className="flex-1 overflow-y-auto p-4 sm:p-8">
1390
1439
  <div className="mb-6">
1391
1440
  <h2 className="text-[16px] font-semibold text-foreground">
1392
- What's new
1441
+ {t("settings.whatsNew")}
1393
1442
  </h2>
1394
1443
  <p className="mt-0.5 text-[13px] text-muted-foreground">
1395
- Recent user-facing changes to Agent-Native Mail.
1444
+ {t("settings.whatsNewDescription")}
1396
1445
  </p>
1397
1446
  </div>
1398
1447
 
@@ -1406,6 +1455,7 @@ function WhatsNewSection() {
1406
1455
  // ─── Settings Page ────────────────────────────────────────────────────────────
1407
1456
 
1408
1457
  type SettingsSection =
1458
+ | "general"
1409
1459
  | "whats-new"
1410
1460
  | "drafting"
1411
1461
  | "automations"
@@ -1417,17 +1467,18 @@ type SettingsSection =
1417
1467
 
1418
1468
  const navItems: {
1419
1469
  id: SettingsSection;
1420
- label: string;
1470
+ labelKey: string;
1421
1471
  icon: React.ComponentType<{ className?: string }>;
1422
1472
  }[] = [
1423
- { id: "whats-new", label: "What's new", icon: IconHistory },
1424
- { id: "drafting", label: "Drafting", icon: IconSignature },
1425
- { id: "automations", label: "Automations", icon: IconBolt },
1426
- { id: "gmail-filters", label: "Gmail Filters", icon: IconFilter },
1427
- { id: "aliases", label: "Aliases", icon: IconUsers },
1428
- { id: "tracking", label: "Tracking", icon: IconChartBar },
1429
- { id: "slack", label: "Slack", icon: IconBolt },
1430
- { id: "team", label: "Team", icon: IconUsers },
1473
+ { id: "general", labelKey: "settings.general", icon: IconSettings },
1474
+ { id: "whats-new", labelKey: "settings.whatsNew", icon: IconHistory },
1475
+ { id: "drafting", labelKey: "settings.drafting", icon: IconSignature },
1476
+ { id: "automations", labelKey: "settings.automations", icon: IconBolt },
1477
+ { id: "gmail-filters", labelKey: "settings.gmailFilters", icon: IconFilter },
1478
+ { id: "aliases", labelKey: "settings.aliases", icon: IconUsers },
1479
+ { id: "tracking", labelKey: "settings.tracking", icon: IconChartBar },
1480
+ { id: "slack", labelKey: "settings.slack", icon: IconBolt },
1481
+ { id: "team", labelKey: "settings.team", icon: IconUsers },
1431
1482
  ];
1432
1483
 
1433
1484
  function isSettingsSection(value: string | null): value is SettingsSection {
@@ -1435,6 +1486,7 @@ function isSettingsSection(value: string | null): value is SettingsSection {
1435
1486
  }
1436
1487
 
1437
1488
  export function SettingsPage() {
1489
+ const t = useT();
1438
1490
  const [searchParams, setSearchParams] = useSearchParams();
1439
1491
  const navState = useNavigationState();
1440
1492
  const [activeSection, setActiveSection] =
@@ -1460,11 +1512,12 @@ export function SettingsPage() {
1460
1512
  {/* Top tabs on mobile, left sidebar on desktop */}
1461
1513
  <div className="sm:w-[200px] shrink-0 sm:border-r border-b sm:border-b-0 border-border/30 bg-muted/50 dark:bg-[hsl(220,6%,5%)] sm:p-3 flex sm:flex-col gap-0.5 overflow-x-auto">
1462
1514
  <p className="hidden sm:block px-2 py-1.5 text-[10px] font-medium text-muted-foreground/40 uppercase tracking-wider mb-1">
1463
- Settings
1515
+ {t("settings.title")}
1464
1516
  </p>
1465
1517
  {navItems.map((item) => {
1466
1518
  const Icon = item.icon;
1467
1519
  const isActive = activeSection === item.id;
1520
+ const label = t(item.labelKey);
1468
1521
  return (
1469
1522
  <button
1470
1523
  key={item.id}
@@ -1482,7 +1535,7 @@ export function SettingsPage() {
1482
1535
  isActive ? "text-indigo-400" : "text-muted-foreground/60",
1483
1536
  )}
1484
1537
  />
1485
- {item.label}
1538
+ {label}
1486
1539
  </button>
1487
1540
  );
1488
1541
  })}
@@ -1490,6 +1543,7 @@ export function SettingsPage() {
1490
1543
 
1491
1544
  {/* Right content panel */}
1492
1545
  <div className="flex flex-1 overflow-hidden bg-background">
1546
+ {activeSection === "general" && <GeneralSection />}
1493
1547
  {activeSection === "whats-new" && <WhatsNewSection />}
1494
1548
  {activeSection === "drafting" && <DraftingSection />}
1495
1549
  {activeSection === "automations" && <AutomationsSection />}
@@ -18,6 +18,7 @@ import {
18
18
  appPath,
19
19
  appApiPath,
20
20
  createAgentNativeQueryClient,
21
+ getLocaleInitScript,
21
22
  getThemeInitScript,
22
23
  } from "@agent-native/core/client";
23
24
  import { TAB_ID } from "@/lib/tab-id";
@@ -27,6 +28,7 @@ import { Button } from "@/components/ui/button";
27
28
  import type { LinksFunction } from "react-router";
28
29
  import stylesheet from "./global.css?url";
29
30
  import { configureTracking } from "@agent-native/core/client";
31
+ import { i18nCatalog } from "./i18n";
30
32
  configureTracking({
31
33
  getDefaultProps: (_name, properties) => ({
32
34
  ...properties,
@@ -39,6 +41,7 @@ export const links: LinksFunction = () => [
39
41
  ];
40
42
 
41
43
  const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
44
+ const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
42
45
 
43
46
  function getHydrationStableThemeInitScript() {
44
47
  if (typeof document !== "undefined") {
@@ -50,7 +53,18 @@ function getHydrationStableThemeInitScript() {
50
53
  return getThemeInitScript();
51
54
  }
52
55
 
56
+ function getHydrationStableLocaleInitScript() {
57
+ if (typeof document !== "undefined") {
58
+ const existing = document.querySelector<HTMLScriptElement>(
59
+ LOCALE_INIT_SCRIPT_SELECTOR,
60
+ );
61
+ if (existing?.innerHTML) return existing.innerHTML;
62
+ }
63
+ return getLocaleInitScript();
64
+ }
65
+
53
66
  const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
67
+ const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
54
68
 
55
69
  export function Layout({ children }: { children: React.ReactNode }) {
56
70
  return (
@@ -66,6 +80,11 @@ export function Layout({ children }: { children: React.ReactNode }) {
66
80
  suppressHydrationWarning
67
81
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
68
82
  />
83
+ <script
84
+ data-agent-native-locale-init
85
+ suppressHydrationWarning
86
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
87
+ />
69
88
  <link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
70
89
  <link rel="manifest" href={appPath("/manifest.json")} />
71
90
  <meta name="theme-color" content="#3B82F6" />
@@ -262,6 +281,7 @@ export default function Root() {
262
281
  themeAttribute={["class", "data-theme"]}
263
282
  tooltipDelayDuration={300}
264
283
  toaster={MAIL_TOASTER}
284
+ i18n={{ catalog: i18nCatalog }}
265
285
  >
266
286
  <RequireSession bypass={isMcpEmbedSurface()}>
267
287
  <AutoFocus />
@@ -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.
@@ -86,6 +86,10 @@ Instruction examples may name secret keys like `SLACK_WEBHOOK`, but must use
86
86
  placeholders such as `${keys.SLACK_WEBHOOK}` or `<SLACK_WEBHOOK>`. Do not paste
87
87
  real keys, internal data, or customer data into instructions as examples.
88
88
 
89
+ If the feature adds or changes visible UI copy, prompts, toasts, labels, empty
90
+ states, or formatting, read `internationalization` and update the app's i18n
91
+ catalogs in the same change.
92
+
89
93
  For app-backed skills, declare skill visibility in the app-skill manifest:
90
94
 
91
95
  - `internal` — only the app's own agents should use it.
@@ -177,3 +181,4 @@ TL;DR: spread `ownableColumns()` into the resource table, pair it with `createSh
177
181
  - **create-skill** — How to create skills for new patterns (area 3 in detail)
178
182
  - **storing-data** — Where to store the feature's data
179
183
  - **real-time-sync** — How the UI stays in sync when the agent writes data
184
+ - **internationalization** — How to update localized UI copy and catalogs
@@ -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
@@ -1,21 +1,25 @@
1
1
  import { useLocation } from "react-router";
2
2
  import { IconMenu2 } from "@tabler/icons-react";
3
3
  import { useHeaderTitle, useHeaderActions } from "./HeaderActions";
4
- import { AgentToggleButton } from "@agent-native/core/client";
4
+ import {
5
+ AgentToggleButton,
6
+ LanguagePicker,
7
+ useT,
8
+ } from "@agent-native/core/client";
5
9
  import { APP_TITLE } from "@/lib/app-config";
6
10
 
7
- const pageTitles: Record<string, string> = {
8
- "/": "Plan",
9
- "/plans": "Plan",
10
- "/settings": "Settings",
11
- "/team": "Team",
11
+ const pageTitleKeys: Record<string, string> = {
12
+ "/": "header.plan",
13
+ "/plans": "header.plan",
14
+ "/settings": "header.settings",
15
+ "/team": "header.team",
12
16
  };
13
17
 
14
18
  function resolveTitle(pathname: string): string {
15
- if (pageTitles[pathname]) return pageTitles[pathname];
16
- if (pathname.startsWith("/plans")) return "Plan";
17
- if (pathname.startsWith("/extensions")) return "Extensions";
18
- return APP_TITLE;
19
+ if (pageTitleKeys[pathname]) return pageTitleKeys[pathname];
20
+ if (pathname.startsWith("/plans")) return "header.plan";
21
+ if (pathname.startsWith("/extensions")) return "header.extensions";
22
+ return "header.appTitle";
19
23
  }
20
24
 
21
25
  interface HeaderProps {
@@ -26,6 +30,8 @@ export function Header({ onOpenMobileSidebar }: HeaderProps) {
26
30
  const location = useLocation();
27
31
  const title = useHeaderTitle();
28
32
  const actions = useHeaderActions();
33
+ const t = useT();
34
+ const resolvedTitle = resolveTitle(location.pathname);
29
35
 
30
36
  return (
31
37
  <header className="flex h-12 items-center gap-3 border-b border-border bg-background px-4 lg:px-6 shrink-0">
@@ -33,7 +39,7 @@ export function Header({ onOpenMobileSidebar }: HeaderProps) {
33
39
  <button
34
40
  type="button"
35
41
  onClick={onOpenMobileSidebar}
36
- aria-label="Open navigation"
42
+ aria-label={t("sidebar.openNavigation")}
37
43
  className="flex h-9 w-9 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent md:hidden"
38
44
  >
39
45
  <IconMenu2 className="h-4 w-4" />
@@ -42,12 +48,13 @@ export function Header({ onOpenMobileSidebar }: HeaderProps) {
42
48
  <div className="flex items-center gap-3 flex-1 min-w-0">
43
49
  {title ?? (
44
50
  <h1 className="text-lg font-semibold tracking-tight truncate">
45
- {resolveTitle(location.pathname)}
51
+ {resolvedTitle === "header.appTitle" ? APP_TITLE : t(resolvedTitle)}
46
52
  </h1>
47
53
  )}
48
54
  </div>
49
55
  <div className="flex items-center gap-2 shrink-0">
50
56
  {actions}
57
+ <LanguagePicker variant="icon" />
51
58
  <AgentToggleButton />
52
59
  </div>
53
60
  </header>
@@ -8,6 +8,7 @@ import {
8
8
  AgentSidebar,
9
9
  useAgentChatHomeHandoff,
10
10
  useAgentChatHomeHandoffLinks,
11
+ useT,
11
12
  } from "@agent-native/core/client";
12
13
  import {
13
14
  Sheet,
@@ -43,6 +44,7 @@ function isPlanDetailRoute(pathname: string): boolean {
43
44
 
44
45
  export function Layout({ children }: LayoutProps) {
45
46
  const location = useLocation();
47
+ const t = useT();
46
48
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
47
49
  const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
48
50
  if (typeof window === "undefined") return true;
@@ -136,7 +138,7 @@ export function Layout({ children }: LayoutProps) {
136
138
  <button
137
139
  type="button"
138
140
  onClick={() => setMobileSidebarOpen(true)}
139
- aria-label="Open navigation"
141
+ aria-label={t("sidebar.openNavigation")}
140
142
  className="flex h-9 w-9 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent"
141
143
  >
142
144
  <IconMenu2 className="h-4 w-4" />
@@ -163,9 +165,11 @@ export function Layout({ children }: LayoutProps) {
163
165
  )}
164
166
  <Sheet open={mobileSidebarOpen} onOpenChange={setMobileSidebarOpen}>
165
167
  <SheetContent side="left" className="p-0 w-[260px]">
166
- <SheetTitle className="sr-only">Navigation</SheetTitle>
168
+ <SheetTitle className="sr-only">
169
+ {t("sidebar.navigation")}
170
+ </SheetTitle>
167
171
  <SheetDescription className="sr-only">
168
- App navigation links
172
+ {t("sidebar.navigationDescription")}
169
173
  </SheetDescription>
170
174
  <Sidebar collapsed={false} collapsible={false} />
171
175
  </SheetContent>
@@ -179,11 +183,11 @@ export function Layout({ children }: LayoutProps) {
179
183
  chatViewTransition
180
184
  storageKey="plans"
181
185
  openOnChatRunning={chatHomeHandoffActive}
182
- emptyStateText="Ask the Plan agent to search merged PR recaps, inspect this document, add diagrams, or answer code questions as visual plans."
186
+ emptyStateText={t("agent.emptyState")}
183
187
  suggestions={[
184
- "What shipped in the last week?",
185
- "What does this UI look like?",
186
- "What is the shape of this API?",
188
+ t("agent.suggestionShipped"),
189
+ t("agent.suggestionUi"),
190
+ t("agent.suggestionApi"),
187
191
  ]}
188
192
  >
189
193
  {pageContent}