@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,267 @@
1
+ import type { LocaleCode } from "@agent-native/core/client";
2
+
3
+ const enUS = {
4
+ root: {
5
+ commandActions: "Actions",
6
+ commandSearch: "Search",
7
+ commandAppearance: "Appearance",
8
+ toggleTheme: "Toggle theme",
9
+ },
10
+ settings: {
11
+ title: "Settings",
12
+ description: "Language, workspace, resource, and agent preferences.",
13
+ languageTitle: "Language",
14
+ languageDescription:
15
+ "Choose the interface language. This preference is saved for your account.",
16
+ languageLabel: "Interface language",
17
+ workspaceTitle: "Workspace",
18
+ workspaceDescription:
19
+ "Manage team access and shared workspace resources for Dispatch.",
20
+ openTeamSettings: "Open team settings",
21
+ openResourceSettings: "Open resource settings",
22
+ agentTitle: "Agent settings",
23
+ agentDescription:
24
+ "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
25
+ openAgentSettings: "Open agent settings",
26
+ },
27
+ };
28
+
29
+ type Messages = typeof enUS;
30
+ type PartialMessages = { [K in keyof Messages]?: Partial<Messages[K]> };
31
+
32
+ function mergeMessages(overrides: PartialMessages): Messages {
33
+ return {
34
+ root: { ...enUS.root, ...overrides.root },
35
+ settings: { ...enUS.settings, ...overrides.settings },
36
+ };
37
+ }
38
+
39
+ export const messagesByLocale = {
40
+ "en-US": enUS,
41
+ "zh-CN": mergeMessages({
42
+ root: {
43
+ commandActions: "操作",
44
+ commandSearch: "搜索",
45
+ commandAppearance: "外观",
46
+ toggleTheme: "切换主题",
47
+ },
48
+ settings: {
49
+ title: "设置",
50
+ description: "语言、工作区、资源和代理偏好设置。",
51
+ languageTitle: "语言",
52
+ languageDescription: "选择界面语言。此偏好会保存到你的账户。",
53
+ languageLabel: "界面语言",
54
+ workspaceTitle: "工作区",
55
+ workspaceDescription: "管理 Dispatch 的团队访问权限和共享工作区资源。",
56
+ openTeamSettings: "打开团队设置",
57
+ openResourceSettings: "打开资源设置",
58
+ agentTitle: "代理设置",
59
+ agentDescription:
60
+ "打开代理侧边栏设置,管理模型、API 密钥、自动化、语音和其他代理控制项。",
61
+ openAgentSettings: "打开代理设置",
62
+ },
63
+ }),
64
+ "es-ES": mergeMessages({
65
+ root: {
66
+ commandActions: "Acciones",
67
+ commandSearch: "Buscar",
68
+ commandAppearance: "Apariencia",
69
+ toggleTheme: "Cambiar tema",
70
+ },
71
+ settings: {
72
+ title: "Ajustes",
73
+ description:
74
+ "Preferencias de idioma, espacio de trabajo, recursos y agente.",
75
+ languageTitle: "Idioma",
76
+ languageDescription:
77
+ "Elige el idioma de la interfaz. Esta preferencia se guarda en tu cuenta.",
78
+ languageLabel: "Idioma de la interfaz",
79
+ workspaceTitle: "Espacio de trabajo",
80
+ workspaceDescription:
81
+ "Gestiona el acceso del equipo y los recursos compartidos de Dispatch.",
82
+ openTeamSettings: "Abrir ajustes del equipo",
83
+ openResourceSettings: "Abrir ajustes de recursos",
84
+ agentTitle: "Ajustes del agente",
85
+ agentDescription:
86
+ "Abre los ajustes del agente en la barra lateral para modelos, claves API, automatizaciones, voz y otros controles.",
87
+ openAgentSettings: "Abrir ajustes del agente",
88
+ },
89
+ }),
90
+ "fr-FR": mergeMessages({
91
+ root: {
92
+ commandActions: "Actions",
93
+ commandSearch: "Rechercher",
94
+ commandAppearance: "Apparence",
95
+ toggleTheme: "Changer de thème",
96
+ },
97
+ settings: {
98
+ title: "Paramètres",
99
+ description:
100
+ "Préférences de langue, d’espace de travail, de ressources et d’agent.",
101
+ languageTitle: "Langue",
102
+ languageDescription:
103
+ "Choisissez la langue de l’interface. Cette préférence est enregistrée dans votre compte.",
104
+ languageLabel: "Langue de l’interface",
105
+ workspaceTitle: "Espace de travail",
106
+ workspaceDescription:
107
+ "Gérez l’accès de l’équipe et les ressources partagées de Dispatch.",
108
+ openTeamSettings: "Ouvrir les paramètres d’équipe",
109
+ openResourceSettings: "Ouvrir les paramètres des ressources",
110
+ agentTitle: "Paramètres de l’agent",
111
+ agentDescription:
112
+ "Ouvrez les paramètres de l’agent dans la barre latérale pour les modèles, clés API, automatisations, voix et autres contrôles.",
113
+ openAgentSettings: "Ouvrir les paramètres de l’agent",
114
+ },
115
+ }),
116
+ "de-DE": mergeMessages({
117
+ root: {
118
+ commandActions: "Aktionen",
119
+ commandSearch: "Suchen",
120
+ commandAppearance: "Darstellung",
121
+ toggleTheme: "Theme wechseln",
122
+ },
123
+ settings: {
124
+ title: "Einstellungen",
125
+ description:
126
+ "Sprach-, Arbeitsbereichs-, Ressourcen- und Agent-Einstellungen.",
127
+ languageTitle: "Sprache",
128
+ languageDescription:
129
+ "Wähle die Sprache der Oberfläche. Diese Einstellung wird in deinem Konto gespeichert.",
130
+ languageLabel: "Oberflächensprache",
131
+ workspaceTitle: "Arbeitsbereich",
132
+ workspaceDescription:
133
+ "Verwalte Teamzugriff und gemeinsam genutzte Dispatch-Ressourcen.",
134
+ openTeamSettings: "Teameinstellungen öffnen",
135
+ openResourceSettings: "Ressourceneinstellungen öffnen",
136
+ agentTitle: "Agent-Einstellungen",
137
+ agentDescription:
138
+ "Öffne die Agent-Einstellungen in der Seitenleiste für Modell, API-Schlüssel, Automatisierungen, Sprache und weitere Steuerungen.",
139
+ openAgentSettings: "Agent-Einstellungen öffnen",
140
+ },
141
+ }),
142
+ "ja-JP": mergeMessages({
143
+ root: {
144
+ commandActions: "操作",
145
+ commandSearch: "検索",
146
+ commandAppearance: "外観",
147
+ toggleTheme: "テーマを切り替え",
148
+ },
149
+ settings: {
150
+ title: "設定",
151
+ description: "言語、ワークスペース、リソース、エージェント設定。",
152
+ languageTitle: "言語",
153
+ languageDescription:
154
+ "インターフェース言語を選択します。この設定はアカウントに保存されます。",
155
+ languageLabel: "インターフェース言語",
156
+ workspaceTitle: "ワークスペース",
157
+ workspaceDescription:
158
+ "Dispatch のチームアクセスと共有ワークスペースリソースを管理します。",
159
+ openTeamSettings: "チーム設定を開く",
160
+ openResourceSettings: "リソース設定を開く",
161
+ agentTitle: "エージェント設定",
162
+ agentDescription:
163
+ "右サイドバーのエージェント設定を開き、モデル、API キー、自動化、音声などを管理します。",
164
+ openAgentSettings: "エージェント設定を開く",
165
+ },
166
+ }),
167
+ "ko-KR": mergeMessages({
168
+ root: {
169
+ commandActions: "작업",
170
+ commandSearch: "검색",
171
+ commandAppearance: "모양",
172
+ toggleTheme: "테마 전환",
173
+ },
174
+ settings: {
175
+ title: "설정",
176
+ description: "언어, 워크스페이스, 리소스 및 에이전트 환경설정입니다.",
177
+ languageTitle: "언어",
178
+ languageDescription:
179
+ "인터페이스 언어를 선택하세요. 이 기본 설정은 계정에 저장됩니다.",
180
+ languageLabel: "인터페이스 언어",
181
+ workspaceTitle: "워크스페이스",
182
+ workspaceDescription:
183
+ "Dispatch의 팀 접근 권한과 공유 워크스페이스 리소스를 관리합니다.",
184
+ openTeamSettings: "팀 설정 열기",
185
+ openResourceSettings: "리소스 설정 열기",
186
+ agentTitle: "에이전트 설정",
187
+ agentDescription:
188
+ "오른쪽 사이드바의 에이전트 설정을 열어 모델, API 키, 자동화, 음성 및 기타 제어를 관리합니다.",
189
+ openAgentSettings: "에이전트 설정 열기",
190
+ },
191
+ }),
192
+ "pt-BR": mergeMessages({
193
+ root: {
194
+ commandActions: "Ações",
195
+ commandSearch: "Buscar",
196
+ commandAppearance: "Aparência",
197
+ toggleTheme: "Alternar tema",
198
+ },
199
+ settings: {
200
+ title: "Configurações",
201
+ description:
202
+ "Preferências de idioma, espaço de trabalho, recursos e agente.",
203
+ languageTitle: "Idioma",
204
+ languageDescription:
205
+ "Escolha o idioma da interface. Essa preferência é salva na sua conta.",
206
+ languageLabel: "Idioma da interface",
207
+ workspaceTitle: "Espaço de trabalho",
208
+ workspaceDescription:
209
+ "Gerencie acesso da equipe e recursos compartilhados do Dispatch.",
210
+ openTeamSettings: "Abrir configurações da equipe",
211
+ openResourceSettings: "Abrir configurações de recursos",
212
+ agentTitle: "Configurações do agente",
213
+ agentDescription:
214
+ "Abra as configurações do agente na barra lateral para modelos, chaves de API, automações, voz e outros controles.",
215
+ openAgentSettings: "Abrir configurações do agente",
216
+ },
217
+ }),
218
+ "hi-IN": mergeMessages({
219
+ root: {
220
+ commandActions: "क्रियाएं",
221
+ commandSearch: "खोजें",
222
+ commandAppearance: "रूप",
223
+ toggleTheme: "थीम बदलें",
224
+ },
225
+ settings: {
226
+ title: "सेटिंग्स",
227
+ description: "भाषा, कार्यस्थान, संसाधन और एजेंट प्राथमिकताएं।",
228
+ languageTitle: "भाषा",
229
+ languageDescription:
230
+ "इंटरफ़ेस भाषा चुनें। यह पसंद आपके खाते में सहेजी जाती है।",
231
+ languageLabel: "इंटरफ़ेस भाषा",
232
+ workspaceTitle: "कार्यस्थान",
233
+ workspaceDescription:
234
+ "Dispatch के लिए टीम पहुंच और साझा कार्यस्थान संसाधनों को प्रबंधित करें।",
235
+ openTeamSettings: "टीम सेटिंग्स खोलें",
236
+ openResourceSettings: "संसाधन सेटिंग्स खोलें",
237
+ agentTitle: "एजेंट सेटिंग्स",
238
+ agentDescription:
239
+ "मॉडल, API कुंजियों, ऑटोमेशन, आवाज़ और अन्य एजेंट नियंत्रणों के लिए साइडबार सेटिंग्स खोलें।",
240
+ openAgentSettings: "एजेंट सेटिंग्स खोलें",
241
+ },
242
+ }),
243
+ "ar-SA": mergeMessages({
244
+ root: {
245
+ commandActions: "الإجراءات",
246
+ commandSearch: "بحث",
247
+ commandAppearance: "المظهر",
248
+ toggleTheme: "تبديل السمة",
249
+ },
250
+ settings: {
251
+ title: "الإعدادات",
252
+ description: "تفضيلات اللغة ومساحة العمل والموارد والوكيل.",
253
+ languageTitle: "اللغة",
254
+ languageDescription: "اختر لغة الواجهة. يتم حفظ هذا التفضيل في حسابك.",
255
+ languageLabel: "لغة الواجهة",
256
+ workspaceTitle: "مساحة العمل",
257
+ workspaceDescription:
258
+ "إدارة وصول الفريق وموارد مساحة العمل المشتركة في Dispatch.",
259
+ openTeamSettings: "فتح إعدادات الفريق",
260
+ openResourceSettings: "فتح إعدادات الموارد",
261
+ agentTitle: "إعدادات الوكيل",
262
+ agentDescription:
263
+ "افتح إعدادات الوكيل في الشريط الجانبي لإدارة النموذج ومفاتيح API والأتمتة والصوت وعناصر التحكم الأخرى.",
264
+ openAgentSettings: "فتح إعدادات الوكيل",
265
+ },
266
+ }),
267
+ } satisfies Record<LocaleCode, Messages>;
@@ -14,10 +14,12 @@ import {
14
14
  CommandMenu,
15
15
  configureTracking,
16
16
  createAgentNativeQueryClient,
17
+ getLocaleInitScript,
17
18
  getThemeInitScript,
18
19
  useCommandMenuShortcut,
19
20
  useDbSync,
20
21
  appPath,
22
+ useT,
21
23
  } from "@agent-native/core/client";
