@agent-native/core 0.186.0-nightly-20260923174435 → 0.186.0

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 (105) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +6 -0
  3. package/corpus/templates/analytics/app/components/Markdown.tsx +3 -3
  4. package/corpus/templates/analytics/app/i18n/en-US.ts +1513 -3
  5. package/corpus/templates/analytics/app/routes/$.tsx +2 -2
  6. package/corpus/templates/analytics/app/routes/agents.tsx +2 -2
  7. package/corpus/templates/analytics/app/routes/analyses.$id.tsx +2 -2
  8. package/corpus/templates/analytics/app/routes/analyses._index.tsx +2 -2
  9. package/corpus/templates/analytics/app/routes/ask.tsx +2 -2
  10. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +2 -2
  11. package/corpus/templates/analytics/app/routes/data-dictionary.tsx +2 -2
  12. package/corpus/templates/analytics/app/routes/data-sources.tsx +2 -2
  13. package/corpus/templates/analytics/app/routes/extensions.$id.tsx +2 -2
  14. package/corpus/templates/analytics/app/routes/extensions._index.tsx +2 -2
  15. package/corpus/templates/analytics/app/routes/monitoring._index.tsx +2 -2
  16. package/corpus/templates/analytics/app/routes/sessions.$recordingId.tsx +2 -2
  17. package/corpus/templates/analytics/app/routes/sessions._index.tsx +2 -2
  18. package/corpus/templates/analytics/app/routes/settings.tsx +2 -2
  19. package/corpus/templates/analytics/app/routes/team.tsx +2 -2
  20. package/corpus/templates/analytics/changelog/2026-09-23-analytics-opens-faster-by-loading-translation-catalogs-and-r.md +6 -0
  21. package/corpus/templates/calendar/CHANGELOG.md +12 -0
  22. package/corpus/templates/calendar/app/i18n/en-US.ts +985 -3
  23. package/corpus/templates/calendar/app/i18n/index.ts +16 -11
  24. package/corpus/templates/calendar/app/routes/_app.$.tsx +2 -2
  25. package/corpus/templates/calendar/app/routes/_app.agent.tsx +2 -2
  26. package/corpus/templates/calendar/app/routes/_app.booking-links.tsx +2 -2
  27. package/corpus/templates/calendar/app/routes/_app.settings.tsx +2 -2
  28. package/corpus/templates/calendar/app/routes/_app.shared-availability.add.tsx +2 -4
  29. package/corpus/templates/calendar/app/routes/_app.team.tsx +2 -2
  30. package/corpus/templates/calendar/app/routes/booking-og-meta.ts +2 -2
  31. package/corpus/templates/calendar/app/routes/booking.manage.$token.tsx +2 -2
  32. package/corpus/templates/calendar/app/routes/event.tsx +2 -2
  33. package/corpus/templates/calendar/changelog/2026-09-23-calendar-opens-faster-by-loading-translated-catalogs-only-wh.md +6 -0
  34. package/corpus/templates/clips/CHANGELOG.md +10 -0
  35. package/corpus/templates/clips/app/components/library/recording-card.tsx +1 -1
  36. package/corpus/templates/clips/app/components/player/agent-view-count.tsx +61 -0
  37. package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +57 -72
  38. package/corpus/templates/clips/changelog/2026-09-23-insights-charts-load-only-when-opened-keeping-the-recording-.md +6 -0
  39. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +1 -1
  40. package/corpus/templates/content/app/components/layout/Header.tsx +1 -1
  41. package/corpus/templates/content/app/components/layout/Layout.tsx +5 -5
  42. package/corpus/templates/content/app/root.tsx +2 -1
  43. package/corpus/templates/design/.agents/skills/design-editor-architecture/SKILL.md +2 -2
  44. package/corpus/templates/design/CHANGELOG.md +7 -0
  45. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +55 -20
  46. package/corpus/templates/design/app/i18n/en-US.ts +1964 -21
  47. package/corpus/templates/design/app/pages/Index.tsx +5 -1
  48. package/corpus/templates/design/app/pages/Templates.tsx +5 -1
  49. package/corpus/templates/design/app/routes/$.tsx +2 -2
  50. package/corpus/templates/design/app/routes/design-systems.tsx +2 -2
  51. package/corpus/templates/design/app/routes/design-systems_.setup.tsx +2 -2
  52. package/corpus/templates/design/app/routes/design.$id.tsx +2 -2
  53. package/corpus/templates/design/app/routes/extensions.$id.tsx +2 -2
  54. package/corpus/templates/design/app/routes/extensions._index.tsx +2 -2
  55. package/corpus/templates/design/app/routes/extensions.tsx +2 -2
  56. package/corpus/templates/design/app/routes/observability.tsx +2 -2
  57. package/corpus/templates/design/app/routes/present.$id.tsx +2 -2
  58. package/corpus/templates/design/app/routes/settings.tsx +2 -2
  59. package/corpus/templates/design/app/routes/team.tsx +2 -2
  60. package/corpus/templates/design/app/routes/templates.tsx +2 -2
  61. package/corpus/templates/design/app/routes/visual-edit.tsx +2 -2
  62. package/corpus/templates/design/app/routes/visual-edit_.$id.tsx +2 -2
  63. package/corpus/templates/design/changelog/2026-09-23-design-loads-translated-catalogs-and-ai-prompt-tools-only-wh.md +6 -0
  64. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +56 -13
  65. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +2 -9
  66. package/corpus/templates/plan/app/lib/plan-return-path.ts +8 -0
  67. package/corpus/templates/slides/CHANGELOG.md +6 -0
  68. package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +6 -17
  69. package/corpus/templates/slides/app/components/editor/DeferredPopoverFallback.tsx +148 -0
  70. package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +7 -1
  71. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +66 -42
  72. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +7 -284
  73. package/corpus/templates/slides/app/lib/deferred-editor-surfaces.ts +25 -0
  74. package/corpus/templates/slides/app/lib/portaled-layer.ts +7 -0
  75. package/corpus/templates/slides/app/lib/prompt-file-uploads.ts +269 -0
  76. package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -0
  77. package/corpus/templates/slides/app/pages/Index.tsx +139 -52
  78. package/corpus/templates/slides/changelog/2026-09-23-slides-loads-ai-prompt-tools-and-extra-slide-controls-only-w.md +6 -0
  79. package/dist/client/agent-chat/index.d.ts +2 -1
  80. package/dist/client/agent-chat/index.js +1 -1
  81. package/dist/client/chat/assistant-chat-history-version.d.ts +13 -0
  82. package/dist/client/chat/assistant-chat-history-version.js +18 -0
  83. package/dist/client/chat/message-components.d.ts +3 -8
  84. package/dist/client/chat/message-components.js +2 -18
  85. package/dist/client/chat/run-recovery.js +2 -1
  86. package/dist/client/lazy-chunk-retry-fallback.d.ts +3 -0
  87. package/dist/client/lazy-chunk-retry-fallback.js +9 -0
  88. package/dist/client/settings/deferred-builder-connect-popover.d.ts +1 -3
  89. package/dist/client/settings/deferred-builder-connect-popover.js +3 -9
  90. package/dist/collab/awareness.d.ts +2 -2
  91. package/dist/collab/routes.d.ts +1 -1
  92. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  93. package/dist/notifications/routes.d.ts +3 -3
  94. package/dist/observability/routes.d.ts +8 -8
  95. package/dist/org/index.d.ts +1 -1
  96. package/dist/progress/routes.d.ts +1 -1
  97. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  98. package/dist/provider-api/actions/provider-api.d.ts +12 -12
  99. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  100. package/dist/secrets/routes.d.ts +3 -3
  101. package/dist/server/agent-engine-ollama-models-route.d.ts +1 -1
  102. package/package.json +8 -4
  103. package/corpus/templates/analytics/app/i18n-data.ts +0 -13975
  104. package/corpus/templates/calendar/app/i18n-data.ts +0 -10572
  105. package/corpus/templates/design/app/i18n-data.ts +0 -17719
