@agent-native/core 0.114.12 → 0.114.15

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 (241) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/docs/content/deployment.mdx +1 -1
  4. package/corpus/core/docs/content/frames.mdx +1 -1
  5. package/corpus/core/docs/content/integrations.mdx +27 -27
  6. package/corpus/core/docs/content/pr-visual-recap.mdx +17 -13
  7. package/corpus/core/docs/content/workspace-management.mdx +1 -1
  8. package/corpus/core/package.json +2 -1
  9. package/corpus/core/src/agent/engine/builder-engine.ts +4 -0
  10. package/corpus/core/src/application-state/index.ts +3 -0
  11. package/corpus/core/src/application-state/script-helpers.ts +12 -1
  12. package/corpus/core/src/application-state/store.ts +216 -15
  13. package/corpus/core/src/client/AgentPanel.tsx +10 -4
  14. package/corpus/core/src/client/ConnectBuilderCard.tsx +5 -1
  15. package/corpus/core/src/client/chat/markdown-renderer.tsx +3 -5
  16. package/corpus/core/src/client/error-format.ts +2 -1
  17. package/corpus/core/src/client/index.ts +1 -0
  18. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +2 -18
  19. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +43 -32
  20. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +4 -2
  21. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +5 -1
  22. package/corpus/core/src/client/settings/SettingsPanel.tsx +4 -4
  23. package/corpus/core/src/client/settings/useBuilderStatus.ts +3 -0
  24. package/corpus/core/src/db/client.ts +44 -1
  25. package/corpus/core/src/localization/default-messages.ts +1 -7
  26. package/corpus/core/src/server/builder-browser.ts +4 -0
  27. package/corpus/core/src/server/builder-design-systems.ts +6 -1
  28. package/corpus/core/src/server/fusion-app.ts +5 -1
  29. package/corpus/core/src/shared/builder-link-tracking.ts +41 -0
  30. package/corpus/core/src/shared/index.ts +1 -0
  31. package/corpus/templates/analytics/AGENTS.md +10 -1
  32. package/corpus/templates/analytics/actions/save-dashboard-report-subscription.ts +10 -2
  33. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +5 -4
  34. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +20 -32
  35. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +62 -0
  36. package/corpus/templates/analytics/changelog/2026-07-21-chart-series-controls-stay-open-while-moving-from-the-legend.md +6 -0
  37. package/corpus/templates/analytics/changelog/2026-07-21-dashboard-email-captures-complete-large-dashboards-in-chunks.md +6 -0
  38. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +4 -4
  39. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -8
  40. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +39 -7
  41. package/corpus/templates/analytics/server/lib/dashboard-report.ts +341 -251
  42. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +114 -0
  43. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +84 -6
  44. package/corpus/templates/analytics/server/plugins/db.ts +13 -0
  45. package/corpus/templates/clips/app/components/player/video-player.tsx +10 -4
  46. package/corpus/templates/clips/changelog/2026-07-21-choose-which-whisper-model-to-use-in-settings.md +6 -0
  47. package/corpus/templates/clips/changelog/2026-07-21-fixed-organization-recording-visibility-default.md +6 -0
  48. package/corpus/templates/clips/changelog/2026-07-21-live-dictation-text-now-appears-above-the-desktop-recording-.md +6 -0
  49. package/corpus/templates/clips/changelog/2026-07-21-meeting-notes-stop-when-calls-end.md +6 -0
  50. package/corpus/templates/clips/desktop/src/app.tsx +66 -75
  51. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +2 -0
  52. package/corpus/templates/clips/desktop/src/hooks/useWhisperSettings.ts +172 -0
  53. package/corpus/templates/clips/desktop/src/lib/meeting-call-app.ts +41 -0
  54. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  55. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +14 -3
  56. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +25 -0
  57. package/corpus/templates/clips/desktop/src/shared/config.ts +1 -0
  58. package/corpus/templates/clips/desktop/src/styles.css +100 -7
  59. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +3 -4
  60. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +32 -0
  61. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
  62. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +11 -4
  63. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +268 -20
  64. package/corpus/templates/clips/desktop/src-tauri/src/whisper_model.rs +285 -164
  65. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +18 -7
  66. package/corpus/templates/clips/learnings.defaults.md +1 -1
  67. package/corpus/templates/clips/server/plugins/db.ts +11 -0
  68. package/corpus/templates/clips/shared/builder-credits.ts +1 -1
  69. package/corpus/templates/design/AGENTS.md +7 -3
  70. package/corpus/templates/design/actions/begin-node-rewrite-request.ts +78 -0
  71. package/corpus/templates/design/actions/cancel-node-rewrite-request.ts +17 -7
  72. package/corpus/templates/design/actions/propose-node-rewrite.ts +26 -18
  73. package/corpus/templates/design/actions/resolve-node-rewrite.ts +67 -19
  74. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -1
  75. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +5 -1
  76. package/corpus/templates/design/app/components/visual-editor/NodeRewriteProposal.tsx +1 -4
  77. package/corpus/templates/design/app/components/visual-editor/ReviewCanvasPins.tsx +2 -6
  78. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -1
  79. package/corpus/templates/design/shared/node-rewrite.ts +32 -0
  80. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +6 -3
  81. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +11 -18
  82. package/corpus/templates/forms/app/pages/FormsListPage.tsx +9 -5
  83. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +9 -1
  84. package/corpus/templates/slides/app/context/DeckContext.tsx +18 -0
  85. package/corpus/templates/slides/changelog/2026-07-21-decks-list-now-refreshes-when-you-switch-organizations.md +6 -0
  86. package/corpus/templates/tasks/app/components/custom-fields/FieldCreateBar.tsx +13 -19
  87. package/corpus/templates/tasks/app/components/custom-fields/FieldListRow.tsx +27 -22
  88. package/corpus/templates/tasks/app/components/custom-fields/FieldsList.tsx +26 -22
  89. package/corpus/templates/tasks/app/components/custom-fields/FieldsListSkeleton.tsx +4 -1
  90. package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +4 -2
  91. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldEditorSidebar.tsx +12 -3
  92. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldTitleSection.tsx +6 -3
  93. package/corpus/templates/tasks/app/components/custom-fields/editor/config/CurrencyConfigControl.tsx +5 -2
  94. package/corpus/templates/tasks/app/components/custom-fields/editor/config/NumberConfigControl.tsx +5 -2
  95. package/corpus/templates/tasks/app/components/custom-fields/editor/config/PercentConfigControl.tsx +4 -1
  96. package/corpus/templates/tasks/app/components/custom-fields/editor/config/SelectConfigControl.tsx +17 -7
  97. package/corpus/templates/tasks/app/components/custom-fields/editor/config/select-colors.ts +37 -9
  98. package/corpus/templates/tasks/app/components/custom-fields/field-types.ts +23 -0
  99. package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +24 -16
  100. package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +5 -3
  101. package/corpus/templates/tasks/app/components/inbox/InboxListRow.tsx +7 -5
  102. package/corpus/templates/tasks/app/components/layout/Header.tsx +10 -10
  103. package/corpus/templates/tasks/app/components/layout/Layout.tsx +11 -7
  104. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +17 -10
  105. package/corpus/templates/tasks/app/components/shared/AddListItemInput.tsx +14 -8
  106. package/corpus/templates/tasks/app/components/shared/AlertDialog.tsx +6 -2
  107. package/corpus/templates/tasks/app/components/shared/BulkDeleteDialog.tsx +13 -6
  108. package/corpus/templates/tasks/app/components/shared/ChipSelect.tsx +12 -5
  109. package/corpus/templates/tasks/app/components/shared/DeleteItemDialog.tsx +6 -6
  110. package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +3 -1
  111. package/corpus/templates/tasks/app/components/shared/SidePanel.tsx +5 -2
  112. package/corpus/templates/tasks/app/components/shared/list/ListRowDragHandle.tsx +3 -1
  113. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionBar.tsx +46 -20
  114. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionHeaderToggle.tsx +3 -1
  115. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionToolbar.tsx +10 -6
  116. package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +24 -13
  117. package/corpus/templates/tasks/app/components/tasks/TaskListHeaderRow.tsx +4 -1
  118. package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +5 -3
  119. package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +15 -6
  120. package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +11 -6
  121. package/corpus/templates/tasks/app/components/tasks/fields/TaskTitleSection.tsx +8 -3
  122. package/corpus/templates/tasks/app/components/tasks/fields/controls/RichTextValueControl.tsx +12 -6
  123. package/corpus/templates/tasks/app/components/tasks/fields/controls/SingleSelectValueControl.tsx +6 -1
  124. package/corpus/templates/tasks/app/i18n/en-US.ts +209 -0
  125. package/corpus/templates/tasks/app/i18n/index.ts +34 -0
  126. package/corpus/templates/tasks/app/root.tsx +34 -2
  127. package/corpus/templates/tasks/app/routes/extensions.$id.tsx +2 -1
  128. package/corpus/templates/tasks/app/routes/extensions._index.tsx +2 -1
  129. package/corpus/templates/tasks/app/routes/fields.tsx +2 -1
  130. package/corpus/templates/tasks/app/routes/inbox.tsx +2 -1
  131. package/corpus/templates/tasks/app/routes/tasks.tsx +2 -1
  132. package/corpus/templates/tasks/app/routes/team.tsx +6 -3
  133. package/corpus/templates/tasks/changelog/2026-07-20-tasks-is-now-available-in-10-additional-languages.md +6 -0
  134. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  135. package/dist/agent/engine/builder-engine.js +4 -0
  136. package/dist/agent/engine/builder-engine.js.map +1 -1
  137. package/dist/application-state/index.d.ts +2 -2
  138. package/dist/application-state/index.d.ts.map +1 -1
  139. package/dist/application-state/index.js +2 -2
  140. package/dist/application-state/index.js.map +1 -1
  141. package/dist/application-state/script-helpers.d.ts +3 -1
  142. package/dist/application-state/script-helpers.d.ts.map +1 -1
  143. package/dist/application-state/script-helpers.js +7 -1
  144. package/dist/application-state/script-helpers.js.map +1 -1
  145. package/dist/application-state/store.d.ts +7 -1
  146. package/dist/application-state/store.d.ts.map +1 -1
  147. package/dist/application-state/store.js +143 -17
  148. package/dist/application-state/store.js.map +1 -1
  149. package/dist/client/AgentPanel.d.ts.map +1 -1
  150. package/dist/client/AgentPanel.js +10 -3
  151. package/dist/client/AgentPanel.js.map +1 -1
  152. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  153. package/dist/client/ConnectBuilderCard.js +5 -1
  154. package/dist/client/ConnectBuilderCard.js.map +1 -1
  155. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  156. package/dist/client/chat/markdown-renderer.js +3 -2
  157. package/dist/client/chat/markdown-renderer.js.map +1 -1
  158. package/dist/client/error-format.d.ts +1 -1
  159. package/dist/client/error-format.d.ts.map +1 -1
  160. package/dist/client/error-format.js +1 -1
  161. package/dist/client/error-format.js.map +1 -1
  162. package/dist/client/index.d.ts +1 -0
  163. package/dist/client/index.d.ts.map +1 -1
  164. package/dist/client/index.js +1 -0
  165. package/dist/client/index.js.map +1 -1
  166. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  167. package/dist/client/integrations/IntegrationsPanel.js +3 -4
  168. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  169. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  170. package/dist/client/resources/McpIntegrationDialog.js +21 -7
  171. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  172. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  173. package/dist/client/resources/mcp-integration-catalog.js +2 -2
  174. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  175. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  176. package/dist/client/settings/BackgroundAgentSection.js +5 -1
  177. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  178. package/dist/client/settings/SettingsPanel.js +1 -1
  179. package/dist/client/settings/SettingsPanel.js.map +1 -1
  180. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  181. package/dist/client/settings/useBuilderStatus.js +2 -0
  182. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  183. package/dist/collab/routes.d.ts +1 -1
  184. package/dist/db/client.d.ts +7 -0
  185. package/dist/db/client.d.ts.map +1 -1
  186. package/dist/db/client.js +39 -1
  187. package/dist/db/client.js.map +1 -1
  188. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  189. package/dist/localization/default-messages.d.ts +0 -6
  190. package/dist/localization/default-messages.d.ts.map +1 -1
  191. package/dist/localization/default-messages.js +1 -7
  192. package/dist/localization/default-messages.js.map +1 -1
  193. package/dist/notifications/routes.d.ts +2 -2
  194. package/dist/observability/routes.d.ts +3 -3
  195. package/dist/resources/handlers.d.ts +1 -1
  196. package/dist/server/builder-browser.d.ts.map +1 -1
  197. package/dist/server/builder-browser.js +4 -0
  198. package/dist/server/builder-browser.js.map +1 -1
  199. package/dist/server/builder-design-systems.d.ts.map +1 -1
  200. package/dist/server/builder-design-systems.js +6 -1
  201. package/dist/server/builder-design-systems.js.map +1 -1
  202. package/dist/server/fusion-app.d.ts.map +1 -1
  203. package/dist/server/fusion-app.js +2 -1
  204. package/dist/server/fusion-app.js.map +1 -1
  205. package/dist/server/transcribe-voice.d.ts +1 -1
  206. package/dist/shared/builder-link-tracking.d.ts +14 -0
  207. package/dist/shared/builder-link-tracking.d.ts.map +1 -0
  208. package/dist/shared/builder-link-tracking.js +26 -0
  209. package/dist/shared/builder-link-tracking.js.map +1 -0
  210. package/dist/shared/index.d.ts +1 -0
  211. package/dist/shared/index.d.ts.map +1 -1
  212. package/dist/shared/index.js +1 -0
  213. package/dist/shared/index.js.map +1 -1
  214. package/docs/content/deployment.mdx +1 -1
  215. package/docs/content/frames.mdx +1 -1
  216. package/docs/content/integrations.mdx +27 -27
  217. package/docs/content/pr-visual-recap.mdx +17 -13
  218. package/docs/content/workspace-management.mdx +1 -1
  219. package/package.json +3 -2
  220. package/src/agent/engine/builder-engine.ts +4 -0
  221. package/src/application-state/index.ts +3 -0
  222. package/src/application-state/script-helpers.ts +12 -1
  223. package/src/application-state/store.ts +216 -15
  224. package/src/client/AgentPanel.tsx +10 -4
  225. package/src/client/ConnectBuilderCard.tsx +5 -1
  226. package/src/client/chat/markdown-renderer.tsx +3 -5
  227. package/src/client/error-format.ts +2 -1
  228. package/src/client/index.ts +1 -0
  229. package/src/client/integrations/IntegrationsPanel.tsx +2 -18
  230. package/src/client/resources/McpIntegrationDialog.tsx +43 -32
  231. package/src/client/resources/mcp-integration-catalog.ts +4 -2
  232. package/src/client/settings/BackgroundAgentSection.tsx +5 -1
  233. package/src/client/settings/SettingsPanel.tsx +4 -4
  234. package/src/client/settings/useBuilderStatus.ts +3 -0
  235. package/src/db/client.ts +44 -1
  236. package/src/localization/default-messages.ts +1 -7
  237. package/src/server/builder-browser.ts +4 -0
  238. package/src/server/builder-design-systems.ts +6 -1
  239. package/src/server/fusion-app.ts +5 -1
  240. package/src/shared/builder-link-tracking.ts +41 -0
  241. package/src/shared/index.ts +1 -0
