@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,59 @@
1
+ const messages = {
2
+ root: {
3
+ commandForms: "양식",
4
+ searchForms: "양식 검색",
5
+ appearance: "모양",
6
+ toggleTheme: "테마 전환",
7
+ },
8
+ header: {
9
+ settings: "설정",
10
+ forms: "양식",
11
+ team: "팀",
12
+ responses: "응답",
13
+ form: "양식",
14
+ extensions: "확장",
15
+ },
16
+ navigation: {
17
+ settings: "설정",
18
+ brand: "양식",
19
+ askForms: "Ask Forms",
20
+ team: "팀",
21
+ },
22
+ settings: {
23
+ title: "설정",
24
+ description: "이 앱의 언어 및 워크스페이스 환경설정입니다.",
25
+ languageTitle: "언어",
26
+ languageDescription:
27
+ "인터페이스 언어를 선택하세요. 이 기본 설정은 계정에 저장됩니다.",
28
+ languageLabel: "인터페이스 언어",
29
+ workspaceTitle: "워크스페이스",
30
+ workspaceDescription:
31
+ "팀원, 조직 접근 권한, 공유 워크스페이스 환경설정을 관리합니다.",
32
+ openTeamSettings: "팀 설정 열기",
33
+ openResourceSettings: "리소스 설정 열기",
34
+ agentTitle: "에이전트 설정",
35
+ agentDescription:
36
+ "오른쪽 사이드바의 에이전트 설정을 열어 모델, API 키, 자동화, 음성 및 기타 제어를 관리합니다.",
37
+ openAgentSettings: "에이전트 설정 열기",
38
+ },
39
+ agent: {
40
+ emptyState: "양식에 대해 무엇이든 물어보세요",
41
+ suggestionSurvey: "고객 피드백 설문 만들기",
42
+ suggestionSubmissions: "일별 제출 보기",
43
+ suggestionExport: "응답을 CSV로 내보내기",
44
+ },
45
+ sidebar: {
46
+ formGenerationStale:
47
+ "양식 생성이 예상보다 오래 걸립니다. 다시 시도할 수 있습니다.",
48
+ untitledForm: "제목 없는 양식",
49
+ newForm: "새 양식",
50
+ describeFormPlaceholder: "양식을 설명하세요...",
51
+ skipPrompt: "프롬프트 건너뛰기",
52
+ submitShortcutSuffix: "+Enter로 제출",
53
+ sendPrompt: "프롬프트 보내기",
54
+ openAskFullScreen: "Ask Forms 전체 화면 열기",
55
+ openSidebar: "사이드바 열기",
56
+ },
57
+ };
58
+
59
+ export default messages;
@@ -0,0 +1,59 @@
1
+ const messages = {
2
+ root: {
3
+ commandForms: "Formularios",
4
+ searchForms: "Pesquisar formularios",
5
+ appearance: "Aparencia",
6
+ toggleTheme: "Alternar tema",
7
+ },
8
+ header: {
9
+ settings: "Configurações",
10
+ forms: "Formularios",
11
+ team: "Equipe",
12
+ responses: "Respostas",
13
+ form: "Formulario",
14
+ extensions: "Extensoes",
15
+ },
16
+ navigation: {
17
+ settings: "Configurações",
18
+ brand: "Formularios",
19
+ askForms: "Perguntar ao Forms",
20
+ team: "Equipe",
21
+ },
22
+ settings: {
23
+ title: "Configurações",
24
+ description: "Preferências de idioma e espaço de trabalho deste app.",
25
+ languageTitle: "Idioma",
26
+ languageDescription:
27
+ "Escolha o idioma da interface. Essa preferência é salva na sua conta.",
28
+ languageLabel: "Idioma da interface",
29
+ workspaceTitle: "Espaço de trabalho",
30
+ workspaceDescription:
31
+ "Gerencie membros da equipe, acesso da organização e preferências compartilhadas.",
32
+ openTeamSettings: "Abrir configurações da equipe",
33
+ openResourceSettings: "Abrir configurações de recursos",
34
+ agentTitle: "Configurações do agente",
35
+ agentDescription:
36
+ "Abra as configurações do agente na barra lateral para modelos, chaves de API, automações, voz e outros controles.",
37
+ openAgentSettings: "Abrir configurações do agente",
38
+ },
39
+ agent: {
40
+ emptyState: "Pergunte qualquer coisa sobre seus formularios",
41
+ suggestionSurvey: "Criar uma pesquisa de feedback de clientes",
42
+ suggestionSubmissions: "Mostrar envios por dia",
43
+ suggestionExport: "Exportar respostas para CSV",
44
+ },
45
+ sidebar: {
46
+ formGenerationStale:
47
+ "A geracao do formulario esta demorando mais que o esperado. Voce pode tentar de novo.",
48
+ untitledForm: "Formulario sem titulo",
49
+ newForm: "Novo formulario",
50
+ describeFormPlaceholder: "Descreva seu formulario...",
51
+ skipPrompt: "Ignorar prompt",
52
+ submitShortcutSuffix: "+Enter para enviar",
53
+ sendPrompt: "Enviar prompt",
54
+ openAskFullScreen: "Abrir Ask Forms em tela cheia",
55
+ openSidebar: "Abrir barra lateral",
56
+ },
57
+ };
58
+
59
+ export default messages;
@@ -0,0 +1,56 @@
1
+ const messages = {
2
+ root: {
3
+ commandForms: "表单",
4
+ searchForms: "搜索表单",
5
+ appearance: "外观",
6
+ toggleTheme: "切换主题",
7
+ },
8
+ header: {
9
+ settings: "设置",
10
+ forms: "表单",
11
+ team: "团队",
12
+ responses: "回复",
13
+ form: "表单",
14
+ extensions: "扩展",
15
+ },
16
+ navigation: {
17
+ settings: "设置",
18
+ brand: "表单",
19
+ askForms: "询问表单",
20
+ team: "团队",
21
+ },
22
+ settings: {
23
+ title: "设置",
24
+ description: "此应用的语言和工作区偏好设置。",
25
+ languageTitle: "语言",
26
+ languageDescription: "选择界面语言。此偏好会保存到你的账户。",
27
+ languageLabel: "界面语言",
28
+ workspaceTitle: "工作区",
29
+ workspaceDescription: "管理团队成员、组织访问权限和共享工作区偏好。",
30
+ openTeamSettings: "打开团队设置",
31
+ openResourceSettings: "打开资源设置",
32
+ agentTitle: "代理设置",
33
+ agentDescription:
34
+ "打开代理侧边栏设置,管理模型、API 密钥、自动化、语音和其他代理控制项。",
35
+ openAgentSettings: "打开代理设置",
36
+ },
37
+ agent: {
38
+ emptyState: "可以问我任何关于表单的问题",
39
+ suggestionSurvey: "创建客户反馈调查",
40
+ suggestionSubmissions: "按天显示提交",
41
+ suggestionExport: "将回复导出为 CSV",
42
+ },
43
+ sidebar: {
44
+ formGenerationStale: "表单生成时间比预期更长。你可以重试。",
45
+ untitledForm: "未命名表单",
46
+ newForm: "新建表单",
47
+ describeFormPlaceholder: "描述你的表单...",
48
+ skipPrompt: "跳过提示",
49
+ submitShortcutSuffix: "+Enter 提交",
50
+ sendPrompt: "发送提示",
51
+ openAskFullScreen: "全屏打开询问表单",
52
+ openSidebar: "打开侧边栏",
53
+ },
54
+ };
55
+
56
+ export default messages;
@@ -19,17 +19,20 @@ import {
19
19
  CommandMenu,
20
20
  appPath,
21
21
  createAgentNativeQueryClient,
22
+ getLocaleInitScript,
22
23
  useCommandMenuShortcut,
23
24
  getThemeInitScript,
24
25
  configureTracking,
25
26
  markAgentChatHomeHandoff,
26
27
  navigateWithAgentChatViewTransition,
27
28
  setClientAppState,
29
+ useT,
28
30
  } from "@agent-native/core/client";
