@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
@@ -24,24 +24,25 @@ Every skill's frontmatter `name` and `description` are always injected into the
24
24
 
25
25
  These are the skills bundled with the **default template**. The exact set available in any given app depends on the template you scaffolded from — check that template's `.agents/skills/` directory for what it actually ships.
26
26
 
27
- | Skill | When to use |
28
- | --------------------- | ------------------------------------------------------- |
29
- | `storing-data` | Adding data models, reading/writing config or state |
30
- | `real-time-sync` | Wiring polling sync, debugging UI not updating |
31
- | `delegate-to-agent` | Delegating AI work from UI or actions to the agent |
32
- | `actions` | Creating or running agent actions |
33
- | `self-modifying-code` | Editing app source, components, or styles |
34
- | `create-skill` | Adding new skills for the agent |
35
- | `capture-learnings` | Recording corrections and patterns |
36
- | `frontend-design` | Building or styling any web UI, components, or pages |
37
- | `adding-a-feature` | The four-area checklist: UI, actions, skills, app-state |
38
- | `shadcn-ui` | Using shadcn/ui primitives and components |
39
- | `security` | Auth, access control, and secret handling |
40
- | `real-time-collab` | Multi-user collaborative editing |
41
- | `agent-engines` | Swapping or configuring the underlying agent engine |
42
- | `notifications` | In-app and push notification patterns |
43
- | `progress` | Tracking and surfacing background task progress |
44
- | `inline-embeds` | Embedding apps or iframes inside the agent chat |
27
+ | Skill | When to use |
28
+ | ---------------------- | ------------------------------------------------------------------ |
29
+ | `storing-data` | Adding data models, reading/writing config or state |
30
+ | `real-time-sync` | Wiring polling sync, debugging UI not updating |
31
+ | `delegate-to-agent` | Delegating AI work from UI or actions to the agent |
32
+ | `actions` | Creating or running agent actions |
33
+ | `self-modifying-code` | Editing app source, components, or styles |
34
+ | `create-skill` | Adding new skills for the agent |
35
+ | `capture-learnings` | Recording corrections and patterns |
36
+ | `frontend-design` | Building or styling any web UI, components, or pages |
37
+ | `adding-a-feature` | The four-area checklist: UI, actions, skills, app-state |
38
+ | `internationalization` | Updating localized UI copy, language catalogs, and RTL-safe styles |
39
+ | `shadcn-ui` | Using shadcn/ui primitives and components |
40
+ | `security` | Auth, access control, and secret handling |
41
+ | `real-time-collab` | Multi-user collaborative editing |
42
+ | `agent-engines` | Swapping or configuring the underlying agent engine |
43
+ | `notifications` | In-app and push notification patterns |
44
+ | `progress` | Tracking and surfacing background task progress |
45
+ | `inline-embeds` | Embedding apps or iframes inside the agent chat |
45
46
 
46
47
  `context-awareness` and `a2a-protocol` are framework-level skills available in the `.agents/skills/` directory at the repo root — see each template's own `.agents/skills/` for what it inherits.
47
48
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.75.5",
3
+ "version": "0.76.1",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -69,6 +69,7 @@
69
69
  "./client/route-state": "./dist/client/route-state.js",
70
70
  "./client/observability": "./dist/client/observability/index.js",
71
71
  "./client/onboarding": "./dist/client/onboarding/index.js",
72
+ "./client/i18n": "./dist/client/i18n.js",
72
73
  "./client/settings/useBuilderStatus": "./dist/client/settings/useBuilderStatus.js",
73
74
  "./embedding": "./dist/embedding/index.js",
74
75
  "./embedding/agent": "./dist/embedding/agent.js",
@@ -80,6 +81,9 @@
80
81
  "./scripts": "./dist/scripts/index.js",
81
82
  "./application-state": "./dist/application-state/index.js",
82
83
  "./settings": "./dist/settings/index.js",
84
+ "./localization": "./dist/localization/index.js",
85
+ "./localization/actions/get-localization-preference": "./dist/localization/actions/get-localization-preference.js",
86
+ "./localization/actions/set-localization-preference": "./dist/localization/actions/set-localization-preference.js",
83
87
  "./credentials": "./dist/credentials/index.js",