@@ -1,14 +1,19 @@
1
- import {
2
- isLocaleCode,
3
- type AgentNativeI18nCatalog,
4
- } from "@agent-native/core/client/i18n";
1
+ import { createAgentNativeI18nCatalog } from "@agent-native/core/client/i18n";
5
2
 
6
- import { messagesByLocale } from "../i18n-data";
3
+ import enUS from "./en-US";
7
4
 
8
- export const i18nCatalog = {
9
- sourceLocale: "en-US",
10
- messages: messagesByLocale["en-US"],
11
- loadMessages: async (locale) => {
12
- return isLocaleCode(locale) ? (messagesByLocale[locale] ?? null) : null;
5
+ export const i18nCatalog = createAgentNativeI18nCatalog({
6
+ messages: enUS,
7
+ localeLoaders: {
8
+ "zh-CN": () => import("./zh-CN"),
9
+ "zh-TW": () => import("./zh-TW"),
10
+ "es-ES": () => import("./es-ES"),
11
+ "fr-FR": () => import("./fr-FR"),
12
+ "de-DE": () => import("./de-DE"),
13
+ "ja-JP": () => import("./ja-JP"),
14
+ "ko-KR": () => import("./ko-KR"),
15
+ "pt-BR": () => import("./pt-BR"),
16
+ "hi-IN": () => import("./hi-IN"),
17
+ "ar-SA": () => import("./ar-SA"),
13
18
  },
14
- } satisfies AgentNativeI18nCatalog;
19
+ });
@@ -1,8 +1,8 @@
1
- import { messagesByLocale } from "@/i18n-data";
1
+ import enUSMessages from "@/i18n/en-US";
2
2
  import NotFound from "@/pages/NotFound";
3
3
 
4
4
  export function meta() {
5
- return [{ title: messagesByLocale["en-US"].routeTitles.notFound }];
5
+ return [{ title: enUSMessages.routeTitles.notFound }];
6
6
  }
7
7
 
8
8
  export default function AppCatchAllRoute() {
@@ -1,10 +1,10 @@
1
1
  import { buildLegacyAgentSettingsRoute } from "@agent-native/core/client/navigation";
2
2
  import { Navigate, useLocation } from "react-router";
3
3
 
4
- import { messagesByLocale } from "@/i18n-data";
4
+ import enUSMessages from "@/i18n/en-US";
5
5
 
6
6
  export function meta() {
7
- return [{ title: messagesByLocale["en-US"].settings.agentTitle }];
7
+ return [{ title: enUSMessages.settings.agentTitle }];
8
8
  }
9
9
 
10
10
  export default function AgentRoute() {
@@ -1,9 +1,9 @@
1
1
  import { Outlet } from "react-router";
2
2
 
3
- import { messagesByLocale } from "@/i18n-data";
3
+ import enUSMessages from "@/i18n/en-US";
4
4
 
5
5
  export function meta() {
6
- return [{ title: messagesByLocale["en-US"].routeTitles.bookingLinks }];
6
+ return [{ title: enUSMessages.routeTitles.bookingLinks }];
7
7
  }
8
8
 
9
9
  export default function BookingLinksLayout() {
@@ -2,11 +2,11 @@ import { useT } from "@agent-native/core/client/i18n";
2
2
  import { useMemo } from "react";
3
3
 
4
4
  import { useAppHeaderControls } from "@/components/layout/AppLayout";
5
- import { messagesByLocale } from "@/i18n-data";
5
+ import enUSMessages from "@/i18n/en-US";
6
6
  import Settings from "@/pages/Settings";
7
7
 
8
8
  export function meta() {
9
- return [{ title: messagesByLocale["en-US"].routeTitles.settings }];
9
+ return [{ title: enUSMessages.routeTitles.settings }];
10
10
  }
11
11
 
12
12
  export default function SettingsRoute() {
@@ -1,10 +1,8 @@
1
- import { messagesByLocale } from "@/i18n-data";
1
+ import enUSMessages from "@/i18n/en-US";
2
2
  import AddSharedAvailability from "@/pages/AddSharedAvailability";
3
3
 
4
4
  export function meta() {
5
- return [
6
- { title: messagesByLocale["en-US"].routeTitles.addSharedAvailability },
7
- ];
5
+ return [{ title: enUSMessages.routeTitles.addSharedAvailability }];
8
6
  }
9
7
 
10
8
  export default function AddSharedAvailabilityRoute() {
@@ -1,9 +1,9 @@
1
1
  import { Navigate } from "react-router";
2
2
 
3
- import { messagesByLocale } from "@/i18n-data";
3
+ import enUSMessages from "@/i18n/en-US";
4
4
 
5
5
  export function meta() {
6
- return [{ title: messagesByLocale["en-US"].routeTitles.team }];
6
+ return [{ title: enUSMessages.routeTitles.team }];
7
7
  }
8
8
 
9
9
  export default function TeamRoute() {
@@ -5,7 +5,7 @@ import type {
5
5
  MetaDescriptor,
6
6
  } from "react-router";
7
7
 
8
- import { messagesByLocale } from "@/i18n-data";
8
+ import enUSMessages from "@/i18n/en-US";
9
9
 
10
10
  export interface BookingOgLoaderData {
11
11
  ogImageUrl: string;
@@ -51,7 +51,7 @@ export function bookingOgMeta({
51
51
  loaderData,
52
52
  }: MetaArgs<typeof bookingOgLoader>): MetaDescriptor[] {
53
53
  const image = loaderData?.ogImageUrl;
54
- const title = messagesByLocale["en-US"].routeTitles.bookMeeting;
54
+ const title = enUSMessages.routeTitles.bookMeeting;
55
55
  return [
56
56
  { title },
57
57
  { property: "og:title", content: title },
@@ -1,8 +1,8 @@
1
- import { messagesByLocale } from "@/i18n-data";
1
+ import enUSMessages from "@/i18n/en-US";
2
2
  import { ManageBookingPage } from "@/pages/ManageBookingPage";
3
3
 
4
4
  export function meta() {
5
- return [{ title: messagesByLocale["en-US"].routeTitles.manageBooking }];
5
+ return [{ title: enUSMessages.routeTitles.manageBooking }];
6
6
  }
7
7
 
8
8
  // Public page — no AppLayout wrapper
@@ -20,12 +20,12 @@ import { useEffect } from "react";
20
20
  import { useSearchParams } from "react-router";
21
21
 
22
22
  import { Button } from "@/components/ui/button";
23
- import { messagesByLocale } from "@/i18n-data";
23
+ import enUSMessages from "@/i18n/en-US";
24
24
 
25
25
  type EventPreviewResult = CalendarEvent | { error: string };
26
26
 
27
27
  export function meta() {
28
- return [{ title: messagesByLocale["en-US"].routeTitles.eventPreview }];
28
+ return [{ title: enUSMessages.routeTitles.eventPreview }];
29
29
  }
30
30
 
31
31
  function formatDuration(start: string, end: string): string {
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-09-23
4
+ ---
5
+
6
+ Calendar opens faster by loading translated catalogs only when you need them.
@@ -3,6 +3,16 @@
3
3
  All notable user-facing changes to Clips are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-23
7
+
8
+ ### Improved
9
+
10
+ - Insights charts load only when opened, keeping the recording library faster.
11
+
12
+ ### Fixed
13
+
14
+ - Long recording menus scroll within the visible space so every action stays reachable.
15
+
6
16
  ## 2026-09-22
7
17
 
8
18
  ### Added
@@ -22,7 +22,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
22
22
  import { Link } from "react-router";
23
23
 
24
24
  import { ClipsAvatar } from "@/components/clips-avatar";
25
- import { AgentViewCount } from "@/components/player/recording-views-badge";
25
+ import { AgentViewCount } from "@/components/player/agent-view-count";
26
26
  import { ViewedByPopover } from "@/components/sharing/viewed-by-popover";
27
27
  import { Button } from "@/components/ui/button";
28
28
  import { Checkbox } from "@/components/ui/checkbox";
@@ -0,0 +1,61 @@
1
+ import { IconBotId } from "@tabler/icons-react";
2
+
3
+ import { ClaudeLogo, CodexLogo } from "@/components/agent-destination-logos";
4
+ import { cn } from "@/lib/utils";
5
+
6
+ /** Compact agent-view indicator retained for library cards and other dense lists. */
7
+ export function AgentViewCount({
8
+ count,
9
+ label,
10
+ className,
11
+ }: {
12
+ count: number;
13
+ label: string;
14
+ className?: string;
15
+ }) {
16
+ return (
17
+ <span
18
+ title={label}
19
+ aria-label={label}
20
+ className={cn(
21
+ "inline-flex items-center gap-1 border-s border-border ps-2 tabular-nums",
22
+ className,
23
+ )}
24
+ >
25
+ <AgentViewerAvatar className="size-5" />
26
+ {count}
27
+ </span>
28
+ );
29
+ }
30
+
31
+ /** Agents use provider logos when the public API identifies the provider. */
32
+ export function AgentViewerAvatar({
33
+ agentLabel,
34
+ className,
35
+ }: {
36
+ agentLabel?: string | null;
37
+ className?: string;
38
+ }) {
39
+ const normalizedLabel = agentLabel?.toLowerCase() ?? "";
40
+ const logo = normalizedLabel.includes("claude") ? (
41
+ <ClaudeLogo className="size-3.5" />
42
+ ) : normalizedLabel.includes("openai") ||
43
+ normalizedLabel.includes("chatgpt") ||
44
+ normalizedLabel.includes("codex") ? (
45
+ <CodexLogo className="size-3.5" />
46
+ ) : (
47
+ <IconBotId className="size-3.5" />
48
+ );
49
+
50
+ return (
51
+ <span
52
+ aria-hidden
53
+ className={cn(
54
+ "flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",
55
+ className,
56
+ )}
57
+ >
58
+ {logo}
59
+ </span>
60
+ );
61
+ }
@@ -1,9 +1,10 @@
1
1
  import { useActionQuery, useAvatarUrl } from "@agent-native/core/client/hooks";
2
2
  import { useT } from "@agent-native/core/client/i18n";
3
- import { IconAlertTriangle, IconBotId, IconUser } from "@tabler/icons-react";
4
- import { useState } from "react";
3
+ import { LazyChunkErrorBoundary } from "@agent-native/core/client/lazy-chunk-error-boundary";
4
+ import { LazyChunkRetryFallback } from "@agent-native/core/client/lazy-chunk-retry-fallback";
5
+ import { IconAlertTriangle, IconUser } from "@tabler/icons-react";
6
+ import { lazy, Suspense, useState } from "react";
5
7
 
6
- import { ClaudeLogo, CodexLogo } from "@/components/agent-destination-logos";
7
8
  import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
8
9
  import { Button } from "@/components/ui/button";
9
10
  import {
@@ -23,9 +24,32 @@ import { Skeleton } from "@/components/ui/skeleton";
23
24
  import { Tabs, TabsContent } from "@/components/ui/tabs";
24
25
  import { cn } from "@/lib/utils";
25
26
 
26
- import { InsightsChart } from "./insights-chart";
27
+ import { AgentViewerAvatar } from "./agent-view-count";
27
28
  import { ViewerTabsList, ViewerTabsTrigger } from "./viewer-controls";
28
29
 
30
+ let insightsChartModule: Promise<typeof import("./insights-chart")> | undefined;
31
+
32
+ function loadInsightsChart() {
33
+ insightsChartModule ??= import("./insights-chart").catch((error) => {
34
+ insightsChartModule = undefined;
35
+ throw error;
36
+ });
37
+ return insightsChartModule;
38
+ }
39
+
40
+ const LazyInsightsChart = lazy(async () => {
41
+ const module = await loadInsightsChart();
42
+ return { default: module.InsightsChart };
43
+ });
44
+
45
+ function preloadInsightsChart() {
46
+ // Speculative loads are retried by the lazy render, where the error boundary
47
+ // can show the translated recovery action.
48
+ void loadInsightsChart().catch(() => {});
49
+ }
50
+
51
+ export { AgentViewCount, AgentViewerAvatar } from "./agent-view-count";
52
+
29
53
  interface ViewerRow {
30
54
  id: string;
31
55
  viewerEmail: string | null;
@@ -177,7 +201,11 @@ export function RecordingViewsBadge({
177
201
  <ViewerTabsTrigger value="views">
178
202
  {t("recordingInsights.viewsTab")}
179
203
  </ViewerTabsTrigger>
180
- <ViewerTabsTrigger value="insights">
204
+ <ViewerTabsTrigger
205
+ value="insights"
206
+ onPointerEnter={preloadInsightsChart}
207
+ onFocus={preloadInsightsChart}
208
+ >
181
209
  {t("recordingInsights.insightsTab")}
182
210
  </ViewerTabsTrigger>
183
211
  </ViewerTabsList>
@@ -275,17 +303,31 @@ export function RecordingViewsBadge({
275
303
  ) : agentViewersQuery.isLoading ? (
276
304
  <Skeleton className="h-[220px] w-full rounded-lg" />
277
305
  ) : (
278
- <InsightsChart
279
- views={insightViews}
280
- uniqueViewers={uniqueViewers}
281
- reactions={reactionCount}
282
- completionRate={
283
- agentViewersQuery.data?.completionRate ?? null
306
+ <LazyChunkErrorBoundary
307
+ fallback={
308
+ <div className="flex h-[220px] items-center justify-center">
309
+ <LazyChunkRetryFallback />
310
+ </div>
284
311
  }
285
- ctaConversionRate={
286
- agentViewersQuery.data?.ctaConversionRate ?? null
287
- }
288
- />
312
+ >
313
+ <Suspense
314
+ fallback={
315
+ <Skeleton className="h-[220px] w-full rounded-lg" />
316
+ }
317
+ >
318
+ <LazyInsightsChart
319
+ views={insightViews}
320
+ uniqueViewers={uniqueViewers}
321
+ reactions={reactionCount}
322
+ completionRate={
323
+ agentViewersQuery.data?.completionRate ?? null
324
+ }
325
+ ctaConversionRate={
326
+ agentViewersQuery.data?.ctaConversionRate ?? null
327
+ }
328
+ />
329
+ </Suspense>
330
+ </LazyChunkErrorBoundary>
289
331
  )}
290
332
  </TabsContent>
291
333
  </div>
@@ -351,63 +393,6 @@ function InsightsErrorState({
351
393
  );
352
394
  }
353
395
 
354
- /** Compact agent-view indicator retained for library cards and other dense lists. */
355
- export function AgentViewCount({
356
- count,
357
- label,
358
- className,
359
- }: {
360
- count: number;
361
- label: string;
362
- className?: string;
363
- }) {
364
- return (
365
- <span
366
- title={label}
367
- aria-label={label}
368
- className={cn(
369
- "inline-flex items-center gap-1 border-s border-border ps-2 tabular-nums",
370
- className,
371
- )}
372
- >
373
- <AgentViewerAvatar className="size-5" />
374
- {count}
375
- </span>
376
- );
377
- }
378
-
379
- /** Agents use provider logos when the public API identifies the provider. */
380
- export function AgentViewerAvatar({
381
- agentLabel,
382
- className,
383
- }: {
384
- agentLabel?: string | null;
385
- className?: string;
386
- }) {
387
- const normalizedLabel = agentLabel?.toLowerCase() ?? "";
388
- const logo = normalizedLabel.includes("claude") ? (
389
- <ClaudeLogo className="size-3.5" />
390
- ) : normalizedLabel.includes("openai") ||
391
- normalizedLabel.includes("chatgpt") ||
392
- normalizedLabel.includes("codex") ? (
393
- <CodexLogo className="size-3.5" />
394
- ) : (
395
- <IconBotId className="size-3.5" />
396
- );
397
-
398
- return (
399
- <span
400
- aria-hidden
401
- className={cn(
402
- "flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",
403
- className,
404
- )}
405
- >
406
- {logo}
407
- </span>
408
- );
409
- }
410
-
411
396
  /** Identity fields every viewer surface shares — `list-viewers` rows and the
412
397
  * leaner `topViewers` rows from `get-recording-insights` alike. */
413
398
  export interface ViewerIdentity {
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-09-23
4
+ ---
5
+
6
+ Insights charts load only when opened, keeping the recording library faster.
@@ -1,4 +1,4 @@
1
- import { AgentToggleButton } from "@agent-native/core/client/agent-chat";
1
+ import { AgentToggleButton } from "@agent-native/core/client/AgentSidebar";
2
2
  import { trackEvent } from "@agent-native/core/client/analytics";
3
3
  import { appPath } from "@agent-native/core/client/api-path";
4
4
  import { writeClipboardText } from "@agent-native/core/client/clipboard";
@@ -1,4 +1,4 @@
1
- import { AgentToggleButton } from "@agent-native/core/client/agent-chat";
1
+ import { AgentToggleButton } from "@agent-native/core/client/AgentSidebar";
2
2
  import {
3
3
  useHeaderTitle,
4
4
  useHeaderActions,
@@ -1,9 +1,9 @@
1
- import {
2
- AgentSidebar,
3
- isAssistantChatHistoryVersion,
4
- type AssistantChatHistoryConfig,
5
- type AssistantChatHistoryVersion,
1
+ import type {
2
+ AssistantChatHistoryConfig,
3
+ AssistantChatHistoryVersion,
6
4
  } from "@agent-native/core/client/agent-chat";
5
+ import { AgentSidebar } from "@agent-native/core/client/AgentSidebar";
6
+ import { isAssistantChatHistoryVersion } from "@agent-native/core/client/assistant-chat-history-version";
7
7
  import { getBrowserTabId } from "@agent-native/core/client/hooks";
8
8
  import { useT } from "@agent-native/core/client/i18n";
9
9
  import { InvitationBanner } from "@agent-native/core/client/org";
@@ -118,7 +118,8 @@ export function shouldRevalidate({
118
118
  const THEME_INIT_SCRIPT = getThemeInitScript("system", true);
119
119
 
120
120
  const LazyAgentSidebar = lazy(async () => {
121
- const { AgentSidebar } = await import("@agent-native/core/client/agent-chat");
121
+ const { AgentSidebar } =
122
+ await import("@agent-native/core/client/AgentSidebar");
122
123
  return { default: AgentSidebar };
123
124
  });
124
125
 
@@ -172,8 +172,8 @@ never had layer rows, a `data-smart-selection` attribute nobody built, a port
172
172
  (`9340`) nothing serves, and a Frame tool that grew a Frame/Screen split. So
173
173
  before changing product code, establish which side is wrong:
174
174
 
175
- - **Does the control exist?** `grep` the label and the i18n key. A label that
176
- lives only in `i18n-data.ts` is rendered nowhere.
175
+ - **Does the control exist?** `grep` the label and the i18n key. A translation
176
+ is rendered only when the active catalog loads its locale file.
177
177
  - **Does the gate allow it?** Read the condition, not the intent —
178
178
  `frameToolDraws === "screen"`, `canRenderAuthenticatedShare`,
179
179
  `responsiveInteractActive`. A test that skips the gate is the broken one.
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Design are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-23
7
+
8
+ ### Improved
9
+
10
+ - Design loads translated catalogs and AI prompt tools only when you need them.
11
+
6
12
  ## 2026-09-22
7
13
 
8
14
  ### Improved
@@ -13,6 +19,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
13
19
 
14
20
  ### Fixed
15
21
 
22
+ - Fixed the design system picker showing a still-indexing Builder design system as ready to use
16
23
  - Blocks can be selected with one click inside screens
17
24
  - Canvas edits on large designs now save even when version history can't be stored, with a one-time notice instead of a lost change.
18
25
  - Opening Design signed out inside an embedded tab now shows sign-in instead of a page whose actions all fail.
@@ -1,11 +1,12 @@
1
1
  import { trackEvent } from "@agent-native/core/client/analytics";
2
2
  import { appBasePath } from "@agent-native/core/client/api-path";
3
3
  import {
4
- PromptComposer,
5
4
  type PromptComposerSubmitOptions,
6
5
  useEagerFileUploads,
7
6
  } from "@agent-native/core/client/composer";
8
7
  import { useT } from "@agent-native/core/client/i18n";
8
+ import { LazyChunkErrorBoundary } from "@agent-native/core/client/lazy-chunk-error-boundary";
9
+ import { LazyChunkRetryFallback } from "@agent-native/core/client/lazy-chunk-retry-fallback";
9
10
  import { useOrg } from "@agent-native/core/client/org";
10
11
  import {
11
12
  EmbeddedApp,
@@ -22,7 +23,14 @@ import {
22
23
  IconUpload,
23
24
  IconX,
24
25
  } from "@tabler/icons-react";
25
- import { useState, useEffect, useCallback, useRef } from "react";
26
+ import {
27
+ lazy,
28
+ Suspense,
29
+ useState,
30
+ useEffect,
31
+ useCallback,
32
+ useRef,
33
+ } from "react";
26
34
  import { toast } from "sonner";
27
35
 
28
36
  import {
@@ -59,6 +67,16 @@ import {
59
67
  import { MAX_UPLOAD_BYTES, MAX_UPLOAD_MB } from "@/lib/upload-limits";
60
68
  import { cn } from "@/lib/utils";
61
69
 
70
+ const loadPromptComposer = () =>
71
+ import("@agent-native/core/client/composer").then(({ PromptComposer }) => ({
72
+ default: PromptComposer,
73
+ }));
74
+ const LazyPromptComposer = lazy(loadPromptComposer);
75
+
76
+ export function preloadPromptComposer() {
77
+ void loadPromptComposer().catch(() => {});
78
+ }
79
+
62
80
  export interface UploadedFile {
63
81
  path: string;
64
82
  originalName: string;
@@ -1000,25 +1018,42 @@ export default function PromptPopover({
1000
1018
  ) : null}
1001
1019
 
1002
1020
  <div className={cn("px-2 pb-2", showStartChoice && "hidden")}>
1003
- <PromptComposer
1004
- key={placeholder ?? t("home.describeBuild")}
1005
- autoFocus
1006
- attachmentsEnabled
1007
- disabled={loading || submitting}
1008
- placeholder={placeholder ?? t("home.describeBuild")}
1009
- onSubmit={handleSubmit}
1010
- onAttachmentsChange={handleAttachmentsChange}
1011
- draftScope={orgScopedDraftScope}
1012
- initialText={restoredPromptText}
1013
- initialTextKey={restoredPromptKey}
1014
- attachButton={
1015
- <PromptAttachmentMenu
1016
- disabled={loading || uploading || submitting}
1017
- onUploadFiles={handleUploadFiles}
1018
- onPickAsset={() => setAssetsPickerOpen(true)}
1021
+ <LazyChunkErrorBoundary fallback={<LazyChunkRetryFallback />}>
1022
+ <Suspense
1023
+ fallback={
1024
+ <div
1025
+ aria-busy="true"
1026
+ className="flex min-h-36 flex-col justify-between gap-3 rounded-md border border-input p-3"
1027
+ >
1028
+ <Skeleton className="h-16 w-full" />
1029
+ <div className="flex items-center justify-between gap-2">
1030
+ <Skeleton className="size-8" />
1031
+ <Skeleton className="h-8 w-24" />
1032
+ </div>
1033
+ </div>
1034
+ }
1035
+ >
1036
+ <LazyPromptComposer
1037
+ key={placeholder ?? t("home.describeBuild")}
1038
+ autoFocus
1039
+ attachmentsEnabled
1040
+ disabled={loading || submitting}
1041
+ placeholder={placeholder ?? t("home.describeBuild")}
1042
+ onSubmit={handleSubmit}
1043
+ onAttachmentsChange={handleAttachmentsChange}
1044
+ draftScope={orgScopedDraftScope}
1045
+ initialText={restoredPromptText}
1046
+ initialTextKey={restoredPromptKey}
1047
+ attachButton={
1048
+ <PromptAttachmentMenu
1049
+ disabled={loading || uploading || submitting}
1050
+ onUploadFiles={handleUploadFiles}
1051
+ onPickAsset={() => setAssetsPickerOpen(true)}
1052
+ />
1053
+ }
1019
1054
  />
1020
- }
1021
- />
1055
+ </Suspense>
1056
+ </LazyChunkErrorBoundary>
1022
1057
  </div>
1023
1058
  {!showStartChoice &&
1024
1059
  (onTemplateChange ||