29
31
  import type { LinksFunction } from "react-router";
30
32
  import changelog from "../CHANGELOG.md?raw";
31
33
  import stylesheet from "./global.css?url";
32
34
  import { TAB_ID } from "@/lib/tab-id";
35
+ import { i18nCatalog } from "./i18n";
33
36
 
34
37
  configureTracking({
35
38
  getDefaultProps: (_name, properties) => ({
@@ -42,7 +45,31 @@ export const links: LinksFunction = () => [
42
45
  { rel: "stylesheet", href: stylesheet },
43
46
  ];
44
47
 
45
- const THEME_INIT_SCRIPT = getThemeInitScript();
48
+ const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
49
+ const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
50
+
51
+ function getHydrationStableThemeInitScript() {
52
+ if (typeof document !== "undefined") {
53
+ const existing = document.querySelector<HTMLScriptElement>(
54
+ THEME_INIT_SCRIPT_SELECTOR,
55
+ );
56
+ if (existing?.innerHTML) return existing.innerHTML;
57
+ }
58
+ return getThemeInitScript();
59
+ }
60
+
61
+ function getHydrationStableLocaleInitScript() {
62
+ if (typeof document !== "undefined") {
63
+ const existing = document.querySelector<HTMLScriptElement>(
64
+ LOCALE_INIT_SCRIPT_SELECTOR,
65
+ );
66
+ if (existing?.innerHTML) return existing.innerHTML;
67
+ }
68
+ return getLocaleInitScript();
69
+ }
70
+
71
+ const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
72
+ const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
46
73
 
47
74
  export function Layout({ children }: { children: React.ReactNode }) {
48
75
  return (
@@ -54,9 +81,15 @@ export function Layout({ children }: { children: React.ReactNode }) {
54
81
  content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
55
82
  />
56
83
  <script
84
+ data-agent-native-theme-init
57
85
  suppressHydrationWarning
58
86
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
59
87
  />
88
+ <script
89
+ data-agent-native-locale-init
90
+ suppressHydrationWarning
91
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
92
+ />
60
93
  <link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
61
94
  <link rel="manifest" href={appPath("/manifest.json")} />
62
95
  <meta name="theme-color" content="#06B6D4" />
@@ -177,6 +210,7 @@ function OpenLinkInterceptor() {
177
210
 
178
211
  function ThemeToggleItem() {
179
212
  const { resolvedTheme, setTheme } = useTheme();
213
+ const t = useT();
180
214
  const isDark = resolvedTheme === "dark";
181
215
  return (
182
216
  <CommandMenu.Item
@@ -184,34 +218,49 @@ function ThemeToggleItem() {
184
218
  keywords={["theme", "dark", "light", "mode"]}
185
219
  >
186
220
  {isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
187
- Toggle theme
221
+ {t("root.toggleTheme")}
188
222
  </CommandMenu.Item>
189
223
  );
190
224
  }
191
225
 
226
+ function FormsCommandMenu({
227
+ open,
228
+ onOpenChange,
229
+ }: {
230
+ open: boolean;
231
+ onOpenChange: (open: boolean) => void;
232
+ }) {
233
+ const t = useT();
234
+ return (
235
+ <CommandMenu
236
+ open={open}
237
+ onOpenChange={onOpenChange}
238
+ changelog={changelog}
239
+ changelogKey="forms"
240
+ >
241
+ <CommandMenu.Group heading={t("root.commandForms")}>
242
+ <CommandMenu.Item onSelect={() => {}}>
243
+ {t("root.searchForms")}
244
+ </CommandMenu.Item>
245
+ </CommandMenu.Group>
246
+ <CommandMenu.Group heading={t("root.appearance")}>
247
+ <ThemeToggleItem />
248
+ </CommandMenu.Group>
249
+ </CommandMenu>
250
+ );
251
+ }
252
+
192
253
  export default function Root() {
193
254
  const [queryClient] = useState(() => createAgentNativeQueryClient());
194
255
  const [cmdkOpen, setCmdkOpen] = useState(false);
195
256
  useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
196
257
  return (
197
- <AppProviders queryClient={queryClient}>
258
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
198
259
  <DbSyncSetup />
199
260
  <NavigationStateSync />
200
261
  <UrlStateSync />
201
262
  <OpenLinkInterceptor />
202
- <CommandMenu
203
- open={cmdkOpen}
204
- onOpenChange={setCmdkOpen}
205
- changelog={changelog}
206
- changelogKey="forms"
207
- >
208
- <CommandMenu.Group heading="Forms">
209
- <CommandMenu.Item onSelect={() => {}}>Search forms</CommandMenu.Item>
210
- </CommandMenu.Group>
211
- <CommandMenu.Group heading="Appearance">
212
- <ThemeToggleItem />
213
- </CommandMenu.Group>
214
- </CommandMenu>
263
+ <FormsCommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen} />
215
264
  <Outlet />
216
265
  </AppProviders>
217
266
  );
@@ -0,0 +1,85 @@
1
+ import { Link } from "react-router";
2
+ import {
3
+ ChangelogSettingsCard,
4
+ LanguagePicker,
5
+ openAgentSettings,
6
+ useT,
7
+ } from "@agent-native/core/client";
8
+ import { useSetPageTitle } from "@/components/layout/HeaderActions";
9
+ import { Button } from "@/components/ui/button";
10
+ import {
11
+ Card,
12
+ CardContent,
13
+ CardDescription,
14
+ CardHeader,
15
+ CardTitle,
16
+ } from "@/components/ui/card";
17
+ import { Label } from "@/components/ui/label";
18
+ import changelog from "../../CHANGELOG.md?raw";
19
+
20
+ export function meta() {
21
+ return [{ title: "Settings - Forms" }];
22
+ }
23
+
24
+ export default function SettingsRoute() {
25
+ const t = useT();
26
+ useSetPageTitle(t("settings.title"));
27
+
28
+ return (
29
+ <main className="mx-auto w-full max-w-3xl space-y-6 px-4 py-6 sm:px-6 sm:py-10">
30
+ <div className="space-y-1">
31
+ <h1 className="text-2xl font-semibold tracking-tight">
32
+ {t("settings.title")}
33
+ </h1>
34
+ <p className="text-sm leading-6 text-muted-foreground">
35
+ {t("settings.description")}
36
+ </p>
37
+ </div>
38
+
39
+ <Card>
40
+ <CardHeader>
41
+ <CardTitle className="text-base">
42
+ {t("settings.languageTitle")}
43
+ </CardTitle>
44
+ <CardDescription>{t("settings.languageDescription")}</CardDescription>
45
+ </CardHeader>
46
+ <CardContent className="max-w-xs space-y-1.5">
47
+ <Label>{t("settings.languageLabel")}</Label>
48
+ <LanguagePicker label={t("settings.languageLabel")} />
49
+ </CardContent>
50
+ </Card>
51
+
52
+ <Card>
53
+ <CardHeader>
54
+ <CardTitle className="text-base">
55
+ {t("settings.workspaceTitle")}
56
+ </CardTitle>
57
+ <CardDescription>
58
+ {t("settings.workspaceDescription")}
59
+ </CardDescription>
60
+ </CardHeader>
61
+ <CardContent>
62
+ <Button variant="outline" asChild>
63
+ <Link to="/team">{t("settings.openTeamSettings")}</Link>
64
+ </Button>
65
+ </CardContent>
66
+ </Card>
67
+
68
+ <Card>
69
+ <CardHeader>
70
+ <CardTitle className="text-base">
71
+ {t("settings.agentTitle")}
72
+ </CardTitle>
73
+ <CardDescription>{t("settings.agentDescription")}</CardDescription>
74
+ </CardHeader>
75
+ <CardContent>
76
+ <Button variant="outline" onClick={() => openAgentSettings()}>
77
+ {t("settings.openAgentSettings")}
78
+ </Button>
79
+ </CardContent>
80
+ </Card>
81
+
82
+ <ChangelogSettingsCard markdown={changelog} />
83
+ </main>
84
+ );
85
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-06-24
4
+ ---
5
+
6
+ A new Settings page gives quick access to language, workspace, and agent preferences.
@@ -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.
@@ -12,6 +12,7 @@ import {
12
12
  FeedbackButton,
13
13
  agentNativePath,
14
14
  appPath,
15
+ useT,
15
16
  } from "@agent-native/core/client";
16
17
  import { ExtensionsSidebarSection } from "@agent-native/core/client/extensions";
17
18
  import { OrgSwitcher } from "@agent-native/core/client/org";
@@ -36,15 +37,16 @@ import { Header } from "./Header";
36
37
  import { HeaderActionsProvider } from "./HeaderActions";
37
38
 
38
39
  const navItems = [
39
- { icon: IconFlame, label: "Entry", href: "/" },
40
- { icon: IconChartBar, label: "Analytics", href: "/analytics" },
41
- { icon: IconSettings, label: "Settings", href: "/settings" },
40
+ { icon: IconFlame, labelKey: "navigation.entry", href: "/" },
41
+ { icon: IconChartBar, labelKey: "navigation.analytics", href: "/analytics" },
42
+ { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
42
43
  ];
43
44
 
44
45
  export function AppLayout({ children }: { children: React.ReactNode }) {
45
46
  const location = useLocation();
46
47
  const navigate = useNavigate();
47
48
  const queryClient = useQueryClient();
49
+ const t = useT();
48
50
 
49
51
  const [sidebarOpen, setSidebarOpen] = useState(false);
50
52
  const [desktopSidebarCollapsed, setDesktopSidebarCollapsed] = useState(() => {
@@ -53,6 +55,7 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
53
55
  });
54
56
 
55
57
  const isAnalytics = location.pathname === "/analytics";
58
+ const isSettings = location.pathname.startsWith("/settings");
56
59
 
57
60
  // Auto-close sidebar on route change (mobile)
58
61
  useEffect(() => {
@@ -68,12 +71,12 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
68
71
 
69
72
  // Navigation state sync - write current view to application state
70
73
  useEffect(() => {
71
- const view = isAnalytics ? "analytics" : "entry";
74
+ const view = isSettings ? "settings" : isAnalytics ? "analytics" : "entry";
72
75
  apiFetch(agentNativePath("/_agent-native/application-state/navigation"), {
73
76
  method: "PUT",
74
77
  body: JSON.stringify({ view, path: location.pathname }),
75
78
  }).catch(() => {});
76
- }, [location.pathname, isAnalytics]);
79
+ }, [location.pathname, isAnalytics, isSettings]);
77
80
 
78
81
  // Poll for navigate commands from the agent
79
82
  const { data: navCommand } = useQuery({
@@ -102,6 +105,8 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
102
105
  : commandValue;
103
106
  if (cmd.view === "analytics") {
104
107
  navigate("/analytics");
108
+ } else if (cmd.view === "settings") {
109
+ navigate("/settings");
105
110
  } else if (cmd.view === "entry") {
106
111
  navigate("/");
107
112
  }
@@ -119,11 +124,11 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
119
124
  position="right"
120
125
  defaultOpen={false}
121
126
  animateMobile
122
- emptyStateText="Just tell me what you ate — I'll estimate the macros"
127
+ emptyStateText={t("agent.emptyState")}
123
128
  suggestions={[
124
- "Chicken burrito bowl for lunch",
125
- "What are my macros today?",
126
- "I ran 30 minutes this morning",
129
+ t("agent.suggestionLunch"),
130
+ t("agent.suggestionMacros"),
131
+ t("agent.suggestionRun"),
127
132
  ]}
128
133
  >
129
134
  <div className="flex flex-1 overflow-hidden">
@@ -146,7 +151,9 @@ export function AppLayout({ children }: { children: React.ReactNode }) {
146
151
  {/* Mobile sidebar sheet */}
147
152
  <Sheet open={sidebarOpen} onOpenChange={setSidebarOpen}>
148
153
  <SheetContent side="left" className="w-56 p-0">
149
- <SheetTitle className="sr-only">Navigation</SheetTitle>
154
+ <SheetTitle className="sr-only">
155
+ {t("sidebar.navigation")}
156
+ </SheetTitle>
150
157
  <SidebarContent pathname={location.pathname} />
151
158
  </SheetContent>
152
159
  </Sheet>
@@ -172,6 +179,7 @@ function SidebarContent({
172
179
  collapsed?: boolean;
173
180
  onToggleCollapsed?: () => void;
174
181
  }) {
182
+ const t = useT();
175
183
  const ToggleIcon = collapsed
176
184
  ? IconLayoutSidebarLeftExpand
177
185
  : IconLayoutSidebarLeftCollapse;
@@ -199,7 +207,7 @@ function SidebarContent({
199
207
  className="hidden h-4 w-auto shrink-0 dark:block"
200
208
  />
201
209
  <span className="font-logo truncate text-sm font-bold tracking-tight text-foreground">
202
- Macros
210
+ {t("navigation.brand")}
203
211
  </span>
204
212
  </div>
205
213
  )}
@@ -211,7 +219,9 @@ function SidebarContent({
211
219
  variant="ghost"
212
220
  size="icon"
213
221
  aria-label={
214
- collapsed ? "Expand left sidebar" : "Collapse left sidebar"
222
+ collapsed
223
+ ? t("sidebar.expandLeftSidebar")
224
+ : t("sidebar.collapseLeftSidebar")
215
225
  }
216
226
  className={cn(
217
227
  "hidden h-8 w-8 text-muted-foreground hover:text-foreground md:inline-flex",
@@ -223,7 +233,7 @@ function SidebarContent({
223
233
  </Button>
224
234
  </TooltipTrigger>
225
235
  <TooltipContent side="right">
226
- {collapsed ? "Expand sidebar" : "Collapse sidebar"}
236
+ {collapsed ? t("sidebar.expand") : t("sidebar.collapse")}
227
237
  </TooltipContent>
228
238
  </Tooltip>
229
239
  )}
@@ -232,6 +242,7 @@ function SidebarContent({
232
242
  <nav className="flex-1 space-y-1 overflow-y-auto px-2 py-2">
233
243
  {navItems.map((item) => {
234
244
  const Icon = item.icon;
245
+ const label = t(item.labelKey);
235
246
  const isActive =
236
247
  item.href === "/"
237
248
  ? pathname === "/" || pathname === "/entry"
@@ -240,7 +251,7 @@ function SidebarContent({
240
251
  <Link
241
252
  key={item.href}
242
253
  to={item.href}
243
- aria-label={collapsed ? item.label : undefined}
254
+ aria-label={collapsed ? label : undefined}
244
255
  className={cn(
245
256
  "flex h-9 items-center rounded-lg text-sm transition-colors",
246
257
  collapsed ? "justify-center px-0" : "gap-3 px-3",
@@ -250,13 +261,13 @@ function SidebarContent({
250
261
  )}
251
262
  >
252
263
  <Icon className="h-4 w-4 shrink-0" />
253
- {!collapsed && item.label}
264
+ {!collapsed && label}
254
265
  </Link>
255
266
  );
256
267
  return collapsed ? (
257
268
  <Tooltip key={item.href}>
258
269
  <TooltipTrigger asChild>{link}</TooltipTrigger>
259
- <TooltipContent side="right">{item.label}</TooltipContent>
270
+ <TooltipContent side="right">{label}</TooltipContent>
260
271
  </Tooltip>
261
272
  ) : (
262
273
  link
@@ -282,6 +293,7 @@ function SidebarContent({
282
293
  }
283
294
 
284
295
  function SyncIndicator({ sidebarCollapsed }: { sidebarCollapsed: boolean }) {
296
+ const t = useT();
285
297
  const refetchingActions = useIsFetching({
286
298
  predicate: (query) =>
287
299
  query.queryKey[0] === "action" && query.state.dataUpdatedAt > 0,
@@ -326,7 +338,7 @@ function SyncIndicator({ sidebarCollapsed }: { sidebarCollapsed: boolean }) {
326
338
  )}
327
339
  >
328
340
  <IconLoader2 className="h-3.5 w-3.5 animate-spin" />
329
- Syncing…
341
+ {t("sidebar.syncing")}
330
342
  </div>
331
343
  );
332
344
  }
@@ -1,20 +1,24 @@
1
1
  import { useLocation } from "react-router";
2
2
  import { IconMenu2 } from "@tabler/icons-react";
3
- import { AgentToggleButton } from "@agent-native/core/client";
3
+ import {
4
+ AgentToggleButton,
5
+ LanguagePicker,
6
+ useT,
7
+ } from "@agent-native/core/client";
4
8
  import { useHeaderTitle, useHeaderActions } from "./HeaderActions";
5
9
 
6
10
  const pageTitles: Record<string, string> = {
7
- "/": "Entry",
8
- "/entry": "Entry",
9
- "/analytics": "Analytics",
10
- "/settings": "Settings",
11
- "/extensions": "Extensions",
11
+ "/": "header.entry",
12
+ "/entry": "header.entry",
13
+ "/analytics": "header.analytics",
14
+ "/settings": "header.settings",
15
+ "/extensions": "header.extensions",
12
16
  };
13
17
 
14
18
  function resolveTitle(pathname: string): string {
15
19
  if (pageTitles[pathname]) return pageTitles[pathname];
16
- if (pathname.startsWith("/extensions")) return "Extensions";
17
- return "Macros";
20
+ if (pathname.startsWith("/extensions")) return "header.extensions";
21
+ return "header.macros";
18
22
  }
19
23
 
20
24
  interface HeaderProps {
@@ -25,25 +29,27 @@ export function Header({ onOpenSidebar }: HeaderProps) {
25
29
  const location = useLocation();
26
30
  const title = useHeaderTitle();
27
31
  const actions = useHeaderActions();
32
+ const t = useT();
28
33
 
29
34
  return (
30
35
  <header className="flex h-12 shrink-0 items-center gap-2 border-b border-border bg-background px-3 md:px-4">
31
36
  <button
32
37
  onClick={onOpenSidebar}
33
38
  className="flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground md:hidden"
34
- aria-label="Open menu"
39
+ aria-label={t("sidebar.openMenu")}
35
40
  >
36
41
  <IconMenu2 className="h-5 w-5" />
37
42
  </button>
38
43
  <div className="flex min-w-0 flex-1 items-center gap-3">
39
44
  {title ?? (
40
45
  <h1 className="truncate text-sm font-semibold text-foreground">
41
- {resolveTitle(location.pathname)}
46
+ {t(resolveTitle(location.pathname))}
42
47
  </h1>
43
48
  )}
44
49
  </div>
45
50
  <div className="flex shrink-0 items-center gap-2">
46
51
  {actions}
52
+ <LanguagePicker variant="icon" />
47
53
  <AgentToggleButton />
48
54
  </div>
49
55
  </header>