84
88
  "./event-bus": "./dist/event-bus/index.js",
85
89
  "./fetch-tool": "./dist/extensions/fetch-tool.js",
@@ -235,6 +239,7 @@
235
239
  "fzstd": "^0.1.1",
236
240
  "h3": "^2.0.1-rc.20",
237
241
  "highlight.js": "^11.11.1",
242
+ "i18next": "26.3.1",
238
243
  "isbot": "^5",
239
244
  "jiti": "^2.6.1",
240
245
  "jose": "^6.2.2",
@@ -248,6 +253,7 @@
248
253
  "p-limit": "^7.3.0",
249
254
  "pako": "^2.1.0",
250
255
  "prettier": "^3.8.3",
256
+ "react-i18next": "17.0.8",
251
257
  "react-markdown": "^10.1.0",
252
258
  "recharts": "^3.8.1",
253
259
  "remark-gfm": "^4.0.1",
@@ -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
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: internationalization
3
+ description: >-
4
+ How to add or edit localized UI copy in agent-native apps. Use when adding,
5
+ removing, or changing user-visible interface text, prompts, toasts, labels,
6
+ empty states, or date/number/list formatting.
7
+ scope: dev
8
+ metadata:
9
+ internal: true
10
+ ---
11
+
12
+ # Internationalization
13
+
14
+ ## Rule
15
+
16
+ Visible framework/template UI copy belongs in the app's i18n catalog, not
17
+ inline in components. When you add or edit UI text, update the English source
18
+ catalog first, update existing locale catalogs, and run the i18n guard.
19
+
20
+ ## Catalogs
21
+
22
+ Templates use `app/i18n/`:
23
+
24
+ - `en-US.ts` is the canonical source tree and fallback.
25
+ - Other locale files keep the same non-plural keys and the same placeholders.
26
+ - `index.ts` exports an `AgentNativeI18nCatalog` with English bundled and
27
+ non-English catalogs loaded by dynamic import.
28
+
29
+ Use BCP-47 filenames from the supported set: `en-US`, `zh-CN`, `es-ES`,
30
+ `fr-FR`, `de-DE`, `ja-JP`, `ko-KR`, `pt-BR`, `hi-IN`, `ar-SA`.
31
+
32
+ ## UI Pattern
33
+
34
+ - Wrap apps with `AppProviders i18n={{ catalog: i18nCatalog }}`.
35
+ - Read strings with `useT()` and keep keys stable.
36
+ - Sidebar apps should expose a `/settings` route in the app sidebar. Put
37
+ `<LanguagePicker />` in that settings page, usually in a Language or General
38
+ section, and keep the header language icon only as a quick-access shortcut.
39
+ - Settings pages should include an "Agent settings" row/card that calls
40
+ `openAgentSettings()` from `@agent-native/core/client` to open the right
41
+ agent sidebar's Settings tab. Localize the title, description, and button.
42
+ - Use `useFormatters()` for dates, numbers, relative time, and lists instead
43
+ of embedding formatted values in translation strings.
44
+ - Do not translate stable identifiers: action names, route names, enum values,
45
+ app-state keys, database values, protocol fields, env var names, or provider
46
+ names.
47
+
48
+ ## Plurals And Placeholders
49
+
50
+ Plural strings use i18next/CLDR suffixes. Do not force every locale to copy
51
+ English plural categories:
52
+
53
+ - English uses `_one` and `_other`.
54
+ - Chinese and Japanese usually use `_other`.
55
+ - Arabic uses `_zero`, `_one`, `_two`, `_few`, `_many`, and `_other`.
56
+
57
+ Keep interpolation placeholders identical across locales, such as
58
+ `{{count}}`, `{{name}}`, or ICU-style `{count}` arguments.
59
+
60
+ ## RTL
61
+
62
+ New UI should be RTL-safe. Prefer logical CSS utilities/properties such as
63
+ `ms-*`, `me-*`, `ps-*`, `pe-*`, `start-*`, `end-*`, `text-start`, and
64
+ `text-end` when direction matters. Avoid hardcoded left/right positioning for
65
+ new localized UI unless it is genuinely physical.
66
+
67
+ ## Verification
68
+
69
+ Run:
70
+
71
+ ```bash
72
+ pnpm guard:i18n-catalogs
73
+ ```
74
+
75
+ For broader changes, also run the affected template tests and `pnpm typecheck`.
76
+ Machine translation is only a starting point; high-visibility strings need
77
+ human review.
@@ -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
@@ -143,21 +143,22 @@ repackage, or proxy an action.
143
143
 
