@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.
Files changed (220) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +14 -1
  5. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +15 -1
  7. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +15 -1
  9. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +15 -1
  11. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +15 -1
  13. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +16 -1
  15. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +14 -1
  17. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +14 -1
  19. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +14 -1
  21. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +14 -1
  23. package/corpus/core/docs/content/skills-guide.mdx +5 -0
  24. package/corpus/core/docs/content/template-design.mdx +14 -1
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/application-state/handlers.ts +1 -1
  27. package/corpus/core/src/brand-kit/index.ts +1 -1
  28. package/corpus/core/src/cli/skills.ts +18 -0
  29. package/corpus/core/src/client/AgentPanel.tsx +1 -1
  30. package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
  31. package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
  32. package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
  33. package/corpus/core/src/extensions/path.ts +1 -4
  34. package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
  35. package/corpus/core/src/mcp/build-server.ts +1 -1
  36. package/corpus/core/src/org/handlers.ts +5 -5
  37. package/corpus/core/src/org/plugin.ts +2 -2
  38. package/corpus/core/src/scripts/call-agent.ts +1 -1
  39. package/corpus/core/src/scripts/db/safety.ts +1 -1
  40. package/corpus/core/src/server/auth.ts +3 -0
  41. package/corpus/core/src/server/builder-design-systems.ts +308 -0
  42. package/corpus/core/src/server/core-routes-plugin.ts +29 -3
  43. package/corpus/core/src/server/index.ts +8 -0
  44. package/corpus/core/src/styles/agent-native.css +14 -7
  45. package/corpus/core/src/usage/store.ts +2 -2
  46. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
  47. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
  48. package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
  49. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
  50. package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
  51. package/corpus/templates/analytics/app/i18n/zh-TW.ts +37 -0
  52. package/corpus/templates/analytics/app/i18n-data.ts +404 -0
  53. package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
  54. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  55. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +49 -26
  57. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +137 -36
  58. package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
  59. package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
  61. package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
  62. package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
  63. package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
  64. package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
  65. package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
  66. package/corpus/templates/analytics/server/lib/dashboard-report.ts +49 -26
  67. package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
  68. package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
  69. package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
  70. package/corpus/templates/analytics/server/lib/session-replay.ts +29 -8
  71. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
  72. package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
  73. package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
  74. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
  75. package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
  76. package/corpus/templates/content/shared/document-export.ts +1 -1
  77. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
  78. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
  79. package/corpus/templates/design/actions/add-localhost-screens.ts +32 -5
  80. package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
  81. package/corpus/templates/design/actions/update-file.ts +9 -2
  82. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +33 -75
  83. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +72 -9
  84. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +41 -39
  85. package/corpus/templates/design/app/components/design/EditPanel.tsx +1029 -249
  86. package/corpus/templates/design/app/components/design/LayersPanel.tsx +450 -101
  87. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +978 -154
  88. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -9
  89. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +133 -66
  90. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1234 -344
  91. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +144 -94
  92. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +301 -72
  93. package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +876 -286
  94. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
  95. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
  96. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +30 -7
  97. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +212 -155
  98. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
  99. package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +487 -107
  100. package/corpus/templates/design/app/components/design/inspector/index.ts +27 -0
  101. package/corpus/templates/design/app/global.css +29 -3
  102. package/corpus/templates/design/app/i18n/zh-TW.ts +13 -0
  103. package/corpus/templates/design/app/i18n-data.ts +239 -1
  104. package/corpus/templates/design/app/pages/DesignEditor.tsx +1023 -353
  105. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
  106. package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
  107. package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
  108. package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
  109. package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
  110. package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
  111. package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
  112. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
  113. package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
  114. package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
  115. package/corpus/templates/design/shared/code-layer.ts +209 -9
  116. package/corpus/templates/design/shared/html-content.ts +21 -0
  117. package/corpus/templates/design/shared/pen-path.ts +207 -0
  118. package/corpus/templates/mail/app/lib/utils.ts +2 -2
  119. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
  120. package/corpus/templates/slides/AGENTS.md +3 -2
  121. package/corpus/templates/slides/actions/import-file.ts +26 -17
  122. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
  123. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
  124. package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
  125. package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
  126. package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
  127. package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
  128. package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
  129. package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
  130. package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
  131. package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
  132. package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
  133. package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
  134. package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
  135. package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
  136. package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
  137. package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
  138. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  139. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
  140. package/dist/application-state/handlers.js +1 -1
  141. package/dist/application-state/handlers.js.map +1 -1
  142. package/dist/brand-kit/index.d.ts +1 -1
  143. package/dist/brand-kit/index.js +1 -1
  144. package/dist/brand-kit/index.js.map +1 -1
  145. package/dist/cli/skills.d.ts.map +1 -1
  146. package/dist/cli/skills.js +18 -0
  147. package/dist/cli/skills.js.map +1 -1
  148. package/dist/client/AgentPanel.js +1 -1
  149. package/dist/client/AgentPanel.js.map +1 -1
  150. package/dist/client/MultiTabAssistantChat.js +1 -1
  151. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  152. package/dist/client/extensions/portable-extension.d.ts +1 -1
  153. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  154. package/dist/client/extensions/portable-extension.js.map +1 -1
  155. package/dist/code-agents/transcript-normalizer.js +1 -1
  156. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  157. package/dist/collab/awareness.d.ts +2 -2
  158. package/dist/collab/awareness.d.ts.map +1 -1
  159. package/dist/extensions/path.d.ts +1 -1
  160. package/dist/extensions/path.d.ts.map +1 -1
  161. package/dist/extensions/path.js.map +1 -1
  162. package/dist/integrations/a2a-continuation-processor.js +1 -1
  163. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  164. package/dist/mcp/build-server.d.ts +1 -1
  165. package/dist/mcp/build-server.d.ts.map +1 -1
  166. package/dist/mcp/build-server.js.map +1 -1
  167. package/dist/observability/routes.d.ts +3 -3
  168. package/dist/org/handlers.js +5 -5
  169. package/dist/org/handlers.js.map +1 -1
  170. package/dist/org/plugin.js +2 -2
  171. package/dist/org/plugin.js.map +1 -1
  172. package/dist/progress/routes.d.ts +1 -1
  173. package/dist/scripts/call-agent.js +1 -1
  174. package/dist/scripts/call-agent.js.map +1 -1
  175. package/dist/scripts/db/safety.js +1 -1
  176. package/dist/scripts/db/safety.js.map +1 -1
  177. package/dist/server/auth.d.ts.map +1 -1
  178. package/dist/server/auth.js +3 -0
  179. package/dist/server/auth.js.map +1 -1
  180. package/dist/server/builder-design-systems.d.ts +28 -0
  181. package/dist/server/builder-design-systems.d.ts.map +1 -0
  182. package/dist/server/builder-design-systems.js +217 -0
  183. package/dist/server/builder-design-systems.js.map +1 -0
  184. package/dist/server/core-routes-plugin.d.ts +1 -0
  185. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  186. package/dist/server/core-routes-plugin.js +20 -3
  187. package/dist/server/core-routes-plugin.js.map +1 -1
  188. package/dist/server/index.d.ts +1 -0
  189. package/dist/server/index.d.ts.map +1 -1
  190. package/dist/server/index.js +1 -0
  191. package/dist/server/index.js.map +1 -1
  192. package/dist/server/transcribe-voice.d.ts +1 -1
  193. package/dist/styles/agent-native.css +14 -7
  194. package/dist/usage/store.js +2 -2
  195. package/dist/usage/store.js.map +1 -1
  196. package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
  197. package/docs/content/locales/ar-SA/template-design.mdx +14 -1
  198. package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
  199. package/docs/content/locales/de-DE/template-design.mdx +15 -1
  200. package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
  201. package/docs/content/locales/es-ES/template-design.mdx +15 -1
  202. package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
  203. package/docs/content/locales/fr-FR/template-design.mdx +15 -1
  204. package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
  205. package/docs/content/locales/hi-IN/template-design.mdx +15 -1
  206. package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
  207. package/docs/content/locales/ja-JP/template-design.mdx +16 -1
  208. package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
  209. package/docs/content/locales/ko-KR/template-design.mdx +14 -1
  210. package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
  211. package/docs/content/locales/pt-BR/template-design.mdx +14 -1
  212. package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
  213. package/docs/content/locales/zh-CN/template-design.mdx +14 -1
  214. package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
  215. package/docs/content/locales/zh-TW/template-design.mdx +14 -1
  216. package/docs/content/skills-guide.mdx +5 -0
  217. package/docs/content/template-design.mdx +14 -1
  218. package/package.json +1 -1
  219. package/corpus/templates/design/actions/import-figma-file.ts +0 -166
  220. 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
