@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +6 -0
- package/corpus/templates/analytics/app/components/Markdown.tsx +3 -3
- package/corpus/templates/analytics/app/i18n/en-US.ts +1513 -3
- package/corpus/templates/analytics/app/routes/$.tsx +2 -2
- package/corpus/templates/analytics/app/routes/agents.tsx +2 -2
- package/corpus/templates/analytics/app/routes/analyses.$id.tsx +2 -2
- package/corpus/templates/analytics/app/routes/analyses._index.tsx +2 -2
- package/corpus/templates/analytics/app/routes/ask.tsx +2 -2
- package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +2 -2
- package/corpus/templates/analytics/app/routes/data-dictionary.tsx +2 -2
- package/corpus/templates/analytics/app/routes/data-sources.tsx +2 -2
- package/corpus/templates/analytics/app/routes/extensions.$id.tsx +2 -2
- package/corpus/templates/analytics/app/routes/extensions._index.tsx +2 -2
- package/corpus/templates/analytics/app/routes/monitoring._index.tsx +2 -2
- package/corpus/templates/analytics/app/routes/sessions.$recordingId.tsx +2 -2
- package/corpus/templates/analytics/app/routes/sessions._index.tsx +2 -2
- package/corpus/templates/analytics/app/routes/settings.tsx +2 -2
- package/corpus/templates/analytics/app/routes/team.tsx +2 -2
- package/corpus/templates/analytics/changelog/2026-09-23-analytics-opens-faster-by-loading-translation-catalogs-and-r.md +6 -0
- package/corpus/templates/calendar/CHANGELOG.md +12 -0
- package/corpus/templates/calendar/app/i18n/en-US.ts +985 -3
- package/corpus/templates/calendar/app/i18n/index.ts +16 -11
- package/corpus/templates/calendar/app/routes/_app.$.tsx +2 -2
- package/corpus/templates/calendar/app/routes/_app.agent.tsx +2 -2
- package/corpus/templates/calendar/app/routes/_app.booking-links.tsx +2 -2
- package/corpus/templates/calendar/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/calendar/app/routes/_app.shared-availability.add.tsx +2 -4
- package/corpus/templates/calendar/app/routes/_app.team.tsx +2 -2
- package/corpus/templates/calendar/app/routes/booking-og-meta.ts +2 -2
- package/corpus/templates/calendar/app/routes/booking.manage.$token.tsx +2 -2
- package/corpus/templates/calendar/app/routes/event.tsx +2 -2
- package/corpus/templates/calendar/changelog/2026-09-23-calendar-opens-faster-by-loading-translated-catalogs-only-wh.md +6 -0
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/clips/app/components/library/recording-card.tsx +1 -1
- package/corpus/templates/clips/app/components/player/agent-view-count.tsx +61 -0
- package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +57 -72
- package/corpus/templates/clips/changelog/2026-09-23-insights-charts-load-only-when-opened-keeping-the-recording-.md +6 -0
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +1 -1
- package/corpus/templates/content/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/content/app/components/layout/Layout.tsx +5 -5
- package/corpus/templates/content/app/root.tsx +2 -1
- package/corpus/templates/design/.agents/skills/design-editor-architecture/SKILL.md +2 -2
- package/corpus/templates/design/CHANGELOG.md +7 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +55 -20
- package/corpus/templates/design/app/i18n/en-US.ts +1964 -21
- package/corpus/templates/design/app/pages/Index.tsx +5 -1
- package/corpus/templates/design/app/pages/Templates.tsx +5 -1
- package/corpus/templates/design/app/routes/$.tsx +2 -2
- package/corpus/templates/design/app/routes/design-systems.tsx +2 -2
- package/corpus/templates/design/app/routes/design-systems_.setup.tsx +2 -2
- package/corpus/templates/design/app/routes/design.$id.tsx +2 -2
- package/corpus/templates/design/app/routes/extensions.$id.tsx +2 -2
- package/corpus/templates/design/app/routes/extensions._index.tsx +2 -2
- package/corpus/templates/design/app/routes/extensions.tsx +2 -2
- package/corpus/templates/design/app/routes/observability.tsx +2 -2
- package/corpus/templates/design/app/routes/present.$id.tsx +2 -2
- package/corpus/templates/design/app/routes/settings.tsx +2 -2
- package/corpus/templates/design/app/routes/team.tsx +2 -2
- package/corpus/templates/design/app/routes/templates.tsx +2 -2
- package/corpus/templates/design/app/routes/visual-edit.tsx +2 -2
- package/corpus/templates/design/app/routes/visual-edit_.$id.tsx +2 -2
- package/corpus/templates/design/changelog/2026-09-23-design-loads-translated-catalogs-and-ai-prompt-tools-only-wh.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +56 -13
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +2 -9
- package/corpus/templates/plan/app/lib/plan-return-path.ts +8 -0
- package/corpus/templates/slides/CHANGELOG.md +6 -0
- package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +6 -17
- package/corpus/templates/slides/app/components/editor/DeferredPopoverFallback.tsx +148 -0
- package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +7 -1
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +66 -42
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +7 -284
- package/corpus/templates/slides/app/lib/deferred-editor-surfaces.ts +25 -0
- package/corpus/templates/slides/app/lib/portaled-layer.ts +7 -0
- package/corpus/templates/slides/app/lib/prompt-file-uploads.ts +269 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -0
- package/corpus/templates/slides/app/pages/Index.tsx +139 -52
- package/corpus/templates/slides/changelog/2026-09-23-slides-loads-ai-prompt-tools-and-extra-slide-controls-only-w.md +6 -0
- package/dist/client/agent-chat/index.d.ts +2 -1
- package/dist/client/agent-chat/index.js +1 -1
- package/dist/client/chat/assistant-chat-history-version.d.ts +13 -0
- package/dist/client/chat/assistant-chat-history-version.js +18 -0
- package/dist/client/chat/message-components.d.ts +3 -8
- package/dist/client/chat/message-components.js +2 -18
- package/dist/client/chat/run-recovery.js +2 -1
- package/dist/client/lazy-chunk-retry-fallback.d.ts +3 -0
- package/dist/client/lazy-chunk-retry-fallback.js +9 -0
- package/dist/client/settings/deferred-builder-connect-popover.d.ts +1 -3
- package/dist/client/settings/deferred-builder-connect-popover.js +3 -9
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +8 -8
- package/dist/org/index.d.ts +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +12 -12
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/secrets/routes.d.ts +3 -3
- package/dist/server/agent-engine-ollama-models-route.d.ts +1 -1
- package/package.json +8 -4
- package/corpus/templates/analytics/app/i18n-data.ts +0 -13975
- package/corpus/templates/calendar/app/i18n-data.ts +0 -10572
- 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
|
|
3
|
+
import enUS from "./en-US";
|
|
7
4
|
|
|
8
|
-
export const i18nCatalog = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
}
|
|
19
|
+
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import enUSMessages from "@/i18n/en-US";
|
|
2
2
|
import NotFound from "@/pages/NotFound";
|
|
3
3
|
|
|
4
4
|
export function meta() {
|
|
5
|
-
return [{ title:
|
|
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
|
|
4
|
+
import enUSMessages from "@/i18n/en-US";
|
|
5
5
|
|
|
6
6
|
export function meta() {
|
|
7
|
-
return [{ title:
|
|
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
|
|
3
|
+
import enUSMessages from "@/i18n/en-US";
|
|
4
4
|
|
|
5
5
|
export function meta() {
|
|
6
|
-
return [{ title:
|
|
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
|
|
5
|
+
import enUSMessages from "@/i18n/en-US";
|
|
6
6
|
import Settings from "@/pages/Settings";
|
|
7
7
|
|
|
8
8
|
export function meta() {
|
|
9
|
-
return [{ title:
|
|
9
|
+
return [{ title: enUSMessages.routeTitles.settings }];
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export default function SettingsRoute() {
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import
|
|
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
|
|
3
|
+
import enUSMessages from "@/i18n/en-US";
|
|
4
4
|
|
|
5
5
|
export function meta() {
|
|
6
|
-
return [{ title:
|
|
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
|
|
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 =
|
|
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
|
|
1
|
+
import enUSMessages from "@/i18n/en-US";
|
|
2
2
|
import { ManageBookingPage } from "@/pages/ManageBookingPage";
|
|
3
3
|
|
|
4
4
|
export function meta() {
|
|
5
|
-
return [{ title:
|
|
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
|
|
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:
|
|
28
|
+
return [{ title: enUSMessages.routeTitles.eventPreview }];
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
function formatDuration(start: string, end: string): string {
|
|
@@ -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/
|
|
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 {
|
|
4
|
-
import {
|
|
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 {
|
|
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
|
|
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
|
-
<
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
286
|
-
|
|
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 {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AgentToggleButton } from "@agent-native/core/client/
|
|
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,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
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 } =
|
|
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
|
|
176
|
-
|
|
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 {
|
|
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
|
-
<
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
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 ||
|