@agent-native/core 0.76.10 → 0.76.11

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 (95) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +6 -0
  3. package/corpus/core/docs/content/locales/ar-SA/actions.md +7 -7
  4. package/corpus/core/docs/content/locales/ar-SA/template-plan.md +6 -4
  5. package/corpus/core/docs/content/locales/de-DE/actions.md +9 -9
  6. package/corpus/core/docs/content/locales/de-DE/template-plan.md +6 -4
  7. package/corpus/core/docs/content/locales/es-ES/actions.md +9 -9
  8. package/corpus/core/docs/content/locales/es-ES/template-plan.md +6 -4
  9. package/corpus/core/docs/content/locales/fr-FR/actions.md +9 -9
  10. package/corpus/core/docs/content/locales/fr-FR/template-plan.md +6 -4
  11. package/corpus/core/docs/content/locales/hi-IN/actions.md +9 -9
  12. package/corpus/core/docs/content/locales/hi-IN/template-plan.md +4 -4
  13. package/corpus/core/docs/content/locales/ja-JP/actions.md +9 -9
  14. package/corpus/core/docs/content/locales/ja-JP/template-plan.md +4 -4
  15. package/corpus/core/docs/content/locales/ko-KR/actions.md +9 -9
  16. package/corpus/core/docs/content/locales/ko-KR/template-plan.md +4 -4
  17. package/corpus/core/docs/content/locales/pt-BR/actions.md +9 -9
  18. package/corpus/core/docs/content/locales/pt-BR/template-plan.md +6 -4
  19. package/corpus/core/docs/content/locales/zh-CN/actions.md +9 -9
  20. package/corpus/core/docs/content/locales/zh-CN/template-plan.md +4 -4
  21. package/corpus/core/package.json +1 -1
  22. package/corpus/core/src/client/ErrorBoundary.tsx +151 -10
  23. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +51 -31
  24. package/corpus/templates/analytics/app/components/layout/DashboardHeader.tsx +26 -16
  25. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -2
  26. package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +8 -1
  27. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -5
  28. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +172 -107
  29. package/corpus/templates/analytics/app/i18n-data.ts +1076 -5
  30. package/corpus/templates/analytics/app/pages/Settings.tsx +2 -2
  31. package/corpus/templates/analytics/changelog/2026-06-24-analytics-navigation-command-palette-and-settings-now-honor-.md +6 -0
  32. package/corpus/templates/assets/app/components/layout/Header.tsx +0 -2
  33. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +0 -2
  34. package/corpus/templates/calendar/app/pages/CalendarView.tsx +0 -2
  35. package/corpus/templates/chat/app/components/layout/Header.tsx +1 -6
  36. package/corpus/templates/clips/app/components/layout/Header.tsx +1 -6
  37. package/corpus/templates/clips/app/hooks/use-library.ts +2 -0
  38. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +3 -1
  39. package/corpus/templates/clips/changelog/2026-06-24-archive-and-spaces-navigation-is-more-resilient-when-sidebar.md +6 -0
  40. package/corpus/templates/content/app/components/layout/Header.tsx +0 -2
  41. package/corpus/templates/design/app/components/layout/Header.tsx +1 -6
  42. package/corpus/templates/forms/app/components/layout/Header.tsx +1 -6
  43. package/corpus/templates/macros/app/components/layout/Header.tsx +1 -6
  44. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -2
  45. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +18 -12
  46. package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +9 -5
  47. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +36 -19
  48. package/corpus/templates/mail/app/components/email/EmailList.tsx +59 -55
  49. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +7 -3
  50. package/corpus/templates/mail/app/components/email/EmailThread.tsx +25 -16
  51. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +25 -19
  52. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +32 -17
  53. package/corpus/templates/mail/app/components/email/RecipientInput.tsx +26 -10
  54. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -3
  55. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +4 -2
  56. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +9 -5
  57. package/corpus/templates/mail/app/components/email/extensions/ComposeImageBlock.tsx +4 -2
  58. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +168 -86
  59. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +4 -2
  60. package/corpus/templates/mail/app/i18n/ar-SA.ts +212 -0
  61. package/corpus/templates/mail/app/i18n/de-DE.ts +212 -0
  62. package/corpus/templates/mail/app/i18n/en-US.ts +212 -0
  63. package/corpus/templates/mail/app/i18n/es-ES.ts +212 -0
  64. package/corpus/templates/mail/app/i18n/fr-FR.ts +212 -0
  65. package/corpus/templates/mail/app/i18n/hi-IN.ts +212 -0
  66. package/corpus/templates/mail/app/i18n/ja-JP.ts +212 -0
  67. package/corpus/templates/mail/app/i18n/ko-KR.ts +212 -0
  68. package/corpus/templates/mail/app/i18n/pt-BR.ts +212 -0
  69. package/corpus/templates/mail/app/i18n/zh-CN.ts +211 -0
  70. package/corpus/templates/mail/changelog/2026-06-24-interface-language-support-now-covers-more-mail-controls-and.md +6 -0
  71. package/corpus/templates/plan/app/components/layout/Header.tsx +1 -6
  72. package/corpus/templates/slides/app/components/layout/Header.tsx +1 -6
  73. package/corpus/templates/videos/app/components/layout/Header.tsx +1 -6
  74. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  75. package/dist/client/ErrorBoundary.js +128 -7
  76. package/dist/client/ErrorBoundary.js.map +1 -1
  77. package/docs/content/locales/ar-SA/actions.md +7 -7
  78. package/docs/content/locales/ar-SA/template-plan.md +6 -4
  79. package/docs/content/locales/de-DE/actions.md +9 -9
  80. package/docs/content/locales/de-DE/template-plan.md +6 -4
  81. package/docs/content/locales/es-ES/actions.md +9 -9
  82. package/docs/content/locales/es-ES/template-plan.md +6 -4
  83. package/docs/content/locales/fr-FR/actions.md +9 -9
  84. package/docs/content/locales/fr-FR/template-plan.md +6 -4
  85. package/docs/content/locales/hi-IN/actions.md +9 -9
  86. package/docs/content/locales/hi-IN/template-plan.md +4 -4
  87. package/docs/content/locales/ja-JP/actions.md +9 -9
  88. package/docs/content/locales/ja-JP/template-plan.md +4 -4
  89. package/docs/content/locales/ko-KR/actions.md +9 -9
  90. package/docs/content/locales/ko-KR/template-plan.md +4 -4
  91. package/docs/content/locales/pt-BR/actions.md +9 -9
  92. package/docs/content/locales/pt-BR/template-plan.md +6 -4
  93. package/docs/content/locales/zh-CN/actions.md +9 -9
  94. package/docs/content/locales/zh-CN/template-plan.md +4 -4
  95. package/package.json +1 -1