- data: {
53
- colors?: Record<string, string>;
54
- typography?: {
55
- headingFont?: string;
56
- bodyFont?: string;
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 (deep brand extraction → design system) ----------
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\nExtract design tokens from code. Call \`import-github\` for each:\n${normalizedGithubLinks.map((l) => `- ${l.url}`).join("\n")}\n\nIf a repository is private or GitHub denies access, tell me to save a fine-grained GitHub token as \`GITHUB_TOKEN\` in Settings > Secrets. The token should be limited to the repository with Repository permissions > Contents: Read-only. Do not ask me to paste a PAT into chat.`,
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)\nCall \`import-code\` with these files:`,
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)\nWhen you call \`create-design-system\`, 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()}`,
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-5 rounded-xl border border-border bg-card p-4">
1134
- <div className="flex items-start gap-4">
1135
- {result.preview.thumbnailDataUrl ? (
1136
- <img
1137
- src={result.preview.thumbnailDataUrl}
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
- <label className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
1144
- {t("designSystemSetup.designSystemName")}
1145
- </label>
1146
- <Input
1147
- value={title}
1148
- onChange={(e) => onTitleChange(e.target.value)}
1149
- className="mt-1 bg-accent/50"
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
- {colorEntries.length > 0 && (
1163
- <div>
1164
- <h4 className="mb-2 text-xs font-medium uppercase text-muted-foreground">
1165
- {t("designSystemSetup.previewColors")}
1166
- </h4>
1167
- <div className="flex flex-wrap gap-3">
1168
- {colorEntries.map(([label, k]) => (
1169
- <div key={k} className="flex items-center gap-2">
1170
- <div
1171
- className="h-8 w-8 rounded-md border border-border"
1172
- style={{ backgroundColor: colors[k] }}
1173
- />
1174
- <div className="text-xs">
1175
- <div className="text-foreground/80">{label}</div>
1176
- <div className="font-mono text-[11px] text-muted-foreground">
1177
- {colors[k]}
1178
- </div>
1179
- </div>
1180
- </div>
1181
- ))}
1182
- </div>
1183
- </div>
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
- <Button
1247
- onClick={onCreate}
1248
- disabled={creating || !title.trim()}
1249
- className="cursor-pointer"
1250
- >
1251
- {creating ? (
1252
- <>
1253
- <Spinner className="size-4" /> {t("designSystemSetup.creating")}
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>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Canvas selection no longer flashes broken prototype HTML when screens include embedded scripts or styles.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Command menu selections are clearer in dark mode.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Design mode top chrome now groups collaborators, preview, Share, and chat closer to Figma.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Element selection now stays on the intended layer after selector replay and reparenting.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Screen overview full-view controls now sit above frames instead of covering the preview.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ Screen overview tools can draw shapes, create screens, and keep handles visible while zooming.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-06-29
4
+ ---
5
+
6
+ The Pen tool now creates anchor-based Bezier vectors with handles and close-path feedback.
@@ -1,63 +1,21 @@
1
1
  import {
2
- extractFigBrandKit,
3
- looksLikeFigFile,
4
- } from "@agent-native/core/brand-kit/fig";
5
- import { getSession } from "@agent-native/core/server";
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
- * Parse-only endpoint: accepts a `.fig` upload (multipart field `file`),
56
- * decodes it, and returns the deeply-extracted brand profile (tokens, signature
57
- * gradients, and a synthesized brand-character brief) for preview. It does NOT
58
- * persist the client reviews/edits, then calls the `create-design-system`
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
- return {
127
- ok: true,
128
- suggestedTitle,
129
- data,
130
- customInstructions: extracted.customInstructions,
131
- preview: extracted.preview,
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 (typeof live === "string") {
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
  }