@agent-native/core 0.86.0 → 0.86.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 (183) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +9 -0
  3. package/corpus/core/package.json +2 -1
  4. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  5. package/corpus/core/src/client/AssistantChat.tsx +91 -27
  6. package/corpus/core/src/client/ErrorBoundary.tsx +67 -12
  7. package/corpus/core/src/client/ErrorReportActions.tsx +69 -0
  8. package/corpus/core/src/client/FeedbackButton.tsx +8 -4
  9. package/corpus/core/src/client/db-admin/DbAdminPage.tsx +41 -13
  10. package/corpus/core/src/client/db-admin/SqlEditor.tsx +10 -3
  11. package/corpus/core/src/client/db-admin/TableEditor.tsx +12 -5
  12. package/corpus/core/src/client/db-admin/useAgentSync.ts +10 -3
  13. package/corpus/core/src/client/db-admin/useDbAdmin.ts +65 -16
  14. package/corpus/core/src/client/error-reporting.ts +100 -0
  15. package/corpus/core/src/client/index.ts +11 -0
  16. package/corpus/core/src/client/org/RequireActiveOrg.tsx +12 -0
  17. package/corpus/core/src/client/visual-style-controls.tsx +615 -2
  18. package/corpus/core/src/db-admin/index.ts +26 -0
  19. package/corpus/core/src/db-admin/operations.ts +87 -49
  20. package/corpus/core/src/localization/default-messages.ts +4 -0
  21. package/corpus/core/src/server/builder-design-systems.ts +328 -9
  22. package/corpus/core/src/server/index.ts +15 -0
  23. package/corpus/core/src/templates/default/app/root.tsx +47 -0
  24. package/corpus/templates/analytics/AGENTS.md +6 -4
  25. package/corpus/templates/analytics/actions/delete-db-admin-connection.ts +19 -0
  26. package/corpus/templates/analytics/actions/list-db-admin-connections.ts +18 -0
  27. package/corpus/templates/analytics/actions/navigate.ts +17 -3
  28. package/corpus/templates/analytics/actions/save-db-admin-connection.ts +33 -0
  29. package/corpus/templates/analytics/actions/view-screen.ts +11 -3
  30. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +11 -2
  31. package/corpus/templates/analytics/app/i18n/zh-TW.ts +23 -2
  32. package/corpus/templates/analytics/app/i18n-data.ts +230 -20
  33. package/corpus/templates/analytics/app/pages/Agents.tsx +398 -4
  34. package/corpus/templates/analytics/changelog/2026-07-03-connect-other-app-databases-from-analytics.md +6 -0
  35. package/corpus/templates/analytics/server/db/schema.ts +27 -0
  36. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +458 -0
  37. package/corpus/templates/analytics/server/plugins/db.ts +35 -0
  38. package/corpus/templates/analytics/server/routes/[base]/_agent-native/analytics-db-admin/[...path].ts +1 -0
  39. package/corpus/templates/analytics/server/routes/_agent-native/analytics-db-admin/[...path].ts +160 -0
  40. package/corpus/templates/content/app/root.tsx +9 -0
  41. package/corpus/templates/content/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  42. package/corpus/templates/design/AGENTS.md +13 -7
  43. package/corpus/templates/design/actions/get-design-system.ts +21 -0
  44. package/corpus/templates/design/actions/index-design-system-with-builder.ts +14 -37
  45. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +3 -3
  46. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +70 -9
  47. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +11 -2
  48. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +1 -1
  49. package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +1 -1
  50. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +8 -2
  51. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +7 -3
  52. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +48 -0
  53. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -0
  54. package/corpus/templates/design/app/i18n/zh-TW.ts +15 -14
  55. package/corpus/templates/design/app/i18n-data.ts +154 -142
  56. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +32 -14
  57. package/corpus/templates/design/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  58. package/corpus/templates/design/changelog/2026-07-03-the-code-editor-is-easier-to-use-with-top-sidebar-tabs-clear.md +6 -0
  59. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +16 -106
  60. package/corpus/templates/mail/app/root.tsx +60 -1
  61. package/corpus/templates/mail/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  62. package/corpus/templates/plan/app/i18n/ar-SA.ts +3 -0
  63. package/corpus/templates/plan/app/i18n/de-DE.ts +4 -0
  64. package/corpus/templates/plan/app/i18n/en-US.ts +4 -0
  65. package/corpus/templates/plan/app/i18n/es-ES.ts +4 -0
  66. package/corpus/templates/plan/app/i18n/fr-FR.ts +4 -0
  67. package/corpus/templates/plan/app/i18n/hi-IN.ts +3 -0
  68. package/corpus/templates/plan/app/i18n/ja-JP.ts +4 -0
  69. package/corpus/templates/plan/app/i18n/ko-KR.ts +4 -0
  70. package/corpus/templates/plan/app/i18n/pt-BR.ts +4 -0
  71. package/corpus/templates/plan/app/i18n/zh-CN.ts +3 -0
  72. package/corpus/templates/plan/app/i18n/zh-TW.ts +3 -0
  73. package/corpus/templates/plan/app/pages/PlansPage.tsx +74 -3
  74. package/corpus/templates/plan/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  75. package/corpus/templates/slides/AGENTS.md +7 -3
  76. package/corpus/templates/slides/actions/get-design-system.ts +21 -0
  77. package/corpus/templates/slides/actions/import-file.ts +15 -7
  78. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +14 -37
  79. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +32 -8
  80. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +2 -2
  81. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +2 -4
  82. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +163 -154
  83. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +19 -15
  84. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +56 -6
  85. package/corpus/templates/slides/app/components/layout/Layout.tsx +6 -1
  86. package/corpus/templates/slides/app/i18n/ar-SA.ts +8 -7
  87. package/corpus/templates/slides/app/i18n/de-DE.ts +7 -8
  88. package/corpus/templates/slides/app/i18n/en-US.ts +8 -7
  89. package/corpus/templates/slides/app/i18n/es-ES.ts +7 -8
  90. package/corpus/templates/slides/app/i18n/fr-FR.ts +7 -8
  91. package/corpus/templates/slides/app/i18n/hi-IN.ts +8 -7
  92. package/corpus/templates/slides/app/i18n/ja-JP.ts +7 -8
  93. package/corpus/templates/slides/app/i18n/ko-KR.ts +7 -7
  94. package/corpus/templates/slides/app/i18n/pt-BR.ts +7 -8
  95. package/corpus/templates/slides/app/i18n/zh-CN.ts +8 -7
  96. package/corpus/templates/slides/app/i18n/zh-TW.ts +8 -7
  97. package/corpus/templates/slides/app/lib/canvas-zoom.ts +16 -1
  98. package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -3
  99. package/corpus/templates/slides/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  100. package/corpus/templates/slides/changelog/2026-07-03-slide-editing-now-keeps-thumbnails-speaker-notes-styling-and.md +6 -0
  101. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +16 -104
  102. package/dist/client/AgentPanel.d.ts.map +1 -1
  103. package/dist/client/AgentPanel.js +2 -1
  104. package/dist/client/AgentPanel.js.map +1 -1
  105. package/dist/client/AssistantChat.d.ts.map +1 -1
  106. package/dist/client/AssistantChat.js +77 -25
  107. package/dist/client/AssistantChat.js.map +1 -1
  108. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  109. package/dist/client/ErrorBoundary.js +37 -2
  110. package/dist/client/ErrorBoundary.js.map +1 -1
  111. package/dist/client/ErrorReportActions.d.ts +13 -0
  112. package/dist/client/ErrorReportActions.d.ts.map +1 -0
  113. package/dist/client/ErrorReportActions.js +14 -0
  114. package/dist/client/ErrorReportActions.js.map +1 -0
  115. package/dist/client/FeedbackButton.d.ts +3 -1
  116. package/dist/client/FeedbackButton.d.ts.map +1 -1
  117. package/dist/client/FeedbackButton.js +6 -5
  118. package/dist/client/FeedbackButton.js.map +1 -1
  119. package/dist/client/db-admin/DbAdminPage.d.ts +9 -1
  120. package/dist/client/db-admin/DbAdminPage.d.ts.map +1 -1
  121. package/dist/client/db-admin/DbAdminPage.js +17 -13
  122. package/dist/client/db-admin/DbAdminPage.js.map +1 -1
  123. package/dist/client/db-admin/SqlEditor.d.ts +3 -1
  124. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
  125. package/dist/client/db-admin/SqlEditor.js +3 -3
  126. package/dist/client/db-admin/SqlEditor.js.map +1 -1
  127. package/dist/client/db-admin/TableEditor.d.ts +3 -1
  128. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  129. package/dist/client/db-admin/TableEditor.js +6 -6
  130. package/dist/client/db-admin/TableEditor.js.map +1 -1
  131. package/dist/client/db-admin/useAgentSync.d.ts +3 -2
  132. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  133. package/dist/client/db-admin/useAgentSync.js +8 -4
  134. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  135. package/dist/client/db-admin/useDbAdmin.d.ts +11 -7
  136. package/dist/client/db-admin/useDbAdmin.d.ts.map +1 -1
  137. package/dist/client/db-admin/useDbAdmin.js +45 -20
  138. package/dist/client/db-admin/useDbAdmin.js.map +1 -1
  139. package/dist/client/error-reporting.d.ts +19 -0
  140. package/dist/client/error-reporting.d.ts.map +1 -0
  141. package/dist/client/error-reporting.js +71 -0
  142. package/dist/client/error-reporting.js.map +1 -0
  143. package/dist/client/index.d.ts +3 -1
  144. package/dist/client/index.d.ts.map +1 -1
  145. package/dist/client/index.js +3 -1
  146. package/dist/client/index.js.map +1 -1
  147. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  148. package/dist/client/org/RequireActiveOrg.js +2 -1
  149. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  150. package/dist/client/visual-style-controls.d.ts +11 -0
  151. package/dist/client/visual-style-controls.d.ts.map +1 -1
  152. package/dist/client/visual-style-controls.js +350 -1
  153. package/dist/client/visual-style-controls.js.map +1 -1
  154. package/dist/collab/routes.d.ts +1 -1
  155. package/dist/collab/struct-routes.d.ts +1 -1
  156. package/dist/db-admin/index.d.ts +3 -0
  157. package/dist/db-admin/index.d.ts.map +1 -0
  158. package/dist/db-admin/index.js +2 -0
  159. package/dist/db-admin/index.js.map +1 -0
  160. package/dist/db-admin/operations.d.ts +26 -5
  161. package/dist/db-admin/operations.d.ts.map +1 -1
  162. package/dist/db-admin/operations.js +66 -55
  163. package/dist/db-admin/operations.js.map +1 -1
  164. package/dist/localization/default-messages.d.ts +3 -0
  165. package/dist/localization/default-messages.d.ts.map +1 -1
  166. package/dist/localization/default-messages.js +3 -0
  167. package/dist/localization/default-messages.js.map +1 -1
  168. package/dist/notifications/routes.d.ts +1 -1
  169. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  170. package/dist/resources/handlers.d.ts +1 -1
  171. package/dist/secrets/routes.d.ts +9 -9
  172. package/dist/server/builder-design-systems.d.ts +61 -0
  173. package/dist/server/builder-design-systems.d.ts.map +1 -1
  174. package/dist/server/builder-design-systems.js +219 -14
  175. package/dist/server/builder-design-systems.js.map +1 -1
  176. package/dist/server/index.d.ts +1 -1
  177. package/dist/server/index.d.ts.map +1 -1
  178. package/dist/server/index.js +1 -1
  179. package/dist/server/index.js.map +1 -1
  180. package/dist/server/transcribe-voice.d.ts +1 -1
  181. package/dist/templates/default/app/root.tsx +47 -0
  182. package/package.json +2 -1
  183. package/src/templates/default/app/root.tsx +47 -0