144
144
  Skills in `.agents/skills/` provide detailed guidance for each architectural rule. Read them before making changes.
145
145
 
146
- | Skill | When to read |
147
- | --------------------- | --------------------------------------------------------------------------------- |
148
- | `agent-native-docs` | Before using advanced Agent Native framework APIs or generated-app features |
149
- | `adding-a-feature` | **Read first when adding ANY new feature** — the four-area parity checklist |
150
- | `real-time-sync` | Before wiring data fetching for anything the agent can mutate (must auto-refresh) |
151
- | `storing-data` | Before storing or reading any app state |
152
- | `delegate-to-agent` | Before adding LLM calls or AI delegation |
153
- | `actions` | Before creating or modifying actions |
154
- | `self-modifying-code` | Before editing source, components, or styles |
155
- | `capture-learnings` | Before recording user preferences or corrections |
156
- | `frontend-design` | Before building or restyling any UI component, page, or layout |
157
- | `shadcn-ui` | Before adding, updating, or debugging shadcn/ui components |
158
- | `agent-engines` | Before switching LLM providers or registering a custom engine |
159
- | `notifications` | Before surfacing alerts/progress to the user or adding channels |
160
- | `progress` | Before running any task that takes more than a few seconds |
146
+ | Skill | When to read |
147
+ | ---------------------- | --------------------------------------------------------------------------------- |
148
+ | `agent-native-docs` | Before using advanced Agent Native framework APIs or generated-app features |
149
+ | `adding-a-feature` | **Read first when adding ANY new feature** — the four-area parity checklist |
150
+ | `real-time-sync` | Before wiring data fetching for anything the agent can mutate (must auto-refresh) |
151
+ | `storing-data` | Before storing or reading any app state |
152
+ | `internationalization` | Before adding or editing visible UI copy, prompts, toasts, labels, or formatting |
153
+ | `delegate-to-agent` | Before adding LLM calls or AI delegation |
154
+ | `actions` | Before creating or modifying actions |
155
+ | `self-modifying-code` | Before editing source, components, or styles |
156
+ | `capture-learnings` | Before recording user preferences or corrections |
157
+ | `frontend-design` | Before building or restyling any UI component, page, or layout |
158
+ | `shadcn-ui` | Before adding, updating, or debugging shadcn/ui components |
159
+ | `agent-engines` | Before switching LLM providers or registering a custom engine |
160
+ | `notifications` | Before surfacing alerts/progress to the user or adding channels |
161
+ | `progress` | Before running any task that takes more than a few seconds |
161
162
 
162
163
  ## When Adding Features
163
164
 
@@ -0,0 +1,29 @@
1
+ const messages = {
2
+ home: {
3
+ settingsTitle: "Settings",
4
+ settingsDescription: "Language and agent preferences",
5
+ title: "Your app is running",
6
+ intro: "Start building by editing",
7
+ actionCardTitle: "Action-backed data",
8
+ loadingAction: "Loading action result...",
9
+ docsTitle: "Documentation",
10
+ docsDescription: "Learn the framework",
11
+ themeTitle: "Theme",
12
+ themeDescription: "Toggle dark / light",
13
+ },
14
+ settings: {
15
+ title: "Settings",
16
+ description: "Language and workspace preferences for this app.",
17
+ languageTitle: "Language",
18
+ languageDescription:
19
+ "Choose the interface language. This preference is saved for your account.",
20
+ languageLabel: "Interface language",
21
+ agentTitle: "Agent settings",
22
+ agentDescription:
23
+ "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
24
+ openAgentSettings: "Open agent settings",
25
+ backHome: "Back to home",
26
+ },
27
+ };
28
+
29
+ export default messages;
@@ -0,0 +1,13 @@
1
+ import enUS from "./en-US";
2
+ import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
3
+
4
+ export const i18nCatalog = {
5
+ sourceLocale: "en-US",
6
+ messages: enUS,
7
+ loadMessages: async (locale) => {
8
+ switch (locale) {
9
+ default:
10
+ return null;
11
+ }
12
+ },
13
+ } satisfies AgentNativeI18nCatalog;
@@ -14,11 +14,13 @@ import { useDbSync } from "@agent-native/core/client";
14
14
  import {
15
15
  AppProviders,
16
16
  appPath,
17
+ getLocaleInitScript,
17
18
  getThemeInitScript,
18
19
  createAgentNativeQueryClient,
19
20
  } from "@agent-native/core/client";
