@agent-native/core 0.80.0 → 0.80.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +8 -0
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +14 -1
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +15 -1
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +15 -1
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +15 -1
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +15 -1
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +16 -1
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +14 -1
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +14 -1
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +14 -1
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +14 -1
- package/corpus/core/docs/content/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/template-design.mdx +14 -1
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/application-state/handlers.ts +1 -1
- package/corpus/core/src/brand-kit/index.ts +1 -1
- package/corpus/core/src/cli/skills.ts +18 -0
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
- package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
- package/corpus/core/src/extensions/path.ts +1 -4
- package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
- package/corpus/core/src/mcp/build-server.ts +1 -1
- package/corpus/core/src/org/handlers.ts +5 -5
- package/corpus/core/src/org/plugin.ts +2 -2
- package/corpus/core/src/scripts/call-agent.ts +1 -1
- package/corpus/core/src/scripts/db/safety.ts +1 -1
- package/corpus/core/src/server/auth.ts +3 -0
- package/corpus/core/src/server/builder-design-systems.ts +308 -0
- package/corpus/core/src/server/core-routes-plugin.ts +29 -3
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/styles/agent-native.css +14 -7
- package/corpus/core/src/usage/store.ts +2 -2
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
- package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +37 -0
- package/corpus/templates/analytics/app/i18n-data.ts +404 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +49 -26
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +137 -36
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
- package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +49 -26
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
- package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
- package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +29 -8
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
- package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
- package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
- package/corpus/templates/content/shared/document-export.ts +1 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +32 -5
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/design/actions/update-file.ts +9 -2
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +33 -75
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +72 -9
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +41 -39
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1029 -249
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +450 -101
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +978 -154
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -9
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +133 -66
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1234 -344
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +144 -94
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +301 -72
- package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +876 -286
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +30 -7
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +212 -155
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
- package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +487 -107
- package/corpus/templates/design/app/components/design/inspector/index.ts +27 -0
- package/corpus/templates/design/app/global.css +29 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +13 -0
- package/corpus/templates/design/app/i18n-data.ts +239 -1
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1023 -353
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
- package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
- package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
- package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
- package/corpus/templates/design/shared/code-layer.ts +209 -9
- package/corpus/templates/design/shared/html-content.ts +21 -0
- package/corpus/templates/design/shared/pen-path.ts +207 -0
- package/corpus/templates/mail/app/lib/utils.ts +2 -2
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
- package/corpus/templates/slides/AGENTS.md +3 -2
- package/corpus/templates/slides/actions/import-file.ts +26 -17
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
- package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
- package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
- package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
- package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
- package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
- package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
- package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
- package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
- package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
- package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
- package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
- package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
- package/dist/application-state/handlers.js +1 -1
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/brand-kit/index.d.ts +1 -1
- package/dist/brand-kit/index.js +1 -1
- package/dist/brand-kit/index.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +18 -0
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +1 -1
- package/dist/code-agents/transcript-normalizer.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/extensions/path.d.ts +1 -1
- package/dist/extensions/path.d.ts.map +1 -1
- package/dist/extensions/path.js.map +1 -1
- package/dist/integrations/a2a-continuation-processor.js +1 -1
- package/dist/integrations/a2a-continuation-processor.js.map +1 -1
- package/dist/mcp/build-server.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/handlers.js +5 -5
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.js +2 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/scripts/call-agent.js +1 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/safety.js +1 -1
- package/dist/scripts/db/safety.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +3 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +28 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -0
- package/dist/server/builder-design-systems.js +217 -0
- package/dist/server/builder-design-systems.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +20 -3
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +14 -7
- package/dist/usage/store.js +2 -2
- package/dist/usage/store.js.map +1 -1
- package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/docs/content/locales/ar-SA/template-design.mdx +14 -1
- package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/docs/content/locales/de-DE/template-design.mdx +15 -1
- package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/docs/content/locales/es-ES/template-design.mdx +15 -1
- package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/docs/content/locales/fr-FR/template-design.mdx +15 -1
- package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/docs/content/locales/hi-IN/template-design.mdx +15 -1
- package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/docs/content/locales/ja-JP/template-design.mdx +16 -1
- package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/docs/content/locales/ko-KR/template-design.mdx +14 -1
- package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/docs/content/locales/pt-BR/template-design.mdx +14 -1
- package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-CN/template-design.mdx +14 -1
- package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-TW/template-design.mdx +14 -1
- package/docs/content/skills-guide.mdx +5 -0
- package/docs/content/template-design.mdx +14 -1
- package/package.json +1 -1
- package/corpus/templates/design/actions/import-figma-file.ts +0 -166
- package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
|
@@ -2,7 +2,6 @@ import {
|
|
|
2
2
|
sendToAgentChat,
|
|
3
3
|
openAgentSidebar,
|
|
4
4
|
useActionQuery,
|
|
5
|
-
useActionMutation,
|
|
6
5
|
appApiPath,
|
|
7
6
|
useT,
|
|
8
7
|
} from "@agent-native/core/client";
|
|
@@ -18,8 +17,8 @@ import {
|
|
|
18
17
|
IconPhoto,
|
|
19
18
|
IconPalette,
|
|
20
19
|
IconCheck,
|
|
20
|
+
IconExternalLink,
|
|
21
21
|
} from "@tabler/icons-react";
|
|
22
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
23
22
|
import { useState, useCallback, useRef, useMemo, useEffect } from "react";
|
|
24
23
|
import { useNavigate, useSearchParams } from "react-router";
|
|
25
24
|
import { toast } from "sonner";
|
|
@@ -48,31 +47,13 @@ interface UploadedFile {
|
|
|
48
47
|
|
|
49
48
|
interface FigImportResult {
|
|
50
49
|
ok: boolean;
|
|
50
|
+
source: "builder";
|
|
51
51
|
suggestedTitle: string;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
headingWeight?: string;
|
|
58
|
-
bodyWeight?: string;
|
|
59
|
-
headingSizes?: { h1?: string; h2?: string; h3?: string };
|
|
60
|
-
};
|
|
61
|
-
spacing?: Record<string, string>;
|
|
62
|
-
borders?: Record<string, string>;
|
|
63
|
-
defaults?: Record<string, string>;
|
|
64
|
-
customCSS?: string;
|
|
65
|
-
notes?: string;
|
|
66
|
-
};
|
|
67
|
-
customInstructions: string;
|
|
68
|
-
preview: {
|
|
69
|
-
gradients: string[];
|
|
70
|
-
palette: { hex: string; name?: string; count: number }[];
|
|
71
|
-
namedColors: Record<string, string>;
|
|
72
|
-
thumbnailDataUrl: string | null;
|
|
73
|
-
nodeCount: number;
|
|
74
|
-
imageCount: number;
|
|
75
|
-
};
|
|
52
|
+
projectId: string;
|
|
53
|
+
jobId: string;
|
|
54
|
+
designSystemId: string;
|
|
55
|
+
builderUrl: string;
|
|
56
|
+
status: "in-progress";
|
|
76
57
|
}
|
|
77
58
|
|
|
78
59
|
export default function DesignSystemSetup() {
|
|
@@ -113,15 +94,11 @@ export default function DesignSystemSetup() {
|
|
|
113
94
|
const existingProjects = designsData?.designs ?? [];
|
|
114
95
|
const existingSystems = designSystemsData?.designSystems ?? [];
|
|
115
96
|
|
|
116
|
-
// --- Figma .fig import (
|
|
117
|
-
const queryClient = useQueryClient();
|
|
118
|
-
const createSystemMutation = useActionMutation("create-design-system");
|
|
97
|
+
// --- Figma .fig import (Builder design-system indexing) -----------------
|
|
119
98
|
const realFigInputRef = useRef<HTMLInputElement>(null);
|
|
120
99
|
const [figParsing, setFigParsing] = useState(false);
|
|
121
100
|
const [figResult, setFigResult] = useState<FigImportResult | null>(null);
|
|
122
101
|
const [figError, setFigError] = useState<string | null>(null);
|
|
123
|
-
const [figTitle, setFigTitle] = useState("");
|
|
124
|
-
const [figCreating, setFigCreating] = useState(false);
|
|
125
102
|
|
|
126
103
|
const handleFigImport = useCallback(
|
|
127
104
|
async (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
@@ -147,10 +124,6 @@ export default function DesignSystemSetup() {
|
|
|
147
124
|
throw new Error(json?.error || `Upload failed (${res.status})`);
|
|
148
125
|
}
|
|
149
126
|
setFigResult(json as FigImportResult);
|
|
150
|
-
setFigTitle(
|
|
151
|
-
(json as FigImportResult).suggestedTitle ||
|
|
152
|
-
t("designSystemSetup.importedBrand"),
|
|
153
|
-
);
|
|
154
127
|
} catch (err) {
|
|
155
128
|
setFigError(
|
|
156
129
|
err instanceof Error
|
|
@@ -164,37 +137,6 @@ export default function DesignSystemSetup() {
|
|
|
164
137
|
[t],
|
|
165
138
|
);
|
|
166
139
|
|
|
167
|
-
const handleCreateFromFig = useCallback(async () => {
|
|
168
|
-
if (!figResult) return;
|
|
169
|
-
const title =
|
|
170
|
-
figTitle.trim() ||
|
|
171
|
-
figResult.suggestedTitle ||
|
|
172
|
-
t("designSystemSetup.importedBrand");
|
|
173
|
-
setFigCreating(true);
|
|
174
|
-
try {
|
|
175
|
-
const created = (await createSystemMutation.mutateAsync({
|
|
176
|
-
title,
|
|
177
|
-
data: JSON.stringify(figResult.data),
|
|
178
|
-
customInstructions: figResult.customInstructions || "",
|
|
179
|
-
} as any)) as { id?: string } | undefined;
|
|
180
|
-
await queryClient.invalidateQueries({
|
|
181
|
-
queryKey: ["action", "list-design-systems"],
|
|
182
|
-
});
|
|
183
|
-
toast.success(t("designSystemSetup.figmaCreateSuccess"));
|
|
184
|
-
navigate(
|
|
185
|
-
created?.id
|
|
186
|
-
? `/design-systems?designSystemId=${encodeURIComponent(created.id)}`
|
|
187
|
-
: "/design-systems",
|
|
188
|
-
);
|
|
189
|
-
} catch (err) {
|
|
190
|
-
setFigCreating(false);
|
|
191
|
-
toast.error(t("designSystemSetup.figmaCreateError"), {
|
|
192
|
-
description:
|
|
193
|
-
err instanceof Error ? err.message : t("common.genericError"),
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}, [figResult, figTitle, createSystemMutation, queryClient, navigate, t]);
|
|
197
|
-
|
|
198
140
|
useEffect(() => {
|
|
199
141
|
if (!sourceId || appliedSourceIdRef.current === sourceId) return;
|
|
200
142
|
const sourceExists =
|
|
@@ -416,7 +358,7 @@ export default function DesignSystemSetup() {
|
|
|
416
358
|
|
|
417
359
|
if (normalizedGithubLinks.length > 0) {
|
|
418
360
|
parts.push(
|
|
419
|
-
`\n## GitHub Repositories\
|
|
361
|
+
`\n## GitHub Repositories\nStart Builder design-system indexing for each repository with \`index-design-system-with-builder\`:\n${normalizedGithubLinks.map((l) => `- ${l.url}`).join("\n")}\n\nBuilder is the source of truth for repo/code design-system indexing. The action also creates a local selectable proxy design system for Design flows. If Builder is not connected, stop and tell me to connect Builder from Settings instead of asking me to paste repository credentials into chat.`,
|
|
420
362
|
);
|
|
421
363
|
}
|
|
422
364
|
|
|
@@ -426,7 +368,7 @@ export default function DesignSystemSetup() {
|
|
|
426
368
|
|
|
427
369
|
if (withContent.length > 0) {
|
|
428
370
|
parts.push(
|
|
429
|
-
`\n## Code Files (${withContent.length} files with content)\
|
|
371
|
+
`\n## Code Files (${withContent.length} files with content)\nStart Builder design-system indexing with \`index-design-system-with-builder\` using these files:`,
|
|
430
372
|
);
|
|
431
373
|
for (const f of withContent) {
|
|
432
374
|
parts.push(
|
|
@@ -485,12 +427,12 @@ export default function DesignSystemSetup() {
|
|
|
485
427
|
|
|
486
428
|
if (customInstructions.trim()) {
|
|
487
429
|
parts.push(
|
|
488
|
-
`\n## Custom Instructions (durable — store on the design system)\
|
|
430
|
+
`\n## Custom Instructions (durable — store on the design system)\nIf you create a local design system from non-Builder sources, pass these verbatim as the \`customInstructions\` argument. They will be re-applied every time the design system is used to generate a design:\n\n${customInstructions.trim()}`,
|
|
489
431
|
);
|
|
490
432
|
}
|
|
491
433
|
|
|
492
434
|
parts.push(
|
|
493
|
-
`\n---\nAfter processing all sources, call \`create-design-system\` with the combined tokens${
|
|
435
|
+
`\n---\nAfter processing all sources, if you started Builder design-system indexing, report the Builder job/design-system URL plus the local selectable design-system id returned by \`index-design-system-with-builder\`. Do not call \`create-design-system\` again for those Builder-indexed sources. If you processed non-Builder sources into concrete tokens, call \`create-design-system\` with the combined tokens${
|
|
494
436
|
customInstructions.trim()
|
|
495
437
|
? " AND the verbatim --customInstructions string from above"
|
|
496
438
|
: ""
|
|
@@ -626,10 +568,6 @@ export default function DesignSystemSetup() {
|
|
|
626
568
|
) : (
|
|
627
569
|
<FigImportPreview
|
|
628
570
|
result={figResult}
|
|
629
|
-
title={figTitle}
|
|
630
|
-
onTitleChange={setFigTitle}
|
|
631
|
-
creating={figCreating}
|
|
632
|
-
onCreate={handleCreateFromFig}
|
|
633
571
|
onReset={() => {
|
|
634
572
|
setFigResult(null);
|
|
635
573
|
setFigError(null);
|
|
@@ -1100,168 +1038,66 @@ function FileList({
|
|
|
1100
1038
|
|
|
1101
1039
|
function FigImportPreview({
|
|
1102
1040
|
result,
|
|
1103
|
-
title,
|
|
1104
|
-
onTitleChange,
|
|
1105
|
-
creating,
|
|
1106
|
-
onCreate,
|
|
1107
1041
|
onReset,
|
|
1108
1042
|
}: {
|
|
1109
1043
|
result: FigImportResult;
|
|
1110
|
-
title: string;
|
|
1111
|
-
onTitleChange: (v: string) => void;
|
|
1112
|
-
creating: boolean;
|
|
1113
|
-
onCreate: () => void;
|
|
1114
1044
|
onReset: () => void;
|
|
1115
1045
|
}) {
|
|
1116
1046
|
const t = useT();
|
|
1117
|
-
const colors = result.data.colors ?? {};
|
|
1118
|
-
const colorEntries = (
|
|
1119
|
-
[
|
|
1120
|
-
[t("designSystemSetup.colorLabels.accent"), "accent"],
|
|
1121
|
-
[t("designSystemSetup.colorLabels.primary"), "primary"],
|
|
1122
|
-
[t("designSystemSetup.colorLabels.secondary"), "secondary"],
|
|
1123
|
-
[t("designSystemSetup.colorLabels.background"), "background"],
|
|
1124
|
-
[t("designSystemSetup.colorLabels.surface"), "surface"],
|
|
1125
|
-
[t("designSystemSetup.colorLabels.text"), "text"],
|
|
1126
|
-
[t("designSystemSetup.colorLabels.muted"), "textMuted"],
|
|
1127
|
-
] as const
|
|
1128
|
-
).filter(([, k]) => colors[k]);
|
|
1129
|
-
const typo = result.data.typography ?? {};
|
|
1130
|
-
const gradients = result.preview.gradients ?? [];
|
|
1131
1047
|
|
|
1132
1048
|
return (
|
|
1133
|
-
<div className="space-y-
|
|
1134
|
-
<div className="flex items-start gap-
|
|
1135
|
-
|
|
1136
|
-
<
|
|
1137
|
-
|
|
1138
|
-
alt={t("designSystemSetup.figmaThumbnailAlt")}
|
|
1139
|
-
className="h-20 w-28 shrink-0 rounded-md border border-border object-cover"
|
|
1140
|
-
/>
|
|
1141
|
-
) : null}
|
|
1049
|
+
<div className="space-y-4 rounded-xl border border-border bg-card p-4">
|
|
1050
|
+
<div className="flex items-start gap-3">
|
|
1051
|
+
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[#609FF8]/10">
|
|
1052
|
+
<IconBrandFigma className="h-5 w-5 text-[#609FF8]" />
|
|
1053
|
+
</div>
|
|
1142
1054
|
<div className="min-w-0 flex-1">
|
|
1143
|
-
<
|
|
1144
|
-
{
|
|
1145
|
-
</
|
|
1146
|
-
<
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
placeholder={t("designSystemSetup.brandNamePlaceholder")}
|
|
1151
|
-
/>
|
|
1152
|
-
<p className="mt-2 text-xs text-muted-foreground/70">
|
|
1153
|
-
{t("designSystemSetup.extractedSummary", {
|
|
1154
|
-
nodes: result.preview.nodeCount.toLocaleString(),
|
|
1155
|
-
gradients: gradients.length,
|
|
1156
|
-
images: result.preview.imageCount,
|
|
1157
|
-
})}
|
|
1055
|
+
<h3 className="text-sm font-semibold text-foreground">
|
|
1056
|
+
{result.suggestedTitle}
|
|
1057
|
+
</h3>
|
|
1058
|
+
<p className="mt-1 text-xs leading-relaxed text-muted-foreground">
|
|
1059
|
+
{
|
|
1060
|
+
"Builder is indexing this Figma file into a reusable design system." /* i18n-ignore Builder indexing status */
|
|
1061
|
+
}
|
|
1158
1062
|
</p>
|
|
1159
1063
|
</div>
|
|
1160
1064
|
</div>
|
|
1161
1065
|
|
|
1162
|
-
|
|
1163
|
-
<
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
{gradients.length > 0 && (
|
|
1187
|
-
<div>
|
|
1188
|
-
<h4 className="mb-2 text-xs font-medium uppercase text-muted-foreground">
|
|
1189
|
-
{t("designSystemSetup.signatureGradients")}
|
|
1190
|
-
</h4>
|
|
1191
|
-
<div className="flex flex-wrap gap-2">
|
|
1192
|
-
{gradients.slice(0, 4).map((g, i) => (
|
|
1193
|
-
<div
|
|
1194
|
-
key={i}
|
|
1195
|
-
className="h-10 w-28 rounded-md border border-border"
|
|
1196
|
-
style={{ backgroundImage: g }}
|
|
1197
|
-
title={g}
|
|
1198
|
-
/>
|
|
1199
|
-
))}
|
|
1200
|
-
</div>
|
|
1201
|
-
</div>
|
|
1202
|
-
)}
|
|
1203
|
-
|
|
1204
|
-
{(typo.headingFont || typo.bodyFont) && (
|
|
1205
|
-
<div>
|
|
1206
|
-
<h4 className="mb-2 text-xs font-medium uppercase text-muted-foreground">
|
|
1207
|
-
{t("designSystemSetup.previewTypography")}
|
|
1208
|
-
</h4>
|
|
1209
|
-
<div className="text-sm text-foreground/80">
|
|
1210
|
-
{typo.headingFont && (
|
|
1211
|
-
<span>
|
|
1212
|
-
<span className="text-muted-foreground">
|
|
1213
|
-
{t("designSystemSetup.headingsLabel")}
|
|
1214
|
-
</span>{" "}
|
|
1215
|
-
{typo.headingFont}
|
|
1216
|
-
{typo.headingWeight ? ` ${typo.headingWeight}` : ""}
|
|
1217
|
-
</span>
|
|
1218
|
-
)}
|
|
1219
|
-
{typo.bodyFont && (
|
|
1220
|
-
<span className="ml-4">
|
|
1221
|
-
<span className="text-muted-foreground">
|
|
1222
|
-
{t("designSystemSetup.bodyLabel")}
|
|
1223
|
-
</span>{" "}
|
|
1224
|
-
{typo.bodyFont}
|
|
1225
|
-
</span>
|
|
1226
|
-
)}
|
|
1227
|
-
</div>
|
|
1228
|
-
</div>
|
|
1229
|
-
)}
|
|
1230
|
-
|
|
1231
|
-
{result.customInstructions && (
|
|
1232
|
-
<div>
|
|
1233
|
-
<h4 className="mb-2 text-xs font-medium uppercase text-muted-foreground">
|
|
1234
|
-
{t("designSystemSetup.brandBrief")}
|
|
1235
|
-
</h4>
|
|
1236
|
-
<div className="max-h-40 overflow-y-auto whitespace-pre-wrap rounded-md border border-border bg-muted/30 p-3 text-xs leading-relaxed text-muted-foreground">
|
|
1237
|
-
{result.customInstructions}
|
|
1238
|
-
</div>
|
|
1239
|
-
<p className="mt-1 text-[11px] text-muted-foreground/60">
|
|
1240
|
-
{t("designSystemSetup.brandBriefHelp")}
|
|
1241
|
-
</p>
|
|
1242
|
-
</div>
|
|
1243
|
-
)}
|
|
1066
|
+
<dl className="grid grid-cols-[112px_minmax(0,1fr)] gap-x-3 gap-y-2 rounded-lg border border-border bg-muted/25 p-3 text-xs">
|
|
1067
|
+
<dt className="text-muted-foreground">
|
|
1068
|
+
{"Status" /* i18n-ignore Builder indexing field */}
|
|
1069
|
+
</dt>
|
|
1070
|
+
<dd className="font-medium text-foreground">{result.status}</dd>
|
|
1071
|
+
<dt className="text-muted-foreground">
|
|
1072
|
+
{"Project" /* i18n-ignore Builder indexing field */}
|
|
1073
|
+
</dt>
|
|
1074
|
+
<dd className="truncate font-mono text-[11px] text-foreground/80">
|
|
1075
|
+
{result.projectId}
|
|
1076
|
+
</dd>
|
|
1077
|
+
<dt className="text-muted-foreground">
|
|
1078
|
+
{"Job" /* i18n-ignore Builder indexing field */}
|
|
1079
|
+
</dt>
|
|
1080
|
+
<dd className="truncate font-mono text-[11px] text-foreground/80">
|
|
1081
|
+
{result.jobId}
|
|
1082
|
+
</dd>
|
|
1083
|
+
<dt className="text-muted-foreground">
|
|
1084
|
+
{"Design system" /* i18n-ignore Builder indexing field */}
|
|
1085
|
+
</dt>
|
|
1086
|
+
<dd className="truncate font-mono text-[11px] text-foreground/80">
|
|
1087
|
+
{result.designSystemId}
|
|
1088
|
+
</dd>
|
|
1089
|
+
</dl>
|
|
1244
1090
|
|
|
1245
1091
|
<div className="flex items-center gap-2 border-t border-border pt-4">
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
) : (
|
|
1256
|
-
t("designSystemSetup.createDesignSystem")
|
|
1257
|
-
)}
|
|
1258
|
-
</Button>
|
|
1259
|
-
<Button
|
|
1260
|
-
variant="ghost"
|
|
1261
|
-
onClick={onReset}
|
|
1262
|
-
disabled={creating}
|
|
1263
|
-
className="cursor-pointer"
|
|
1264
|
-
>
|
|
1092
|
+
{result.builderUrl ? (
|
|
1093
|
+
<Button asChild className="cursor-pointer">
|
|
1094
|
+
<a href={result.builderUrl} target="_blank" rel="noreferrer">
|
|
1095
|
+
<IconExternalLink className="size-4" />
|
|
1096
|
+
{"Open in Builder" /* i18n-ignore Builder link action */}
|
|
1097
|
+
</a>
|
|
1098
|
+
</Button>
|
|
1099
|
+
) : null}
|
|
1100
|
+
<Button variant="ghost" onClick={onReset} className="cursor-pointer">
|
|
1265
1101
|
{t("designSystemSetup.chooseDifferentFile")}
|
|
1266
1102
|
</Button>
|
|
1267
1103
|
</div>
|
|
@@ -1,63 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
FeatureNotConfiguredError,
|
|
3
|
+
getSession,
|
|
4
|
+
startBuilderDesignSystemIndex,
|
|
5
|
+
} from "@agent-native/core/server";
|
|
6
6
|
import {
|
|
7
7
|
defineEventHandler,
|
|
8
8
|
readMultipartFormData,
|
|
9
9
|
setResponseStatus,
|
|
10
10
|
} from "h3";
|
|
11
11
|
|
|
12
|
-
import type { DesignSystemData } from "../../shared/api.js";
|
|
13
|
-
|
|
14
|
-
// .fig files can be large (the document is a kiwi-compressed canvas). Cap to
|
|
15
|
-
// keep memory bounded — typical brand files are well under this.
|
|
16
12
|
const MAX_FIG_BYTES = 200 * 1024 * 1024;
|
|
17
13
|
|
|
18
|
-
/** Fill any tokens the extractor couldn't determine with sane defaults, so the
|
|
19
|
-
* resulting design system is a complete, usable DesignSystemData. */
|
|
20
|
-
function withDefaults(partial: Partial<DesignSystemData>): DesignSystemData {
|
|
21
|
-
const dark = partial.defaults?.background === "dark";
|
|
22
|
-
return {
|
|
23
|
-
colors: {
|
|
24
|
-
primary: "#0F172A",
|
|
25
|
-
secondary: "#1E293B",
|
|
26
|
-
accent: "#2684FF",
|
|
27
|
-
background: dark ? "#0B1220" : "#FFFFFF",
|
|
28
|
-
surface: dark ? "#111827" : "#F8FAFC",
|
|
29
|
-
text: dark ? "#F8FAFC" : "#0F172A",
|
|
30
|
-
textMuted: dark ? "#94A3B8" : "#64748B",
|
|
31
|
-
...partial.colors,
|
|
32
|
-
},
|
|
33
|
-
typography: {
|
|
34
|
-
headingFont: "Sora",
|
|
35
|
-
bodyFont: "Inter",
|
|
36
|
-
headingWeight: "700",
|
|
37
|
-
bodyWeight: "400",
|
|
38
|
-
headingSizes: { h1: "48px", h2: "32px", h3: "24px" },
|
|
39
|
-
...partial.typography,
|
|
40
|
-
},
|
|
41
|
-
spacing: { pagePadding: "32px", elementGap: "16px", ...partial.spacing },
|
|
42
|
-
borders: { radius: "12px", accentWidth: "2px", ...partial.borders },
|
|
43
|
-
defaults: {
|
|
44
|
-
background: partial.defaults?.background ?? "light",
|
|
45
|
-
labelStyle: partial.defaults?.labelStyle ?? "none",
|
|
46
|
-
},
|
|
47
|
-
logos: partial.logos ?? [],
|
|
48
|
-
...(partial.imageStyle ? { imageStyle: partial.imageStyle } : {}),
|
|
49
|
-
...(partial.customCSS ? { customCSS: partial.customCSS } : {}),
|
|
50
|
-
...(partial.notes ? { notes: partial.notes } : {}),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
14
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* action on confirm (which owns ownership/scoping). This mirrors Claude
|
|
60
|
-
* Design's upload → parse → preview → approve flow.
|
|
15
|
+
* Builder-indexing endpoint: accepts a `.fig` upload (multipart field `file`)
|
|
16
|
+
* and starts Builder's design-system indexing pipeline. The app does not decode
|
|
17
|
+
* Figma files locally; Builder owns extraction, generated docs, and the
|
|
18
|
+
* asynchronous indexing job.
|
|
61
19
|
*/
|
|
62
20
|
export const importFigmaSystem = defineEventHandler(async (event) => {
|
|
63
21
|
const session = await getSession(event).catch(() => null);
|
|
@@ -89,45 +47,40 @@ export const importFigmaSystem = defineEventHandler(async (event) => {
|
|
|
89
47
|
};
|
|
90
48
|
}
|
|
91
49
|
|
|
92
|
-
// Validate it actually looks like a .fig: a zip archive (PK) or fig-kiwi.
|
|
93
|
-
if (!looksLikeFigFile(part.data)) {
|
|
94
|
-
setResponseStatus(event, 400);
|
|
95
|
-
return { error: "That doesn't look like a Figma .fig file." };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
let extracted;
|
|
99
|
-
try {
|
|
100
|
-
extracted = extractFigBrandKit(part.data);
|
|
101
|
-
} catch (e) {
|
|
102
|
-
setResponseStatus(event, 422);
|
|
103
|
-
return {
|
|
104
|
-
error: `Could not decode the .fig file: ${
|
|
105
|
-
e instanceof Error ? e.message : "unknown error"
|
|
106
|
-
}`,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const thumbnailDataUrl = extracted.preview.thumbnailDataUrl;
|
|
111
|
-
const data = withDefaults(extracted.data as Partial<DesignSystemData>);
|
|
112
|
-
// Attach the file thumbnail as a brand reference image for the generator.
|
|
113
|
-
if (thumbnailDataUrl) {
|
|
114
|
-
data.imageStyle = {
|
|
115
|
-
referenceUrls: [thumbnailDataUrl],
|
|
116
|
-
styleDescription: data.imageStyle?.styleDescription ?? "",
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
50
|
const suggestedTitle =
|
|
121
51
|
(part.filename || "Imported brand")
|
|
122
52
|
.replace(/\.fig$/i, "")
|
|
123
53
|
.replace(/[-_]+/g, " ")
|
|
124
54
|
.trim() || "Imported brand";
|
|
125
55
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
56
|
+
try {
|
|
57
|
+
return await startBuilderDesignSystemIndex({
|
|
58
|
+
projectName: suggestedTitle,
|
|
59
|
+
files: [
|
|
60
|
+
{
|
|
61
|
+
name: part.filename || "brand.fig",
|
|
62
|
+
data: part.data,
|
|
63
|
+
mimeType: "application/octet-stream",
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
} catch (err) {
|
|
68
|
+
if (err instanceof FeatureNotConfiguredError) {
|
|
69
|
+
setResponseStatus(event, 412);
|
|
70
|
+
return {
|
|
71
|
+
error:
|
|
72
|
+
err.message ||
|
|
73
|
+
"Connect Builder.io before indexing a design system from Figma.",
|
|
74
|
+
builderConnectUrl:
|
|
75
|
+
err.builderConnectUrl ?? "/_agent-native/builder/connect",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
setResponseStatus(event, 502);
|
|
79
|
+
return {
|
|
80
|
+
error:
|
|
81
|
+
err instanceof Error
|
|
82
|
+
? err.message
|
|
83
|
+
: "Builder design-system indexing failed.",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
133
86
|
});
|
|
@@ -15,6 +15,7 @@ import { hasCollabState, getText } from "@agent-native/core/collab";
|
|
|
15
15
|
import { eq } from "drizzle-orm";
|
|
16
16
|
|
|
17
17
|
import type { TweakDefinition } from "../../shared/api.js";
|
|
18
|
+
import { shouldUseLiveFileContent } from "../../shared/html-content.js";
|
|
18
19
|
import {
|
|
19
20
|
resolveTweaksToCssVars,
|
|
20
21
|
type TweakSelections,
|
|
@@ -78,7 +79,14 @@ export async function buildDesignSnapshot(
|
|
|
78
79
|
try {
|
|
79
80
|
if (await hasCollabState(f.id)) {
|
|
80
81
|
const live = await getText(f.id, "content");
|
|
81
|
-
if (
|
|
82
|
+
if (
|
|
83
|
+
typeof live === "string" &&
|
|
84
|
+
shouldUseLiveFileContent({
|
|
85
|
+
liveContent: live,
|
|
86
|
+
storedContent: f.content,
|
|
87
|
+
fileType: f.fileType,
|
|
88
|
+
})
|
|
89
|
+
) {
|
|
82
90
|
content = live;
|
|
83
91
|
source = "collab";
|
|
84
92
|
}
|