@@ -1,3 +1,4 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
1
2
  import {
2
3
  IconBold,
3
4
  IconH1,
@@ -20,6 +21,7 @@ export function RichTextValueControl({
20
21
  disabled: boolean;
21
22
  onChange: (value: string) => void;
22
23
  }) {
24
+ const t = useT();
23
25
  const textareaRef = useRef<HTMLTextAreaElement | null>(null);
24
26
 
25
27
  function applyWrap(before: string, after = before, placeholder = "text") {
@@ -54,28 +56,32 @@ export function RichTextValueControl({
54
56
 
55
57
  const tools = [
56
58
  {
57
- label: "Bold",
59
+ label: t("taskFields.toolBold"),
58
60
  icon: IconBold,
59
61
  action: () => applyWrap("**", "**", "bold"),
60
62
  },
61
63
  {
62
- label: "Italic",
64
+ label: t("taskFields.toolItalic"),
63
65
  icon: IconItalic,
64
66
  action: () => applyWrap("_", "_", "italic"),
65
67
  },
66
- { label: "Heading", icon: IconH1, action: () => applyLinePrefix("## ") },
67
68
  {
68
- label: "Bulleted list",
69
+ label: t("taskFields.toolHeading"),
70
+ icon: IconH1,
71
+ action: () => applyLinePrefix("## "),
72
+ },
73
+ {
74
+ label: t("taskFields.toolBulletedList"),
69
75
  icon: IconList,
70
76
  action: () => applyLinePrefix("- "),
71
77
  },
72
78
  {
73
- label: "Numbered list",
79
+ label: t("taskFields.toolNumberedList"),
74
80
  icon: IconListNumbers,
75
81
  action: () => applyLinePrefix("1. "),
76
82
  },
77
83
  {
78
- label: "Link",
84
+ label: t("taskFields.toolLink"),
79
85
  icon: IconLink,
80
86
  action: () => applyWrap("[", "](https://example.com)", "link"),
81
87
  },
@@ -1,3 +1,5 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
2
+
1
3
  import { selectColorClass } from "@/components/custom-fields/editor/config/select-colors";
2
4
  import { optionsFromConfig } from "@/components/custom-fields/editor/config/utils";
3
5
  import {
@@ -24,6 +26,7 @@ export function SingleSelectValueControl({
24
26
  disabled: boolean;
25
27
  onChange: (value: FieldValue | null) => void;
26
28
  }) {
29
+ const t = useT();
27
30
  const options = optionsFromConfig(field.config);
28
31
  const selected = typeof value === "string" ? value : EMPTY_SELECT_VALUE;
29
32
 
@@ -40,7 +43,9 @@ export function SingleSelectValueControl({
40
43
  </SelectTrigger>
41
44
  <SelectContent>
42
45
  <SelectGroup>
43
- <SelectItem value={EMPTY_SELECT_VALUE}>None</SelectItem>
46
+ <SelectItem value={EMPTY_SELECT_VALUE}>
47
+ {t("taskFields.noneOption")}
48
+ </SelectItem>
44
49
  {options.map((option) => (
45
50
  <SelectItem key={option.id} value={option.id}>
46
51
  <span className="flex items-center gap-2">
@@ -0,0 +1,209 @@
1
+ const messages = {
2
+ common: {
3
+ cancel: "Cancel",
4
+ delete: "Delete",
5
+ add: "Add",
6
+ noneSelected: "None selected",
7
+ closePanel: "Close panel",
8
+ editTitleAriaLabel: "Edit title",
9
+ rowActionsAriaLabel: "Actions for {{title}}",
10
+ reorderAriaLabel: "Reorder {{title}}",
11
+ removeAriaLabel: "Remove {{label}}",
12
+ showAll: "Show all",
13
+ markReady: "Mark ready",
14
+ },
15
+ sidebar: {
16
+ navInbox: "Inbox",
17
+ navTasks: "Tasks",
18
+ navFields: "Fields",
19
+ collapseSidebar: "Collapse sidebar",
20
+ expandSidebar: "Expand sidebar",
21
+ navigationTitle: "Navigation",
22
+ navigationDescription: "App navigation links",
23
+ },
24
+ header: {
25
+ openNavigation: "Open navigation",
26
+ pageTasks: "Tasks",
27
+ pageSettings: "Settings",
28
+ pageTeam: "Team",
29
+ pageExtension: "Extension",
30
+ pageExtensions: "Extensions",
31
+ },
32
+ agent: {
33
+ emptyState: "Ask the agent to inspect or change this app.",
34
+ suggestionCalendar: "Check my calendar and mails - any tasks for today?",
35
+ suggestionPrioritize: "Prioritise my tasks",
36
+ suggestionCleanHouse:
37
+ "I need to clean my house, create a list of tasks for it",
38
+ },
39
+ team: {
40
+ createOrgDescription:
41
+ "Set up a team to share this app with your colleagues.",
42
+ },
43
+ tasks: {
44
+ pageTitle: "Tasks",
45
+ pageDescription:
46
+ "Manage your task list, drag to reorder, or ask chat to add reminders.",
47
+ loadError: "Failed to load tasks.",
48
+ allCompleteHeading: "All tasks complete",
49
+ allCompleteDescription: "Toggle Show all to review completed tasks.",
50
+ emptyHeading: "No tasks yet",
51
+ emptyDescription: "Add one above or ask chat to create a task for you.",
52
+ listAriaLabel: "Tasks list",
53
+ bulkDeleteError: "Could not delete selected tasks.",
54
+ entitySingular: "task",
55
+ entityPlural: "tasks",
56
+ taskColumnHeader: "Task",
57
+ visibleTaskFieldsAriaLabel: "Visible task fields",
58
+ markCompleteAriaLabel: "Mark {{title}} complete",
59
+ markIncompleteAriaLabel: "Mark {{title}} incomplete",
60
+ addPlaceholder: "Add a task...",
61
+ addButtonLabel: "Add task",
62
+ addInputAriaLabel: "New task title",
63
+ addErrorMessage: "Failed to create task. Please try again.",
64
+ },
65
+ inbox: {
66
+ pageTitle: "Inbox",
67
+ pageDescription:
68
+ "Capture rough ideas here, then mark ready when they become tasks.",
69
+ loadError: "Failed to load inbox items.",
70
+ emptyHeading: "Inbox is empty",
71
+ emptyDescription:
72
+ "Add an item above or ask chat to capture something for triage.",
73
+ listAriaLabel: "Inbox list",
74
+ bulkDeleteError: "Could not delete selected inbox items.",
75
+ entitySingular: "inbox item",
76
+ entityPlural: "inbox items",
77
+ addPlaceholder: "Add to inbox...",
78
+ addButtonLabel: "Add item",
79
+ addInputAriaLabel: "New inbox item title",
80
+ addErrorMessage: "Failed to add inbox item. Please try again.",
81
+ },
82
+ fields: {
83
+ pageTitle: "Fields",
84
+ pageDescription: "Define the reusable fields that every task can fill in.",
85
+ loadError: "Failed to load fields.",
86
+ emptyHeading: "No fields yet",
87
+ emptyDescription: "Create a field above to start adding task structure.",
88
+ listAriaLabel: "Fields list",
89
+ createdToast: "Field created.",
90
+ createError: "Could not create field.",
91
+ deletedToast: "Deleted {{title}}.",
92
+ deletedWithValuesToast: "Deleted {{title}} and {{count}} task values.",
93
+ deleteError: "Could not delete field.",
94
+ taskCardFieldsLabel: "Task card fields",
95
+ addFieldButtonLabel: "Add field",
96
+ noFieldsSelectedLabel: "No fields selected",
97
+ entitySingular: "field",
98
+ deleteFieldDescription:
99
+ "This deletes the field and removes its values from every task.",
100
+ deleteFieldDescriptionWithTitle:
101
+ 'This deletes "{{title}}" and removes its values from every task.',
102
+ deleteFieldAriaLabel: "Delete {{title}}",
103
+ createNewFieldHeading: "Create new field",
104
+ fieldTitleLabel: "Field title",
105
+ newFieldTitlePlaceholder: "New field title",
106
+ fieldTypeAriaLabel: "Field type",
107
+ createButton: "Create",
108
+ currencyDescription: "Currency {{symbol}}",
109
+ decimalsDescription: "{{count}} decimals",
110
+ positiveOnlySuffix: "positive only",
111
+ optionsCountDescription: "{{count}} options",
112
+ types: {
113
+ text: "Text",
114
+ richText: "Rich text",
115
+ number: "Number",
116
+ percent: "Percent",
117
+ currency: "Currency",
118
+ singleSelect: "Single-select",
119
+ multiSelect: "Multi-select",
120
+ date: "Date",
121
+ },
122
+ },
123
+ fieldEditor: {
124
+ panelTitle: "Field",
125
+ closeLabel: "Close field editor",
126
+ updateError: "Could not update field.",
127
+ titleLabel: "Title",
128
+ requiredLabel: "Required",
129
+ editFieldTitleAriaLabel: "Edit field title",
130
+ symbolLabel: "Symbol",
131
+ precisionLabel: "Precision",
132
+ positiveOnlyLabel: "Positive numbers only",
133
+ optionsLabel: "Options",
134
+ optionNameAriaLabel: "Option {{index}} name",
135
+ optionColorAriaLabel: "Option {{name}} color",
136
+ removeOptionAriaLabel: "Remove {{name}}",
137
+ newOptionName: "Option {{index}}",
138
+ addOptionButton: "Add option",
139
+ colors: {
140
+ red: "Red",
141
+ orange: "Orange",
142
+ yellow: "Yellow",
143
+ green: "Green",
144
+ blue: "Blue",
145
+ purple: "Purple",
146
+ pink: "Pink",
147
+ gray: "Gray",
148
+ },
149
+ },
150
+ taskFields: {
151
+ panelTitle: "Fields",
152
+ panelSubtitle: "Task details",
153
+ closeLabel: "Close fields panel",
154
+ updateError: "Could not update task.",
155
+ noFieldsDefined: "No fields defined.",
156
+ titleLabel: "Title",
157
+ taskBadge: "Task",
158
+ editTaskTitleAriaLabel: "Edit task title",
159
+ noneOption: "None",
160
+ toolBold: "Bold",
161
+ toolItalic: "Italic",
162
+ toolHeading: "Heading",
163
+ toolBulletedList: "Bulleted list",
164
+ toolNumberedList: "Numbered list",
165
+ toolLink: "Link",
166
+ },
167
+ selection: {
168
+ select: "Select",
169
+ doneSelecting: "Done selecting",
170
+ selectAll: "Select all",
171
+ clearAll: "Clear all",
172
+ exitSelectionMode: "Exit selection mode",
173
+ markComplete: "Mark complete",
174
+ markIncomplete: "Mark incomplete",
175
+ completeLabel: "Complete",
176
+ incompleteLabel: "Incomplete",
177
+ selectedCount: "{{count}} selected",
178
+ selectedCountReorder: "{{count}} selected · drag to reorder",
179
+ tapToSelectTasks: "Tap tasks to select them.",
180
+ tapToSelectItems: "Tap items to select them.",
181
+ taskSelectionActionsAriaLabel: "Task selection actions",
182
+ inboxSelectionActionsAriaLabel: "Inbox selection actions",
183
+ couldNotMarkReady: "Could not mark selected items ready.",
184
+ couldNotUpdateTasks: "Could not update selected tasks.",
185
+ markedReadyOne: "Marked {{count}} item ready",
186
+ markedReadyOther: "Marked {{count}} items ready",
187
+ allTasksAlreadyComplete: "All selected tasks are already complete.",
188
+ allTasksAlreadyIncomplete: "All selected tasks are already incomplete.",
189
+ markedDone: "Marked {{count}} {{unit}} complete",
190
+ markedDoneWithSkipped:
191
+ "Marked {{count}} {{unit}} complete ({{skipped}} already complete)",
192
+ markedNotDone: "Marked {{count}} {{unit}} incomplete",
193
+ markedNotDoneWithSkipped:
194
+ "Marked {{count}} {{unit}} incomplete ({{skipped}} already incomplete)",
195
+ },
196
+ dialogs: {
197
+ deleteEntityTitle: "Delete {{entity}}?",
198
+ deleteItemDescription: "This removes the {{entity}} permanently.",
199
+ deleteItemDescriptionWithTitle: 'This removes "{{title}}" permanently.',
200
+ bulkDeleteDescriptionOne:
201
+ "This permanently removes the selected {{entity}}.",
202
+ bulkDeleteDescriptionOther:
203
+ "This permanently removes all {{count}} selected {{entity}}.",
204
+ andMore: "and {{count}} more",
205
+ deletedCount: "Deleted {{count}} {{entity}}",
206
+ },
207
+ };
208
+
209
+ export default messages;
@@ -0,0 +1,34 @@
1
+ import { type AgentNativeI18nCatalog } from "@agent-native/core/client/i18n";
2
+
3
+ import enUS from "./en-US";
4
+
5
+ export const i18nCatalog = {
6
+ sourceLocale: "en-US",
7
+ messages: enUS,
8
+ loadMessages: async (locale) => {
9
+ switch (locale) {
10
+ case "zh-CN":
11
+ return (await import("./zh-CN")).default;
12
+ case "zh-TW":
13
+ return (await import("./zh-TW")).default;
14
+ case "es-ES":
15
+ return (await import("./es-ES")).default;
16
+ case "fr-FR":
17
+ return (await import("./fr-FR")).default;
18
+ case "de-DE":
19
+ return (await import("./de-DE")).default;
20
+ case "ja-JP":
21
+ return (await import("./ja-JP")).default;
22
+ case "ko-KR":
23
+ return (await import("./ko-KR")).default;
24
+ case "pt-BR":
25
+ return (await import("./pt-BR")).default;
26
+ case "hi-IN":
27
+ return (await import("./hi-IN")).default;
28
+ case "ar-SA":
29
+ return (await import("./ar-SA")).default;
30
+ default:
31
+ return null;
32
+ }
33
+ },
34
+ } satisfies AgentNativeI18nCatalog;
@@ -5,6 +5,7 @@ import {
5
5
  AppProviders,
6
6
  createAgentNativeQueryClient,
7
7
  } from "@agent-native/core/client/hooks";
8
+ import { getLocaleInitScript } from "@agent-native/core/client/i18n";
8
9
  import {
9
10
  CommandMenu,
10
11
  useCommandMenuShortcut,
@@ -20,6 +21,7 @@ import type { LinksFunction } from "react-router";
20
21
  import { Layout as AppLayout } from "@/components/layout/Layout";
21
22
  import { Toaster } from "@/components/ui/sonner";
22
23
  import { useNavigationState } from "@/hooks/use-navigation-state";
24
+ import { i18nCatalog } from "@/i18n";
23
25
  import { APP_TITLE } from "@/lib/app-config";
24
26
  import { TAB_ID } from "@/lib/tab-id";
25
27
 
@@ -37,7 +39,31 @@ export const links: LinksFunction = () => [
37
39
  { rel: "stylesheet", href: stylesheet },
38
40
  ];
39
41
 
40
- const THEME_INIT_SCRIPT = getThemeInitScript();
42
+ const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
43
+ const LOCALE_INIT_SCRIPT_SELECTOR = "script[data-agent-native-locale-init]";
44
+
45
+ function getHydrationStableThemeInitScript() {
46
+ if (typeof document !== "undefined") {
47
+ const existing = document.querySelector<HTMLScriptElement>(
48
+ THEME_INIT_SCRIPT_SELECTOR,
49
+ );
50
+ if (existing?.innerHTML) return existing.innerHTML;
51
+ }
52
+ return getThemeInitScript();
53
+ }
54
+
55
+ function getHydrationStableLocaleInitScript() {
56
+ if (typeof document !== "undefined") {
57
+ const existing = document.querySelector<HTMLScriptElement>(
58
+ LOCALE_INIT_SCRIPT_SELECTOR,
59
+ );
60
+ if (existing?.innerHTML) return existing.innerHTML;
61
+ }
62
+ return getLocaleInitScript();
63
+ }
64
+
65
+ const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
66
+ const LOCALE_INIT_SCRIPT = getHydrationStableLocaleInitScript();
41
67
 
42
68
  export function Layout({ children }: { children: React.ReactNode }) {
43
69
  return (
@@ -49,9 +75,15 @@ export function Layout({ children }: { children: React.ReactNode }) {
49
75
  content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
50
76
  />
51
77
  <script
78
+ data-agent-native-theme-init
52
79
  suppressHydrationWarning
53
80
  dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
54
81
  />
82
+ <script
83
+ data-agent-native-locale-init
84
+ suppressHydrationWarning
85
+ dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
86
+ />
55
87
  <link rel="manifest" href={appPath("/manifest.json")} />
56
88
  <meta name="theme-color" content="#18181B" />
57
89
  <meta name="mobile-web-app-capable" content="yes" />
@@ -122,7 +154,7 @@ function AppContent() {
122
154
  export default function Root() {
123
155
  const [queryClient] = useState(() => createAgentNativeQueryClient());
124
156
  return (
125
- <AppProviders queryClient={queryClient}>
157
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
126
158
  <DbSyncSetup />
127
159
  <AppContent />
128
160
  </AppProviders>
@@ -1,9 +1,10 @@
1
1
  import { ExtensionViewerPage } from "@agent-native/core/client/extensions";
2
2
 
3
+ import messages from "@/i18n/en-US";
3
4
  import { APP_TITLE } from "@/lib/app-config";
4
5
 
5
6
  export function meta() {
6
- return [{ title: `Extension — ${APP_TITLE}` }];
7
+ return [{ title: `${messages.header.pageExtension} — ${APP_TITLE}` }];
7
8
  }
8
9
 
9
10
  export default function ExtensionViewerRoute() {
@@ -1,9 +1,10 @@
1
1
  import { ExtensionsListPage } from "@agent-native/core/client/extensions";
2
2
 
3
+ import messages from "@/i18n/en-US";
3
4
  import { APP_TITLE } from "@/lib/app-config";
4
5
 
5
6
  export function meta() {
6
- return [{ title: `Extensions — ${APP_TITLE}` }];
7
+ return [{ title: `${messages.header.pageExtensions} — ${APP_TITLE}` }];
7
8
  }
8
9
 
9
10
  export default function ExtensionsRoute() {
@@ -1,9 +1,10 @@
1
1
  import { FieldsPage } from "@/components/custom-fields/FieldsPage";
2
+ import messages from "@/i18n/en-US";
2
3
  import { APP_TITLE } from "@/lib/app-config";
3
4
 
4
5
  export function meta() {
5
6
  return [
6
- { title: `Fields · ${APP_TITLE}` },
7
+ { title: `${messages.fields.pageTitle} · ${APP_TITLE}` },
7
8
  {
8
9
  name: "description",
9
10
  content: "Define reusable custom fields for tasks.",
@@ -1,9 +1,10 @@
1
1
  import { InboxListPage } from "@/components/inbox/InboxListPage";
2
+ import messages from "@/i18n/en-US";
2
3
  import { APP_TITLE } from "@/lib/app-config";
3
4
 
4
5
  export function meta() {
5
6
  return [
6
- { title: `Inbox · ${APP_TITLE}` },
7
+ { title: `${messages.inbox.pageTitle} · ${APP_TITLE}` },
7
8
  {
8
9
  name: "description",
9
10
  content: "Capture rough ideas in the inbox before they become tasks.",
@@ -1,9 +1,10 @@
1
1
  import { TaskListPage } from "@/components/tasks/TaskListPage";
2
+ import messages from "@/i18n/en-US";
2
3
  import { APP_TITLE } from "@/lib/app-config";
3
4
 
4
5
  export function meta() {
5
6
  return [
6
- { title: `Tasks · ${APP_TITLE}` },
7
+ { title: `${messages.tasks.pageTitle} · ${APP_TITLE}` },
7
8
  {
8
9
  name: "description",
9
10
  content:
@@ -1,17 +1,20 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
1
2
  import { TeamPage } from "@agent-native/core/client/org";
2
3
 
3
4
  import { useSetPageTitle } from "@/components/layout/HeaderActions";
5
+ import messages from "@/i18n/en-US";
4
6
  import { APP_TITLE } from "@/lib/app-config";
5
7
 
6
8
  export function meta() {
7
- return [{ title: `Team — ${APP_TITLE}` }];
9
+ return [{ title: `${messages.header.pageTeam} — ${APP_TITLE}` }];
8
10
  }
9
11
 
10
12
  export default function TeamRoute() {
11
- useSetPageTitle("Team");
13
+ const t = useT();
14
+ useSetPageTitle(t("header.pageTeam"));
12
15
  return (
13
16
  <main className="mx-auto w-full max-w-3xl px-4 py-6 sm:px-6 sm:py-10">
14
- <TeamPage createOrgDescription="Set up a team to share this app with your colleagues." />
17
+ <TeamPage createOrgDescription={t("team.createOrgDescription")} />
15
18
  </main>
16
19
  );
17
20
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-20
4
+ ---
5
+
6
+ Tasks is now available in 10 additional languages
@@ -1 +1 @@
1
- {"version":3,"file":"builder-engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0BH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,EAAE,kBAMlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,kLAAuC,CAAC;AAkB7E,eAAO,MAAM,qBAAqB,yCAAoC,CAAC;AA0vBvE,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,WAAW,CAEb"}
1
+ {"version":3,"file":"builder-engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA2BH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,EAAE,kBAMlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,kLAAuC,CAAC;AAkB7E,eAAO,MAAM,qBAAqB,yCAAoC,CAAC;AA6vBvE,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,WAAW,CAEb"}
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { captureError } from "../../server/capture-error.js";
16
16
  import { clearBuilderCredentialAuthFailure, resolveBuilderCredentials, getBuilderGatewayBaseUrl, recordBuilderCredentialAuthFailure, } from "../../server/credential-provider.js";
17
+ import { applyBuilderUtmTrackingParams } from "../../shared/builder-link-tracking.js";
17
18
  import { normalizeReasoningEffortForModel, } from "../../shared/reasoning-effort.js";
18
19
  import { isInBackgroundFunctionRuntime } from "../durable-background.js";
19
20
  import { BUILDER_MODEL_CONFIG } from "../model-config.js";
@@ -85,6 +86,9 @@ async function buildUpgradeUrl() {
85
86
  url.searchParams.set("agentNativeConnectSource", "gateway_quota_upgrade");
86
87
  url.searchParams.set("agentNativeFlow", "connect_llm");
87
88
  url.searchParams.set("framework", "agent-native");
89
+ applyBuilderUtmTrackingParams(url.searchParams, {
90
+ content: "gateway_quota_upgrade",
91
+ });
88
92
  return url.toString();
89
93
  }
90
94
  class BuilderEngine {