@@ -254,7 +254,7 @@ export default function DesignSystemSetup() {
254
254
  if (
255
255
  f.size < 200 * 1024 &&
256
256
  (f.name.match(
257
- /\.(css|scss|sass|less|ts|tsx|js|jsx|json|html|svg|xml)$/i,
257
+ /\.(css|scss|sass|less|ts|tsx|js|jsx|json|html|svg|xml|md|markdown|mdx|txt)$/i,
258
258
  ) ||
259
259
  f.type.startsWith("text/"))
260
260
  ) {
@@ -362,10 +362,16 @@ export default function DesignSystemSetup() {
362
362
  const normalizedGithubLinks = pendingGithubUrl
363
363
  ? [...githubLinks, { id: "pending", url: pendingGithubUrl }]
364
364
  : githubLinks;
365
+ const readableCodeFiles = codeFiles.filter((f) => f.textContent);
366
+ const designMdFiles = readableCodeFiles.filter(isDesignMdFile);
367
+ const builderCodeFiles = readableCodeFiles.filter(
368
+ (file) => !isDesignMdFile(file),
369
+ );
370
+ const unreadableCodeFiles = codeFiles.filter((f) => !f.textContent);
365
371
 
366
372
  const parts: string[] = [];
367
373
  parts.push(
368
- "Set up a design system from the following sources. Analyze each source, extract design tokens (colors, fonts, spacing, borders), and create a cohesive design system.",
374
+ "Set up a design system from the following sources. Use Builder Design System Intelligence (DSI) as the source of truth for reusable Figma/code/design.md indexing. Analyze each source, extract design tokens (colors, fonts, spacing, borders), and create a cohesive design system.",
369
375
  );
370
376
 
371
377
  if (companyInfo.trim()) {
@@ -380,34 +386,41 @@ export default function DesignSystemSetup() {
380
386
 
381
387
  if (normalizedGithubLinks.length > 0) {
382
388
  parts.push(
383
- `\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.`,
389
+ `\n## Connect Code: GitHub Repositories\nStart Builder DSI 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.`,
384
390
  );
385
391
  }
386
392
 
387
393
  if (codeFiles.length > 0) {
388
- const withContent = codeFiles.filter((f) => f.textContent);
389
- const withoutContent = codeFiles.filter((f) => !f.textContent);
390
-
391
- if (withContent.length > 0) {
394
+ if (builderCodeFiles.length > 0) {
392
395
  parts.push(
393
- `\n## Code Files (${withContent.length} files with content)\nStart Builder design-system indexing with \`index-design-system-with-builder\` using these files:`,
396
+ `\n## Connect Code: Code Files (${builderCodeFiles.length} files with content)\nStart Builder DSI indexing with \`index-design-system-with-builder\` using these files as the \`codeFiles\` argument:`,
394
397
  );
395
- for (const f of withContent) {
398
+ for (const f of builderCodeFiles) {
396
399
  parts.push(
397
400
  `\n### ${f.name}\n\`\`\`\n${f.textContent!.slice(0, 5000)}\n\`\`\``,
398
401
  );
399
402
  }
400
403
  }
401
- if (withoutContent.length > 0) {
404
+ if (designMdFiles.length > 0) {
405
+ parts.push(
406
+ `\n## Optional design.md (${designMdFiles.length} file${designMdFiles.length === 1 ? "" : "s"})\nPass this content as the \`designMd\` argument to \`index-design-system-with-builder\` alongside any Figma/code sources:`,
407
+ );
408
+ for (const f of designMdFiles) {
409
+ parts.push(
410
+ `\n### ${f.name}\n\`\`\`md\n${f.textContent!.slice(0, 5000)}\n\`\`\``,
411
+ );
412
+ }
413
+ }
414
+ if (unreadableCodeFiles.length > 0) {
402
415
  parts.push(
403
- `\nBinary code files (could not read):\n${withoutContent.map((f) => `- ${f.name}`).join("\n")}`,
416
+ `\nBinary code files (could not read):\n${unreadableCodeFiles.map((f) => `- ${f.name}`).join("\n")}`,
404
417
  );
405
418
  }
406
419
  }
407
420
 
408
421
  if (builderIndexResult) {
409
422
  parts.push(
410
- `\n## Builder-Indexed Figma File\nBuilder design-system indexing has already started.\n- Design system: ${builderIndexResult.designSystemId}\n- Local selectable design system: ${builderIndexResult.localDesignSystemId ?? "(not returned)"}\n- Project: ${builderIndexResult.projectId}\n- Job: ${builderIndexResult.jobId}\n- URL: ${builderIndexResult.builderUrl}\n\nUse Builder as the source of truth for extracted tokens, assets, and guidance. Do not call \`create-design-system\` again for this Builder-indexed source.`,
423
+ `\n## Connect Figma: Builder-Indexed Figma File\nBuilder DSI indexing has already started.\n- Design system: ${builderIndexResult.designSystemId}\n- Local selectable design system: ${builderIndexResult.localDesignSystemId ?? "(not returned)"}\n- Project: ${builderIndexResult.projectId}\n- Job: ${builderIndexResult.jobId}\n- URL: ${builderIndexResult.builderUrl}\n\nUse Builder as the source of truth for extracted tokens, assets, components, and guidance. Do not call \`create-design-system\` again for this Builder-indexed source.`,
411
424
  );
412
425
  }
413
426
 
@@ -454,7 +467,7 @@ export default function DesignSystemSetup() {
454
467
  }
455
468
 
456
469
  parts.push(
457
- `\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${
470
+ `\n---\nAfter processing all sources, if you started Builder DSI 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 Builder-indexed Figma/code/design.md sources. If you processed non-Builder sources into concrete tokens, call \`create-design-system\` with the combined tokens${
458
471
  customInstructions.trim()
459
472
  ? " AND the verbatim --customInstructions string from above"
460
473
  : ""
@@ -757,7 +770,7 @@ export default function DesignSystemSetup() {
757
770
  ref={codeInputRef}
758
771
  type="file"
759
772
  multiple
760
- accept=".css,.scss,.sass,.less,.ts,.tsx,.js,.jsx,.json,.html,.svg"
773
+ accept=".css,.scss,.sass,.less,.ts,.tsx,.js,.jsx,.json,.html,.svg,.xml,.md,.markdown,.mdx,.txt"
761
774
  onChange={handleCodeUpload}
762
775
  className="hidden"
763
776
  />
@@ -1137,6 +1150,11 @@ function formatSize(bytes: number): string {
1137
1150
  return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
1138
1151
  }
1139
1152
 
1153
+ function isDesignMdFile(file: UploadedFile): boolean {
1154
+ const name = file.name.split(/[\\/]/).pop()?.toLowerCase() ?? file.name;
1155
+ return name === "design.md" || name === "design.mdx";
1156
+ }
1157
+
1140
1158
  function isHttpUrl(value: string): boolean {
1141
1159
  try {
1142
1160
  const url = new URL(value);
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-03
4
+ ---
5
+
6
+ Design system setup now indexes Figma, code, and design.md sources through Builder DSI.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-03
4
+ ---
5
+
6
+ The code editor is easier to use with top sidebar tabs, clearer screen names, no minimap, and fewer false reload conflicts.
@@ -1,93 +1,13 @@
1
+ import {
2
+ createBuilderDesignSystemProxyFields,
3
+ localBuilderDesignSystemId,
4
+ type BuilderDesignSystemIndexResult,
5
+ } from "@agent-native/core/server";
1
6
  import { eq } from "drizzle-orm";
2
7
  import { nanoid } from "nanoid";
3
8
 
4
9
  import { getDb, schema } from "../db/index.js";
5
10
 
6
- type BuilderDesignSystemIndexResult = {
7
- designSystemId: string;
8
- jobId: string;
9
- builderUrl: string;
10
- };
11
-
12
- export function localBuilderDesignSystemId(
13
- builderDesignSystemId: string,
14
- ): string {
15
- const slug = builderDesignSystemId
16
- .replace(/[^a-zA-Z0-9_-]+/g, "-")
17
- .replace(/^-+|-+$/g, "")
18
- .slice(0, 96);
19
- return `builder-${slug || "design-system"}`;
20
- }
21
-
22
- function builderProxyData({
23
- builderDesignSystemId,
24
- jobId,
25
- builderUrl,
26
- projectName,
27
- description,
28
- }: {
29
- builderDesignSystemId: string;
30
- jobId: string;
31
- builderUrl: string;
32
- projectName?: string;
33
- description?: string;
34
- }) {
35
- return JSON.stringify({
36
- source: "builder",
37
- builderDesignSystemId,
38
- builderJobId: jobId,
39
- builderUrl,
40
- colors: {
41
- primary: "var(--primary)",
42
- secondary: "var(--secondary)",
43
- accent: "var(--accent)",
44
- background: "var(--background)",
45
- surface: "var(--card)",
46
- text: "var(--foreground)",
47
- textMuted: "var(--muted-foreground)",
48
- },
49
- typography: {
50
- headingFont: "inherit",
51
- bodyFont: "inherit",
52
- headingWeight: "700",
53
- bodyWeight: "400",
54
- headingSizes: { h1: "48px", h2: "32px", h3: "24px" },
55
- },
56
- spacing: { elementGap: "24px", pagePadding: "48px" },
57
- borders: { radius: "12px", accentWidth: "1px" },
58
- logos: [],
59
- notes: [
60
- "This is a local proxy for a Builder-indexed design system.",
61
- `Builder design system id: ${builderDesignSystemId}`,
62
- `Builder indexing job id: ${jobId}`,
63
- `Builder URL: ${builderUrl}`,
64
- projectName ? `Requested name: ${projectName}` : "",
65
- description ? `Context: ${description}` : "",
66
- "Use Builder as the source of truth for extracted tokens and guidance.",
67
- ]
68
- .filter(Boolean)
69
- .join("\n"),
70
- });
71
- }
72
-
73
- function builderProxyInstructions({
74
- builderDesignSystemId,
75
- jobId,
76
- builderUrl,
77
- }: {
78
- builderDesignSystemId: string;
79
- jobId: string;
80
- builderUrl: string;
81
- }) {
82
- return [
83
- "This design system is indexed and owned by Builder.",
84
- `Builder design system id: ${builderDesignSystemId}`,
85
- `Builder job id: ${jobId}`,
86
- `Builder URL: ${builderUrl}`,
87
- "When generating designs, treat Builder as the source of truth for the final extracted tokens, assets, and guidance.",
88
- ].join("\n");
89
- }
90
-
91
11
  export async function upsertBuilderProxyDesignSystem({
92
12
  result,
93
13
  ownerEmail,
@@ -106,18 +26,11 @@ export async function upsertBuilderProxyDesignSystem({
106
26
  const baseLocalDesignSystemId = localBuilderDesignSystemId(
107
27
  result.designSystemId,
108
28
  );
109
- const title = projectName?.trim() || "Builder indexed design system";
110
- const localData = builderProxyData({
111
- builderDesignSystemId: result.designSystemId,
112
- jobId: result.jobId,
113
- builderUrl: result.builderUrl,
29
+ const proxyFields = createBuilderDesignSystemProxyFields({
30
+ result,
114
31
  projectName,
115
32
  description,
116
- });
117
- const customInstructions = builderProxyInstructions({
118
- builderDesignSystemId: result.designSystemId,
119
- jobId: result.jobId,
120
- builderUrl: result.builderUrl,
33
+ surface: "design",
121
34
  });
122
35
  const [existing] = await db
123
36
  .select({
@@ -135,13 +48,11 @@ export async function upsertBuilderProxyDesignSystem({
135
48
  await db
136
49
  .update(schema.designSystems)
137
50
  .set({
138
- title,
139
- description:
140
- description ??
141
- `Builder indexed design system ${result.designSystemId}`,
142
- data: localData,
51
+ title: proxyFields.title,
52
+ description: proxyFields.description,
53
+ data: proxyFields.data,
143
54
  assets: "[]",
144
- customInstructions,
55
+ customInstructions: proxyFields.customInstructions,
145
56
  updatedAt: now,
146
57
  })
147
58
  .where(eq(schema.designSystems.id, existing.id));
@@ -153,12 +64,11 @@ export async function upsertBuilderProxyDesignSystem({
153
64
  .limit(1);
154
65
  await db.insert(schema.designSystems).values({
155
66
  id: localDesignSystemId,
156
- title,
157
- description:
158
- description ?? `Builder indexed design system ${result.designSystemId}`,
159
- data: localData,
67
+ title: proxyFields.title,
68
+ description: proxyFields.description,
69
+ data: proxyFields.data,
160
70
  assets: "[]",
161
- customInstructions,
71
+ customInstructions: proxyFields.customInstructions,
162
72
  isDefault: !ownedSystem,
163
73
  ownerEmail,
164
74
  orgId: orgId ?? null,
@@ -2,6 +2,7 @@ import { useDbSync } from "@agent-native/core/client";
2
2
  import {
3
3
  AppProviders,
4
4
  DEFAULT_LOCALE,
5
+ ErrorReportActions,
5
6
  LOCALE_HYDRATION_GLOBAL,
6
7
  LOCALE_STORAGE_KEY,
7
8
  RequireSession,
@@ -82,73 +83,121 @@ function skipBroadActionInvalidation() {
82
83
 
83
84
  const MAIL_ERROR_COPY: Record<
84
85
  LocaleCode,
85
- { title: string; fallback: string; back: string; reload: string }
86
+ {
87
+ title: string;
88
+ fallback: string;
89
+ back: string;
90
+ reload: string;
91
+ sendFeedback: string;
92
+ feedbackPlaceholder: string;
93
+ openGitHubIssue: string;
94
+ }
86
95
  > = {
87
96
  "en-US": {
88
97
  title: "Mail could not load this view.",
89
98
  fallback: "Something went wrong while loading Mail.",
90
99
  back: "Back",
91
100
  reload: "Reload",
101
+ sendFeedback: "Send feedback",
102
+ feedbackPlaceholder:
103
+ "Describe what happened before this Mail error appeared.",
104
+ openGitHubIssue: "Open GitHub issue",
92
105
  },
93
106
  "zh-CN": {
94
107
  title: "Mail 无法加载此视图。",
95
108
  fallback: "加载 Mail 时出现问题。",
96
109
  back: "返回",
97
110
  reload: "重新加载",
111
+ sendFeedback: "发送反馈",
112
+ feedbackPlaceholder: "描述此 Mail 错误出现前发生了什么。",
113
+ openGitHubIssue: "打开 GitHub issue",
98
114
  },
99
115
  "zh-TW": {
100
116
  title: "Mail 無法載入此檢視。",
101
117
  fallback: "載入 Mail 時發生問題。",
102
118
  back: "返回",
103
119
  reload: "重新載入",
120
+ sendFeedback: "傳送意見回饋",
121
+ feedbackPlaceholder: "描述此 Mail 錯誤出現前發生了什麼。",
122
+ openGitHubIssue: "開啟 GitHub issue",
104
123
  },
105
124
  "es-ES": {
106
125
  title: "Mail no pudo cargar esta vista.",
107
126
  fallback: "Algo salió mal al cargar Mail.",
108
127
  back: "Atrás",
109
128
  reload: "Recargar",
129
+ sendFeedback: "Enviar comentarios",
130
+ feedbackPlaceholder:
131
+ "Describe qué pasó antes de que apareciera este error de Mail.",
132
+ openGitHubIssue: "Abrir issue en GitHub",
110
133
  },
111
134
  "fr-FR": {
112
135
  title: "Mail n'a pas pu charger cette vue.",
113
136
  fallback: "Un problème est survenu lors du chargement de Mail.",
114
137
  back: "Retour",
115
138
  reload: "Recharger",
139
+ sendFeedback: "Envoyer un retour",
140
+ feedbackPlaceholder:
141
+ "Décrivez ce qui s'est passé avant cette erreur de Mail.",
142
+ openGitHubIssue: "Ouvrir une issue GitHub",
116
143
  },
117
144
  "de-DE": {
118
145
  title: "Mail konnte diese Ansicht nicht laden.",
119
146
  fallback: "Beim Laden von Mail ist ein Fehler aufgetreten.",
120
147
  back: "Zurück",
121
148
  reload: "Neu laden",
149
+ sendFeedback: "Feedback senden",
150
+ feedbackPlaceholder:
151
+ "Beschreiben Sie, was vor diesem Mail-Fehler passiert ist.",
152
+ openGitHubIssue: "GitHub-Issue öffnen",
122
153
  },
123
154
  "ja-JP": {
124
155
  title: "Mail はこのビューを読み込めませんでした。",
125
156
  fallback: "Mail の読み込み中に問題が発生しました。",
126
157
  back: "戻る",
127
158
  reload: "再読み込み",
159
+ sendFeedback: "フィードバックを送信",
160
+ feedbackPlaceholder:
161
+ "この Mail エラーの直前に起きたことを説明してください。",
162
+ openGitHubIssue: "GitHub issue を開く",
128
163
  },
129
164
  "ko-KR": {
130
165
  title: "Mail에서 이 보기를 불러올 수 없습니다.",
131
166
  fallback: "Mail을 불러오는 중 문제가 발생했습니다.",
132
167
  back: "뒤로",
133
168
  reload: "새로고침",
169
+ sendFeedback: "피드백 보내기",
170
+ feedbackPlaceholder:
171
+ "이 Mail 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.",
172
+ openGitHubIssue: "GitHub issue 열기",
134
173
  },
135
174
  "pt-BR": {
136
175
  title: "O Mail não conseguiu carregar esta visualização.",
137
176
  fallback: "Algo deu errado ao carregar o Mail.",
138
177
  back: "Voltar",
139
178
  reload: "Recarregar",
179
+ sendFeedback: "Enviar feedback",
180
+ feedbackPlaceholder:
181
+ "Descreva o que aconteceu antes deste erro do Mail aparecer.",
182
+ openGitHubIssue: "Abrir issue no GitHub",
140
183
  },
141
184
  "hi-IN": {
142
185
  title: "Mail यह दृश्य लोड नहीं कर सका।",
143
186
  fallback: "Mail लोड करते समय कुछ गलत हुआ।",
144
187
  back: "वापस",
145
188
  reload: "रीलोड",
189
+ sendFeedback: "फ़ीडबैक भेजें",
190
+ feedbackPlaceholder: "इस Mail त्रुटि से पहले क्या हुआ, उसका वर्णन करें।",
191
+ openGitHubIssue: "GitHub issue खोलें",
146
192
  },
147
193
  "ar-SA": {
148
194
  title: "تعذر على Mail تحميل هذا العرض.",
149
195
  fallback: "حدث خطأ أثناء تحميل Mail.",
150
196
  back: "رجوع",
151
197
  reload: "إعادة التحميل",
198
+ sendFeedback: "إرسال الملاحظات",
199
+ feedbackPlaceholder: "صف ما حدث قبل ظهور خطأ Mail هذا.",
200
+ openGitHubIssue: "فتح مشكلة في GitHub",
152
201
  },
153
202
  };
154
203
 
@@ -436,6 +485,16 @@ export function ErrorBoundary() {
436
485
  {copy.reload}
437
486
  </Button>
438
487
  </div>
488
+ <ErrorReportActions
489
+ appName="Mail"
490
+ title={copy.title}
491
+ details={message}
492
+ issueTitle={`Mail error: ${copy.title}`}
493
+ feedbackLabel={copy.sendFeedback}
494
+ feedbackPlaceholder={copy.feedbackPlaceholder}
495
+ githubLabel={copy.openGitHubIssue}
496
+ className="mt-4"
497
+ />
439
498
  </div>
440
499
  </div>
441
500
  );
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-03
4
+ ---
5
+
6
+ Mail error screens now include a feedback button with debug context and a prefilled GitHub issue fallback.
@@ -641,6 +641,9 @@ const messages = {
641
641
  signIn: "تسجيل الدخول",
642
642
  haveAccount: "لدي حساب بالفعل",
643
643
  retry: "حاول ثانية",
644
+ sendFeedback: "إرسال الملاحظات",
645
+ feedbackPlaceholder: "صف ما حدث قبل ظهور خطأ الخطة هذا.",
646
+ openGitHubIssue: "فتح مشكلة في GitHub",
644
647
  joinedOrg: "انضم {{orgName}}. خطة الافتتاح...",
645
648
  acceptingInvite: "قبول الدعوة",
646
649
  joiningOrg: "الانضمام إلى المنظمة",
@@ -653,6 +653,10 @@ const messages = {
653
653
  signIn: "Einloggen",
654
654
  haveAccount: "Ich habe bereits ein Konto",
655
655
  retry: "Versuchen Sie es erneut",
656
+ sendFeedback: "Feedback senden",
657
+ feedbackPlaceholder:
658
+ "Beschreiben Sie, was vor diesem Planfehler passiert ist.",
659
+ openGitHubIssue: "GitHub-Issue öffnen",
656
660
  joinedOrg: "Beigetreten {{orgName}}. Eröffnungsplan...",
657
661
  acceptingInvite: "Einladung annehmen",
658
662
  joiningOrg: "Beitritt zur Organisation",
@@ -630,6 +630,10 @@ const messages = {
630
630
  signIn: "Sign in",
631
631
  haveAccount: "I have an account",
632
632
  retry: "Retry",
633
+ sendFeedback: "Send feedback",
634
+ feedbackPlaceholder:
635
+ "Describe what happened before this plan error appeared.",
636
+ openGitHubIssue: "Open GitHub issue",
633
637
  joinedOrg: "Joined {{orgName}}. Opening plan...",
634
638
  acceptingInvite: "Accepting invite",
635
639
  joiningOrg: "Joining organization",
@@ -474,6 +474,10 @@ const messages = {
474
474
  requestAccessTitle: "Solicitar acceso a este plan",
475
475
  requestSent: "Solicitud enviada",
476
476
  retry: "Rever",
477
+ sendFeedback: "Enviar comentarios",
478
+ feedbackPlaceholder:
479
+ "Describe qué pasó antes de que apareciera este error del plan.",
480
+ openGitHubIssue: "Abrir issue en GitHub",
477
481
  retryHelp:
478
482
  "Vuelva a intentar la carga o inicie sesión con otra cuenta si se trata de un enlace de plan privado.",
479
483
  signIn: "Iniciar sesión",
@@ -476,6 +476,10 @@ const messages = {
476
476
  requestAccessTitle: "Demander l'accès à ce plan",
477
477
  requestSent: "Demande envoyée",
478
478
  retry: "Réessayer",
479
+ sendFeedback: "Envoyer un retour",
480
+ feedbackPlaceholder:
481
+ "Décrivez ce qui s'est passé avant cette erreur de plan.",
482
+ openGitHubIssue: "Ouvrir une issue GitHub",
479
483
  retryHelp:
480
484
  "Réessayez le chargement ou connectez-vous avec un autre compte s'il s'agit d'un lien vers un forfait privé.",
481
485
  signIn: "Se connecter",
@@ -626,6 +626,9 @@ const messages = {
626
626
  signIn: "लॉग इन करें",
627
627
  haveAccount: "मेरा पहले से ही खाता है",
628
628
  retry: "पुनः प्रयास करें",
629
+ sendFeedback: "फ़ीडबैक भेजें",
630
+ feedbackPlaceholder: "इस प्लान त्रुटि से पहले क्या हुआ, उसका वर्णन करें।",
631
+ openGitHubIssue: "GitHub issue खोलें",
629
632
  joinedOrg: "{{orgName}} से जुड़े। उद्घाटन योजना...",
630
633
  acceptingInvite: "निमंत्रण स्वीकार कर रहा हूँ",
631
634
  joiningOrg: "संगठन से जुड़ना",
@@ -626,6 +626,10 @@ const messages = {
626
626
  signIn: "登录",
627
627
  haveAccount: "我已有账户",
628
628
  retry: "重试",
629
+ sendFeedback: "フィードバックを送信",
630
+ feedbackPlaceholder:
631
+ "このプランエラーの直前に起きたことを説明してください。",
632
+ openGitHubIssue: "GitHub issue を開く",
629
633
  joinedOrg: "已加入 {{orgName}}。正在打开计划...",
630
634
  acceptingInvite: "正在接受邀请",
631
635
  joiningOrg: "正在加入组织",
@@ -615,6 +615,10 @@ const messages = {
615
615
  signIn: "登录",
616
616
  haveAccount: "我已有账户",
617
617
  retry: "重试",
618
+ sendFeedback: "피드백 보내기",
619
+ feedbackPlaceholder:
620
+ "이 계획 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.",
621
+ openGitHubIssue: "GitHub issue 열기",
618
622
  joinedOrg: "已加入 {{orgName}}。正在打开计划...",
619
623
  acceptingInvite: "正在接受邀请",
620
624
  joiningOrg: "正在加入组织",
@@ -651,6 +651,10 @@ const messages = {
651
651
  signIn: "Conecte-se",
652
652
  haveAccount: "Eu já tenho uma conta",
653
653
  retry: "Tente novamente",
654
+ sendFeedback: "Enviar feedback",
655
+ feedbackPlaceholder:
656
+ "Descreva o que aconteceu antes deste erro do plano aparecer.",
657
+ openGitHubIssue: "Abrir issue no GitHub",
654
658
  joinedOrg: "Inscreveu-se em {{orgName}}. Plano de abertura...",
655
659
  acceptingInvite: "Aceitando convite",
656
660
  joiningOrg: "Aderindo à organização",
@@ -445,6 +445,9 @@ const messages = {
445
445
  requestAccessTitle: "请求访问此计划",
446
446
  requestSent: "请求已发送",
447
447
  retry: "重试",
448
+ sendFeedback: "发送反馈",
449
+ feedbackPlaceholder: "描述此计划错误出现前发生了什么。",
450
+ openGitHubIssue: "打开 GitHub issue",
448
451
  retryHelp: "重试加载,或者如果这是私人计划链接,则使用其他帐户登录。",
449
452
  signIn: "登入",
450
453
  signInTitle: "登录查看此计划",
@@ -445,6 +445,9 @@ const messages = {
445
445
  requestAccessTitle: "請求存取此計畫",
446
446
  requestSent: "請求已傳送",
447
447
  retry: "重試",
448
+ sendFeedback: "傳送意見回饋",
449
+ feedbackPlaceholder: "描述此計畫錯誤出現前發生了什麼。",
450
+ openGitHubIssue: "開啟 GitHub issue",
448
451
  retryHelp: "重試載入,或者如果這是私人計畫連結,則使用其他帳戶登入。",
449
452
  signIn: "登入",
450
453
  signInTitle: "登入檢視此計畫",