22
24
  import { useQueryClient } from "@tanstack/react-query";
23
25
  import { IconSun, IconMoon } from "@tabler/icons-react";
@@ -27,6 +29,7 @@ import type { LinksFunction } from "react-router";
27
29
  import { dispatchExtensions } from "./dispatch-extensions";
28
30
  import changelog from "../CHANGELOG.md?raw";
29
31
  import stylesheet from "./global.css?url";
32
+ import { i18nCatalog } from "./i18n";
30
33
 
31
34
  configureTracking({
32
35
  getDefaultProps: (_name, properties) => ({
@@ -40,6 +43,7 @@ export const links: LinksFunction = () => [
40
43
  ];
41
44
 
42
45
  const THEME_INIT_SCRIPT = getThemeInitScript();
46
+ const LOCALE_INIT_SCRIPT = getLocaleInitScript();
43
47
 
44
48
  export function Layout({ children }: { children: React.ReactNode }) {
45
49
  return (
@@ -54,6 +58,11 @@ export function Layout({ children }: { children: React.ReactNode }) {
54
58
  suppressHydrationWarning
55
59
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
56
60
  />
61
+ <script
62
+ data-agent-native-locale-init
63
+ suppressHydrationWarning
64
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
65
+ />
57
66
  <link rel="manifest" href={appPath("/manifest.json")} />
58
67
  <meta name="theme-color" content="#0f172a" />
59
68
  <meta name="mobile-web-app-capable" content="yes" />
@@ -149,6 +158,7 @@ function useThreadDeepLink() {
149
158
 
150
159
  function ThemeToggleItem() {
151
160
  const { resolvedTheme, setTheme } = useTheme();
161
+ const t = useT();
152
162
  const isDark = resolvedTheme === "dark";
153
163
  return (
154
164
  <CommandMenu.Item
@@ -156,13 +166,14 @@ function ThemeToggleItem() {
156
166
  keywords={["theme", "dark", "light", "mode"]}
157
167
  >
158
168
  {isDark ? <IconSun size={16} /> : <IconMoon size={16} />}
159
- Toggle theme
169
+ {t("root.toggleTheme")}
160
170
  </CommandMenu.Item>
161
171
  );
162
172
  }
163
173
 
164
174
  function AppContent() {
165
175
  const [cmdkOpen, setCmdkOpen] = useState(false);
176
+ const t = useT();
166
177
  useCommandMenuShortcut(useCallback(() => setCmdkOpen(true), []));
167
178
  return (
168
179
  <>
@@ -173,10 +184,12 @@ function AppContent() {
173
184
  changelog={changelog}
174
185
  changelogKey="dispatch"
175
186
  >
176
- <CommandMenu.Group heading="Actions">
177
- <CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
187
+ <CommandMenu.Group heading={t("root.commandActions")}>
188
+ <CommandMenu.Item onSelect={() => {}}>
189
+ {t("root.commandSearch")}
190
+ </CommandMenu.Item>
178
191
  </CommandMenu.Group>
179
- <CommandMenu.Group heading="Appearance">
192
+ <CommandMenu.Group heading={t("root.commandAppearance")}>
180
193
  <ThemeToggleItem />
181
194
  </CommandMenu.Group>
182
195
  </CommandMenu>
@@ -193,6 +206,7 @@ export default function Root() {
193
206
  <AppProviders
194
207
  queryClient={queryClient}
195
208
  toaster={<Toaster richColors position="bottom-left" closeButton />}
209
+ i18n={{ catalog: i18nCatalog }}
196
210
  >
197
211
  <AppContent />
198
212
  </AppProviders>
@@ -0,0 +1,86 @@
1
+ import { Link } from "react-router";
2
+ import {
3
+ ChangelogSettingsCard,
4
+ LanguagePicker,
5
+ openAgentSettings,
6
+ useT,
7
+ } from "@agent-native/core/client";
8
+ import { Button } from "@agent-native/dispatch/components/ui/button";
9
+ import {
10
+ Card,
11
+ CardContent,
12
+ CardDescription,
13
+ CardHeader,
14
+ CardTitle,
15
+ } from "@agent-native/dispatch/components/ui/card";
16
+ import { Label } from "@agent-native/dispatch/components/ui/label";
17
+ import changelog from "../../CHANGELOG.md?raw";
18
+
19
+ export function meta() {
20
+ return [{ title: "Settings - Dispatch" }];
21
+ }
22
+
23
+ export default function SettingsRoute() {
24
+ const t = useT();
25
+
26
+ return (
27
+ <main className="mx-auto w-full max-w-3xl space-y-6 px-4 py-6 sm:px-6 sm:py-10">
28
+ <div className="space-y-1">
29
+ <h1 className="text-2xl font-semibold tracking-tight">
30
+ {t("settings.title")}
31
+ </h1>
32
+ <p className="text-sm leading-6 text-muted-foreground">
33
+ {t("settings.description")}
34
+ </p>
35
+ </div>
36
+
37
+ <Card>
38
+ <CardHeader>
39
+ <CardTitle className="text-base">
40
+ {t("settings.languageTitle")}
41
+ </CardTitle>
42
+ <CardDescription>{t("settings.languageDescription")}</CardDescription>
43
+ </CardHeader>
44
+ <CardContent className="max-w-xs space-y-1.5">
45
+ <Label>{t("settings.languageLabel")}</Label>
46
+ <LanguagePicker label={t("settings.languageLabel")} />
47
+ </CardContent>
48
+ </Card>
49
+
50
+ <Card>
51
+ <CardHeader>
52
+ <CardTitle className="text-base">
53
+ {t("settings.workspaceTitle")}
54
+ </CardTitle>
55
+ <CardDescription>
56
+ {t("settings.workspaceDescription")}
57
+ </CardDescription>
58
+ </CardHeader>
59
+ <CardContent className="flex flex-wrap gap-2">
60
+ <Button variant="outline" asChild>
61
+ <Link to="/team">{t("settings.openTeamSettings")}</Link>
62
+ </Button>
63
+ <Button variant="outline" asChild>
64
+ <Link to="/workspace">{t("settings.openResourceSettings")}</Link>
65
+ </Button>
66
+ </CardContent>
67
+ </Card>
68
+
69
+ <Card>
70
+ <CardHeader>
71
+ <CardTitle className="text-base">
72
+ {t("settings.agentTitle")}
73
+ </CardTitle>
74
+ <CardDescription>{t("settings.agentDescription")}</CardDescription>
75
+ </CardHeader>
76
+ <CardContent>
77
+ <Button variant="outline" onClick={() => openAgentSettings()}>
78
+ {t("settings.openAgentSettings")}
79
+ </Button>
80
+ </CardContent>
81
+ </Card>
82
+
83
+ <ChangelogSettingsCard markdown={changelog} />
84
+ </main>
85
+ );
86
+ }
@@ -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.
@@ -66,6 +66,11 @@ el.dataset.selectedId = selectedItem?.id || "";
66
66
 
67
67
  **Use configuration-driven rendering** — Extract visual decisions (colors, layouts, sizes) into JSON config files in `data/`. The agent can modify the config (Tier 1) instead of the component source (Tier 2).
68
68
 
69
+ **Keep localized copy in catalogs** — When editing visible UI copy, labels,
70
+ toasts, empty states, prompts, or formatting, read `internationalization` and
71
+ update `app/i18n/en-US.ts` plus existing locale catalogs instead of leaving new
72
+ inline strings in components.
73
+
69
74
  ## Don't
70
75
 
71
76
  - Don't modify `.env` files or files containing secrets
@@ -80,3 +85,4 @@ el.dataset.selectedId = selectedItem?.id || "";
80
85
  - **actions** — The agent can create or modify actions to add new capabilities
81
86
  - **delegate-to-agent** — Self-modification requests come through the agent chat
82
87
  - **real-time-sync** — Database writes trigger change events to update the UI
88
+ - **internationalization** — UI copy, language catalogs, locale switching, and RTL-safe edits
@@ -1,41 +1,48 @@
1
1
  import { useLocation } from "react-router";
2
2
  import { useHeaderTitle, useHeaderActions } from "./HeaderActions";
3
- import { AgentToggleButton } from "@agent-native/core/client";
3
+ import {
4
+ AgentToggleButton,
5
+ LanguagePicker,
6
+ useT,
7
+ } from "@agent-native/core/client";
4
8
 
5
9
  const pageTitles: Record<string, string> = {
6
- "/": "Forms",
7
- "/forms": "Forms",
8
- "/team": "Team",
10
+ "/": "header.forms",
11
+ "/forms": "header.forms",
12
+ "/settings": "header.settings",
13
+ "/team": "header.team",
9
14
  };
10
15
 
11
16
  function resolveTitle(pathname: string): string {
12
17
  if (pageTitles[pathname]) return pageTitles[pathname];
13
18
 
14
19
  if (pathname.startsWith("/forms/") && pathname.endsWith("/responses")) {
15
- return "Responses";
20
+ return "header.responses";
16
21
  }
17
- if (pathname.startsWith("/forms/")) return "Form";
18
- if (pathname.startsWith("/extensions")) return "Extensions";
22
+ if (pathname.startsWith("/forms/")) return "header.form";
23
+ if (pathname.startsWith("/extensions")) return "header.extensions";
19
24
 
20
- return "Forms";
25
+ return "header.forms";
21
26
  }
22
27
 
23
28
  export function Header() {
24
29
  const location = useLocation();
25
30
  const title = useHeaderTitle();
26
31
  const actions = useHeaderActions();
32
+ const t = useT();
27
33
 
28
34
  return (
29
35
  <header className="flex h-12 items-center gap-3 border-b border-border bg-background px-4 lg:px-6 shrink-0">
30
36
  <div className="flex items-center gap-3 flex-1 min-w-0">
31
37
  {title ?? (
32
38
  <h1 className="text-lg font-semibold tracking-tight truncate">
33
- {resolveTitle(location.pathname)}
39
+ {t(resolveTitle(location.pathname))}
34
40
  </h1>
35
41
  )}
36
42
  </div>
37
43
  <div className="flex items-center gap-2 shrink-0">
38
44
  {actions}
45
+ <LanguagePicker variant="icon" />
39
46
  <AgentToggleButton />
40
47
  </div>
41
48
  </header>
@@ -8,6 +8,7 @@ import {
8
8
  focusAgentChat,
9
9
  navigateWithAgentChatViewTransition,
10
10
  useAgentChatHomeHandoff,
11
+ useT,
11
12
  } from "@agent-native/core/client";
12
13
  import { InvitationBanner } from "@agent-native/core/client/org";
13
14
  import { TAB_ID } from "@/lib/tab-id";
@@ -26,6 +27,7 @@ interface LayoutProps {
26
27
  export function Layout({ children }: LayoutProps) {
27
28
  const location = useLocation();
28
29
  const navigate = useNavigate();
30
+ const t = useT();
29
31
  const chatHomeHandoffActive = useAgentChatHomeHandoff({
30
32
  storageKey: "forms",
31
33
  activePath: location.pathname,
@@ -70,11 +72,11 @@ export function Layout({ children }: LayoutProps) {
70
72
  browserTabId={TAB_ID}
71
73
  openOnChatRunning={chatHomeHandoffActive}
72
74
  onFullscreenRequest={openAskAgentFullscreen}
73
- emptyStateText="Ask me anything about your forms"
75
+ emptyStateText={t("agent.emptyState")}
74
76
  suggestions={[
75
- "Build a customer feedback survey",
76
- "Show submissions by day",
77
- "Export responses to CSV",
77
+ t("agent.suggestionSurvey"),
78
+ t("agent.suggestionSubmissions"),
79
+ t("agent.suggestionExport"),
78
80
  ]}
79
81
  scope={sidebarScope}
80
82
  >