20
21
  import { configureTracking } from "@agent-native/core/client";
21
22
  import { useNavigationState } from "./hooks/use-navigation-state";
23
+ import { i18nCatalog } from "./i18n";
22
24
  import { TAB_ID } from "./lib/tab-id";
23
25
  configureTracking({
24
26
  getDefaultProps: (_name, properties) => ({
@@ -29,6 +31,7 @@ configureTracking({
29
31
  import "./global.css";
30
32
 
31
33
  const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
34
+ const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
32
35
 
33
36
  function getHydrationStableThemeInitScript() {
34
37
  if (typeof document !== "undefined") {
@@ -40,7 +43,18 @@ function getHydrationStableThemeInitScript() {
40
43
  return getThemeInitScript();
41
44
  }
42
45
 
46
+ function getHydrationStableLocaleInitScript() {
47
+ if (typeof document !== "undefined") {
48
+ const existing = document.querySelector<HTMLScriptElement>(
49
+ LOCALE_INIT_SCRIPT_SELECTOR,
50
+ );
51
+ if (existing?.innerHTML) return existing.innerHTML;
52
+ }
53
+ return getLocaleInitScript();
54
+ }
55
+
43
56
  const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
57
+ const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
44
58
 
45
59
  export function Layout({ children }: { children: React.ReactNode }) {
46
60
  return (
@@ -56,6 +70,11 @@ export function Layout({ children }: { children: React.ReactNode }) {
56
70
  suppressHydrationWarning
57
71
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
58
72
  />
73
+ <script
74
+ data-agent-native-locale-init
75
+ suppressHydrationWarning
76
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
77
+ />
59
78
  <link rel="manifest" href={appPath("/manifest.json")} />
60
79
  <link rel="icon" type="image/svg+xml" href={appPath("/favicon.svg")} />
61
80
  <meta name="theme-color" content="#111111" />
@@ -88,7 +107,7 @@ function DbSyncSetup() {
88
107
  export default function Root() {
89
108
  const [queryClient] = useState(() => createAgentNativeQueryClient());
90
109
  return (
91
- <AppProviders queryClient={queryClient}>
110
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
92
111
  <DbSyncSetup />
93
112
  <Outlet />
94
113
  </AppProviders>
@@ -1,5 +1,6 @@
1
1
  import { useTheme } from "next-themes";
2
- import { useActionQuery } from "@agent-native/core/client";
2
+ import { Link } from "react-router";
3
+ import { useActionQuery, useT } from "@agent-native/core/client";
3
4
 
4
5
  export function meta() {
5
6
  return [{ title: "{{APP_TITLE}}" }];
@@ -7,6 +8,7 @@ export function meta() {
7
8
 
8
9
  export default function IndexPage() {
9
10
  const { resolvedTheme, setTheme } = useTheme();
11
+ const t = useT();
10
12
  const isDark = resolvedTheme === "dark";
11
13
  const { data } = useActionQuery("hello", { name: "{{APP_TITLE}}" });
12
14
 
@@ -15,10 +17,10 @@ export default function IndexPage() {
15
17
  <div className="max-w-md w-full space-y-8 text-center">
16
18
  <div className="space-y-3">
17
19
  <h1 className="text-2xl font-semibold tracking-tight text-foreground">
18
- Your app is running
20
+ {t("home.title")}
19
21
  </h1>
20
22
  <p className="text-[14px] text-muted-foreground leading-relaxed">
21
- Start building by editing{" "}
23
+ {t("home.intro")}{" "}
22
24
  <code className="text-[13px] bg-muted px-1.5 py-0.5 rounded font-mono">
23
25
  app/routes/_index.tsx
24
26
  </code>
@@ -29,10 +31,10 @@ export default function IndexPage() {
29
31
 
30
32
  <div className="rounded-lg border border-border/50 px-4 py-3 text-left">
31
33
  <p className="text-[13px] font-medium text-foreground">
32
- Action-backed data
34
+ {t("home.actionCardTitle")}
33
35
  </p>
34
36
  <p className="text-[12px] text-muted-foreground mt-0.5">
35
- {data?.message ?? "Loading action result..."}
37
+ {data?.message ?? t("home.loadingAction")}
36
38
  </p>
37
39
  </div>
38
40
 
@@ -44,21 +46,34 @@ export default function IndexPage() {
44
46
  className="group rounded-lg border border-border/50 px-4 py-3 hover:bg-accent/50 transition-colors"
45
47
  >
46
48
  <p className="text-[13px] font-medium text-foreground">
47
- Documentation
49
+ {t("home.docsTitle")}
48
50
  </p>
49
51
  <p className="text-[12px] text-muted-foreground mt-0.5">
50
- Learn the framework
52
+ {t("home.docsDescription")}
51
53
  </p>
52
54
  </a>
53
55
  <button
54
56
  onClick={() => setTheme(isDark ? "light" : "dark")}
55
57
  className="rounded-lg border border-border/50 px-4 py-3 hover:bg-accent/50 transition-colors text-left"
56
58
  >
57
- <p className="text-[13px] font-medium text-foreground">Theme</p>
59
+ <p className="text-[13px] font-medium text-foreground">
60
+ {t("home.themeTitle")}
61
+ </p>
58
62
  <p className="text-[12px] text-muted-foreground mt-0.5">
59
- Toggle dark / light
63
+ {t("home.themeDescription")}
60
64
  </p>
61
65
  </button>
66
+ <Link
67
+ to="/settings"
68
+ className="group rounded-lg border border-border/50 px-4 py-3 hover:bg-accent/50 transition-colors"
69
+ >
70
+ <p className="text-[13px] font-medium text-foreground">
71
+ {t("home.settingsTitle")}
72
+ </p>
73
+ <p className="text-[12px] text-muted-foreground mt-0.5">
74
+ {t("home.settingsDescription")}
75
+ </p>
76
+ </Link>
62
77
  </div>
63
78
  </div>
64
79
  </div>
@@ -0,0 +1,67 @@
1
+ import { Link } from "react-router";
2
+ import {
3
+ LanguagePicker,
4
+ openAgentSettings,
5
+ useT,
6
+ } from "@agent-native/core/client";
7
+
8
+ export function meta() {
9
+ return [{ title: "Settings - {{APP_TITLE}}" }];
10
+ }
11
+
12
+ export default function SettingsPage() {
13
+ const t = useT();
14
+
15
+ return (
16
+ <main className="min-h-screen bg-background px-6 py-10">
17
+ <div className="mx-auto w-full max-w-2xl space-y-6">
18
+ <div className="space-y-2">
19
+ <Link
20
+ to="/"
21
+ className="text-[13px] text-muted-foreground hover:text-foreground"
22
+ >
23
+ {t("settings.backHome")}
24
+ </Link>
25
+ <h1 className="text-2xl font-semibold tracking-tight text-foreground">
26
+ {t("settings.title")}
27
+ </h1>
28
+ <p className="text-[14px] leading-relaxed text-muted-foreground">
29
+ {t("settings.description")}
30
+ </p>
31
+ </div>
32
+
33
+ <section className="rounded-lg border border-border/50 bg-card px-4 py-4">
34
+ <div className="space-y-1">
35
+ <h2 className="text-[15px] font-semibold text-foreground">
36
+ {t("settings.languageTitle")}
37
+ </h2>
38
+ <p className="text-[13px] leading-relaxed text-muted-foreground">
39
+ {t("settings.languageDescription")}
40
+ </p>
41
+ </div>
42
+ <div className="mt-4 max-w-xs">
43
+ <LanguagePicker label={t("settings.languageLabel")} />
44
+ </div>
45
+ </section>
46
+
47
+ <section className="rounded-lg border border-border/50 bg-card px-4 py-4">
48
+ <div className="space-y-1">
49
+ <h2 className="text-[15px] font-semibold text-foreground">
50
+ {t("settings.agentTitle")}
51
+ </h2>
52
+ <p className="text-[13px] leading-relaxed text-muted-foreground">
53
+ {t("settings.agentDescription")}
54
+ </p>
55
+ </div>
56
+ <button
57
+ type="button"
58
+ className="mt-4 rounded-md border border-border bg-background px-3 py-2 text-[13px] font-medium text-foreground transition-colors hover:bg-accent/50"
59
+ onClick={() => openAgentSettings()}
60
+ >
61
+ {t("settings.openAgentSettings")}
62
+ </button>
63
+ </section>
64
+ </div>
65
+ </main>
66
+ );
67
+ }
@@ -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
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: internationalization
3
+ description: >-
4
+ How to add or edit localized UI copy in agent-native apps. Use when adding,
5
+ removing, or changing user-visible interface text, prompts, toasts, labels,
6
+ empty states, or date/number/list formatting.
7
+ scope: dev
8
+ metadata:
9
+ internal: true
10
+ ---
11
+
12
+ # Internationalization
13
+
14
+ ## Rule
15
+
16
+ Visible framework/template UI copy belongs in the app's i18n catalog, not
17
+ inline in components. When you add or edit UI text, update the English source
18
+ catalog first, update existing locale catalogs, and run the i18n guard.
19
+
20
+ ## Catalogs
21
+
22
+ Templates use `app/i18n/`:
23
+
24
+ - `en-US.ts` is the canonical source tree and fallback.
25
+ - Other locale files keep the same non-plural keys and the same placeholders.
26
+ - `index.ts` exports an `AgentNativeI18nCatalog` with English bundled and
27
+ non-English catalogs loaded by dynamic import.
28
+
29
+ Use BCP-47 filenames from the supported set: `en-US`, `zh-CN`, `es-ES`,
30
+ `fr-FR`, `de-DE`, `ja-JP`, `ko-KR`, `pt-BR`, `hi-IN`, `ar-SA`.
31
+
32
+ ## UI Pattern
33
+
34
+ - Wrap apps with `AppProviders i18n={{ catalog: i18nCatalog }}`.
35
+ - Read strings with `useT()` and keep keys stable.
36
+ - Sidebar apps should expose a `/settings` route in the app sidebar. Put
37
+ `<LanguagePicker />` in that settings page, usually in a Language or General
38
+ section, and keep the header language icon only as a quick-access shortcut.
39
+ - Settings pages should include an "Agent settings" row/card that calls
40
+ `openAgentSettings()` from `@agent-native/core/client` to open the right
41
+ agent sidebar's Settings tab. Localize the title, description, and button.
42
+ - Use `useFormatters()` for dates, numbers, relative time, and lists instead
43
+ of embedding formatted values in translation strings.
44
+ - Do not translate stable identifiers: action names, route names, enum values,
45
+ app-state keys, database values, protocol fields, env var names, or provider
46
+ names.
47
+
48
+ ## Plurals And Placeholders
49
+
50
+ Plural strings use i18next/CLDR suffixes. Do not force every locale to copy
51
+ English plural categories:
52
+
53
+ - English uses `_one` and `_other`.
54
+ - Chinese and Japanese usually use `_other`.
55
+ - Arabic uses `_zero`, `_one`, `_two`, `_few`, `_many`, and `_other`.
56
+
57
+ Keep interpolation placeholders identical across locales, such as
58
+ `{{count}}`, `{{name}}`, or ICU-style `{count}` arguments.
59
+
60
+ ## RTL
61
+
62
+ New UI should be RTL-safe. Prefer logical CSS utilities/properties such as
63
+ `ms-*`, `me-*`, `ps-*`, `pe-*`, `start-*`, `end-*`, `text-start`, and
64
+ `text-end` when direction matters. Avoid hardcoded left/right positioning for
65
+ new localized UI unless it is genuinely physical.
66
+
67
+ ## Verification
68
+
69
+ Run:
70
+
71
+ ```bash
72
+ pnpm guard:i18n-catalogs
73
+ ```
74
+
75
+ For broader changes, also run the affected template tests and `pnpm typecheck`.
76
+ Machine translation is only a starting point; high-visibility strings need
77
+ human review.
@@ -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