@@ -27,6 +27,7 @@ import {
27
27
  callAction,
28
28
  useChangeVersions,
29
29
  ChangelogDialog,
30
+ useT,
30
31
  } from "@agent-native/core/client";
31
32
  import { extensionPath } from "@agent-native/core/client/extensions";
32
33
  import changelog from "../../../CHANGELOG.md?raw";
@@ -50,10 +51,14 @@ interface ExtensionSearchItem {
50
51
  }
51
52
 
52
53
  const defaultTools = [
53
- { id: "explorer", name: "Explorer", href: "/dashboards/explorer" },
54
+ {
55
+ id: "explorer",
56
+ nameKey: "commandPalette.toolExplorer",
57
+ href: "/dashboards/explorer",
58
+ },
54
59
  {
55
60
  id: "customer-health",
56
- name: "Customer Health",
61
+ nameKey: "commandPalette.toolCustomerHealth",
57
62
  href: "/dashboards/customer-health",
58
63
  },
59
64
  ];
@@ -126,9 +131,9 @@ async function fetchExplorerDashboards(): Promise<ExplorerDashboard[]> {
126
131
  }
127
132
  }
128
133
 
129
- async function fetchSqlDashboards(): Promise<
130
- { id: string; name: string; hiddenAt: string | null }[]
131
- > {
134
+ async function fetchSqlDashboards(
135
+ t: (key: string) => string,
136
+ ): Promise<{ id: string; name: string; hiddenAt: string | null }[]> {
132
137
  try {
133
138
  const rows = await callAction(
134
139
  "list-sql-dashboards",
@@ -142,7 +147,7 @@ async function fetchSqlDashboards(): Promise<
142
147
  name:
143
148
  typeof d.name === "string" && d.name.trim().length > 0
144
149
  ? d.name
145
- : "Untitled dashboard",
150
+ : t("commandPalette.untitledDashboard"),
146
151
  hiddenAt: typeof d.hiddenAt === "string" ? d.hiddenAt : null,
147
152
  }));
148
153
  } catch {
@@ -183,6 +188,7 @@ function persistThemePreference(theme: "light" | "dark") {
183
188
  }
184
189
 
185
190
  export function CommandPalette() {
191
+ const t = useT();
186
192
  const [open, setOpen] = useState(false);
187
193
  const [changelogOpen, setChangelogOpen] = useState(false);
188
194
  const [searchQuery, setSearchQuery] = useState("");
@@ -213,7 +219,7 @@ export function CommandPalette() {
213
219
  const { data: sqlDashboards = [], isFetching: sqlDashboardsFetching } =
214
220
  useQuery({
215
221
  queryKey: ["sql-dashboards-palette", dashboardsSync],
216
- queryFn: fetchSqlDashboards,
222
+ queryFn: () => fetchSqlDashboards(t),
217
223
  staleTime: 30_000,
218
224
  enabled: open,
219
225
  placeholderData: (prev) => prev,
@@ -276,21 +282,24 @@ export function CommandPalette() {
276
282
  }}
277
283
  >
278
284
  <CommandInput
279
- placeholder="Search dashboards, extensions, charts..."
285
+ placeholder={t("commandPalette.searchPlaceholder")}
280
286
  value={searchQuery}
281
287
  onValueChange={setSearchQuery}
282
288
  />
283
289
  <CommandList>
284
290
  {!asyncGroupsLoading && (
285
- <CommandEmpty>No results found.</CommandEmpty>
291
+ <CommandEmpty>{t("commandPalette.noResults")}</CommandEmpty>
286
292
  )}
287
293
 
288
294
  {explorerDashboardsFetching && explorerDashboards.length === 0 && (
289
- <CommandLoadingGroup heading="Explorer Dashboards" rows={2} />
295
+ <CommandLoadingGroup
296
+ heading={t("commandPalette.groupExplorerDashboards")}
297
+ rows={2}
298
+ />
290
299
  )}
291
300
 
292
301
  {visibleExplorerDashboards.length > 0 && (
293
- <CommandGroup heading="Explorer Dashboards">
302
+ <CommandGroup heading={t("commandPalette.groupExplorerDashboards")}>
294
303
  {visibleExplorerDashboards.map((d) => (
295
304
  <CommandItem
296
305
  key={`ed-${d.id}`}
@@ -307,7 +316,7 @@ export function CommandPalette() {
307
316
  <span className="truncate">{d.name}</span>
308
317
  {d.hiddenAt ? (
309
318
  <span className="ms-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
310
- Hidden
319
+ {t("commandPalette.hidden")}
311
320
  </span>
312
321
  ) : null}
313
322
  </CommandItem>
@@ -316,11 +325,14 @@ export function CommandPalette() {
316
325
  )}
317
326
 
318
327
  {sqlDashboardsFetching && sqlDashboards.length === 0 && (
319
- <CommandLoadingGroup heading="SQL Dashboards" rows={3} />
328
+ <CommandLoadingGroup
329
+ heading={t("commandPalette.groupSqlDashboards")}
330
+ rows={3}
331
+ />
320
332
  )}
321
333
 
322
334
  {visibleSqlDashboards.length > 0 && (
323
- <CommandGroup heading="SQL Dashboards">
335
+ <CommandGroup heading={t("commandPalette.groupSqlDashboards")}>
324
336
  {visibleSqlDashboards.map((d) => (
325
337
  <CommandItem
326
338
  key={`sql-${d.id}`}
@@ -335,7 +347,7 @@ export function CommandPalette() {
335
347
  <span className="truncate">{d.name}</span>
336
348
  {d.hiddenAt ? (
337
349
  <span className="ms-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
338
- Hidden
350
+ {t("commandPalette.hidden")}
339
351
  </span>
340
352
  ) : null}
341
353
  </CommandItem>
@@ -344,11 +356,14 @@ export function CommandPalette() {
344
356
  )}
345
357
 
346
358
  {extensionsFetching && extensions.length === 0 && (
347
- <CommandLoadingGroup heading="Extensions" rows={3} />
359
+ <CommandLoadingGroup
360
+ heading={t("commandPalette.groupExtensions")}
361
+ rows={3}
362
+ />
348
363
  )}
349
364
 
350
365
  {extensions.length > 0 && (
351
- <CommandGroup heading="Extensions">
366
+ <CommandGroup heading={t("commandPalette.groupExtensions")}>
352
367
  {extensions.map((extension) => (
353
368
  <CommandItem
354
369
  key={`extension-${extension.id}`}
@@ -369,7 +384,7 @@ export function CommandPalette() {
369
384
  </CommandGroup>
370
385
  )}
371
386
 
372
- <CommandGroup heading="Dashboards">
387
+ <CommandGroup heading={t("commandPalette.groupDashboards")}>
373
388
  {dashboards.map((d) => (
374
389
  <CommandItem
375
390
  key={`dash-${d.id}`}
@@ -382,20 +397,20 @@ export function CommandPalette() {
382
397
  ))}
383
398
  </CommandGroup>
384
399
 
385
- <CommandGroup heading="Tools">
386
- {defaultTools.map((t) => (
400
+ <CommandGroup heading={t("commandPalette.groupTools")}>
401
+ {defaultTools.map((tool) => (
387
402
  <CommandItem
388
- key={`tool-${t.id}`}
389
- onSelect={() => go(t.href)}
390
- keywords={commandPaletteKeywords(t.name, "tool")}
403
+ key={`tool-${tool.id}`}
404
+ onSelect={() => go(tool.href)}
405
+ keywords={commandPaletteKeywords(t(tool.nameKey), "tool")}
391
406
  >
392
407
  <IconTool className="me-2 h-4 w-4 text-muted-foreground" />
393
- {t.name}
408
+ {t(tool.nameKey)}
394
409
  </CommandItem>
395
410
  ))}
396
411
  </CommandGroup>
397
412
 
398
- <CommandGroup heading="Appearance">
413
+ <CommandGroup heading={t("commandPalette.groupAppearance")}>
399
414
  <CommandItem
400
415
  onSelect={() => {
401
416
  const nextTheme = isDark ? "light" : "dark";
@@ -409,18 +424,20 @@ export function CommandPalette() {
409
424
  ) : (
410
425
  <IconMoon className="me-2 h-4 w-4 text-muted-foreground" />
411
426
  )}
412
- Toggle {isDark ? "light" : "dark"} mode
427
+ {isDark
428
+ ? t("commandPalette.toggleLightMode")
429
+ : t("commandPalette.toggleDarkMode")}
413
430
  </CommandItem>
414
431
  </CommandGroup>
415
432
 
416
- <CommandGroup heading="Help">
433
+ <CommandGroup heading={t("commandPalette.groupHelp")}>
417
434
  <CommandItem
418
435
  onSelect={() => {
419
436
  setOpen(false);
420
437
  setChangelogOpen(true);
421
438
  }}
422
439
  keywords={commandPaletteKeywords(
423
- "What's new",
440
+ t("commandPalette.whatsNew"),
424
441
  "changelog",
425
442
  "updates",
426
443
  "release notes",
@@ -428,16 +445,19 @@ export function CommandPalette() {
428
445
  )}
429
446
  >
430
447
  <IconHistory className="me-2 h-4 w-4 text-muted-foreground" />
431
- What's new
448
+ {t("commandPalette.whatsNew")}
432
449
  </CommandItem>
433
450
  </CommandGroup>
434
451
 
435
452
  {savedChartsFetching && savedCharts.length === 0 && (
436
- <CommandLoadingGroup heading="Saved Charts" rows={2} />
453
+ <CommandLoadingGroup
454
+ heading={t("commandPalette.groupSavedCharts")}
455
+ rows={2}
456
+ />
437
457
  )}
438
458
 
439
459
  {savedCharts.length > 0 && (
440
- <CommandGroup heading="Saved Charts">
460
+ <CommandGroup heading={t("commandPalette.groupSavedCharts")}>
441
461
  {savedCharts.map((c) => (
442
462
  <CommandItem
443
463
  key={`chart-${c.id}`}
@@ -2,6 +2,7 @@ import { IconUser, IconCalendar } from "@tabler/icons-react";
2
2
  import { useMemo } from "react";
3
3
  import { useParams } from "react-router";
4
4
  import { dashboards } from "@/pages/adhoc/registry";
5
+ import { useFormatters, useT } from "@agent-native/core/client";
5
6
 
6
7
  interface DashboardHeaderProps {
7
8
  title?: string;
@@ -15,12 +16,26 @@ export function DashboardHeader({
15
16
  actions,
16
17
  }: DashboardHeaderProps) {
17
18
  const { id } = useParams<{ id: string }>();
19
+ const t = useT();
20
+ const { formatDate } = useFormatters();
18
21
 
19
22
  const metadata = useMemo(() => {
20
23
  return dashboards.find((d) => d.id === id);
21
24
  }, [id]);
22
25
 
23
- const displayTitle = title || metadata?.name || "Dashboard";
26
+ const displayTitle = title || metadata?.name || t("navigation.dashboard");
27
+ const dateFormat: Intl.DateTimeFormatOptions = {
28
+ year: "numeric",
29
+ month: "short",
30
+ day: "numeric",
31
+ };
32
+ function formatMetadataDate(value: string): string {
33
+ try {
34
+ return formatDate(value, dateFormat);
35
+ } catch {
36
+ return value;
37
+ }
38
+ }
24
39
 
25
40
  return (
26
41
  <div className="mb-6 space-y-3">
@@ -51,13 +66,21 @@ export function DashboardHeader({
51
66
  {metadata.lastUpdated && (
52
67
  <div className="flex items-center gap-1.5">
53
68
  <IconCalendar className="h-3.5 w-3.5" />
54
- <span>Updated {formatDate(metadata.lastUpdated)}</span>
69
+ <span>
70
+ {t("dashboardHeader.updated", {
71
+ date: formatMetadataDate(metadata.lastUpdated),
72
+ })}
73
+ </span>
55
74
  </div>
56
75
  )}
57
76
  {metadata.dateCreated && (
58
77
  <div className="flex items-center gap-1.5">
59
78
  <IconCalendar className="h-3.5 w-3.5" />
60
- <span>Created {formatDate(metadata.dateCreated)}</span>
79
+ <span>
80
+ {t("dashboardHeader.created", {
81
+ date: formatMetadataDate(metadata.dateCreated),
82
+ })}
83
+ </span>
61
84
  </div>
62
85
  )}
63
86
  </div>
@@ -65,16 +88,3 @@ export function DashboardHeader({
65
88
  </div>
66
89
  );
67
90
  }
68
-
69
- function formatDate(dateStr: string): string {
70
- try {
71
- const date = new Date(dateStr);
72
- return date.toLocaleDateString("en-US", {
73
- year: "numeric",
74
- month: "short",
75
- day: "numeric",
76
- });
77
- } catch {
78
- return dateStr;
79
- }
80
- }
@@ -6,7 +6,7 @@ import {
6
6
  useHeaderTitle,
7
7
  useHeaderActions,
8
8
  } from "./HeaderActions";
9
- import { AgentToggleButton, LanguagePicker } from "@agent-native/core/client";
9
+ import { AgentToggleButton } from "@agent-native/core/client";
10
10
  import { RunsTray } from "@agent-native/core/client/progress";
11
11
  import { useT } from "@agent-native/core/client";
12
12
 
@@ -57,7 +57,6 @@ export function Header() {
57
57
  </div>
58
58
  <div className="flex items-center gap-2 shrink-0">
59
59
  {actions}
60
- <LanguagePicker variant="icon" />
61
60
  <RunsTray pollMs={1500} />
62
61
  <AgentToggleButton />
63
62
  </div>
@@ -4,6 +4,7 @@ import {
4
4
  type ReactNode,
5
5
  type FC,
6
6
  } from "react";
7
+ import { useT } from "@agent-native/core/client";
7
8
  import { Skeleton } from "@/components/ui/skeleton";
8
9
 
9
10
  /**
@@ -85,5 +86,11 @@ export function useSetHeaderActions(node: ReactNode) {
85
86
  }
86
87
 
87
88
  export function DashboardTitleSkeleton() {
88
- return <Skeleton className="h-6 w-56" aria-label="Loading dashboard title" />;
89
+ const t = useT();
90
+ return (
91
+ <Skeleton
92
+ className="h-6 w-56"
93
+ aria-label={t("navigation.loadingDashboardTitle")}
94
+ />
95
+ );
89
96
  }
@@ -121,11 +121,8 @@ export function Layout({ children }: LayoutProps) {
121
121
  questions={guidedQuestions}
122
122
  onSubmit={handleGuidedSubmit}
123
123
  onSkip={handleGuidedSkip}
124
- title={guidedTitle ?? "Clarify the dashboard"}
125
- description={
126
- guidedDescription ??
127
- "A few choices help the agent pick the right source, metrics, cuts, and layout before it writes SQL."
128
- }
124
+ title={guidedTitle ?? t("guidedQuestions.title")}
125
+ description={guidedDescription ?? t("guidedQuestions.description")}
129
126
  skipLabel={guidedSkipLabel}
130
127
  submitLabel={guidedSubmitLabel}
131
128
  />