@agent-native/core 0.92.5 → 0.92.6

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 (147) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +13 -0
  3. package/corpus/core/docs/content/template-assets.mdx +139 -0
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +96 -6
  6. package/corpus/core/src/client/AssistantChat.tsx +127 -15
  7. package/corpus/core/src/client/chat/tool-call-display.tsx +9 -3
  8. package/corpus/core/src/client/org/TeamPage.tsx +274 -177
  9. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -6
  10. package/corpus/core/src/client/settings/SettingsPanel.tsx +1 -1
  11. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +49 -1
  12. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +2 -2
  13. package/corpus/core/src/demo/config.ts +3 -3
  14. package/corpus/core/src/demo/redact.ts +720 -0
  15. package/corpus/core/src/extensions/url-safety.ts +13 -1
  16. package/corpus/core/src/localization/default-messages.ts +7 -0
  17. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +7 -0
  18. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +7 -0
  19. package/corpus/core/src/templates/default/app/i18n/en-US.ts +7 -0
  20. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +7 -0
  21. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +7 -0
  22. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +7 -0
  23. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +7 -0
  24. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +7 -0
  25. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +7 -0
  26. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -0
  27. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -0
  28. package/corpus/templates/analytics/AGENTS.md +6 -3
  29. package/corpus/templates/analytics/changelog/2026-07-09-uptime-monitors-use-scheduled-workers-in-production-serverless.md +6 -0
  30. package/corpus/templates/analytics/docs/uptime-monitoring.md +5 -0
  31. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +14 -2
  32. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +35 -0
  33. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +19 -0
  34. package/corpus/templates/assets/AGENTS.md +13 -0
  35. package/corpus/templates/assets/actions/_generation-preset-settings.ts +73 -0
  36. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +63 -0
  37. package/corpus/templates/assets/actions/create-generation-preset.ts +22 -8
  38. package/corpus/templates/assets/actions/duplicate-library.ts +49 -1
  39. package/corpus/templates/assets/actions/generate-image-batch.ts +14 -1
  40. package/corpus/templates/assets/actions/generate-image.ts +195 -26
  41. package/corpus/templates/assets/actions/import-asset-from-url.ts +323 -0
  42. package/corpus/templates/assets/actions/list-generation-presets.ts +1 -1
  43. package/corpus/templates/assets/actions/rerun-generation-run.ts +37 -0
  44. package/corpus/templates/assets/actions/update-generation-preset.ts +19 -1
  45. package/corpus/templates/assets/app/i18n/ar-SA.ts +1 -0
  46. package/corpus/templates/assets/app/i18n/de-DE.ts +1 -0
  47. package/corpus/templates/assets/app/i18n/es-ES.ts +1 -0
  48. package/corpus/templates/assets/app/i18n/fr-FR.ts +1 -0
  49. package/corpus/templates/assets/app/i18n/hi-IN.ts +1 -0
  50. package/corpus/templates/assets/app/i18n/ja-JP.ts +1 -0
  51. package/corpus/templates/assets/app/i18n/ko-KR.ts +1 -0
  52. package/corpus/templates/assets/app/i18n/pt-BR.ts +1 -0
  53. package/corpus/templates/assets/app/i18n/zh-CN.ts +1 -0
  54. package/corpus/templates/assets/app/i18n/zh-TW.ts +41 -0
  55. package/corpus/templates/assets/app/i18n-data.ts +93 -0
  56. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +66 -11
  57. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +959 -24
  58. package/corpus/templates/assets/changelog/2026-07-07-preset-skeleton-controls-fit-correctly-on-narrower-edit-page.md +6 -0
  59. package/corpus/templates/assets/changelog/2026-07-09-import-reference-images-from-url.md +6 -0
  60. package/corpus/templates/assets/changelog/2026-07-09-preset-reference-board.md +6 -0
  61. package/corpus/templates/assets/server/handlers/assets.ts +7 -27
  62. package/corpus/templates/assets/server/lib/generation.ts +83 -2
  63. package/corpus/templates/assets/server/lib/preset-chat-context.ts +17 -4
  64. package/corpus/templates/assets/server/lib/preset-references.ts +182 -0
  65. package/corpus/templates/assets/server/lib/upload-validation.ts +38 -0
  66. package/corpus/templates/assets/shared/api.ts +20 -0
  67. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +6 -0
  68. package/corpus/templates/calendar/actions/create-event.ts +8 -2
  69. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +22 -7
  70. package/corpus/templates/calendar/changelog/2026-07-09-calendar-events-with-guests-now-automatically-get-a-google-m.md +6 -0
  71. package/corpus/templates/calendar/changelog/2026-07-09-new-events-now-mark-the-creator-rsvp-as-yes.md +6 -0
  72. package/corpus/templates/calendar/server/handlers/events.ts +9 -2
  73. package/corpus/templates/calendar/server/lib/event-video-conferencing.ts +58 -0
  74. package/corpus/templates/calendar/server/lib/google-calendar.ts +1 -0
  75. package/corpus/templates/clips/changelog/2026-07-09-meeting-reminder-popovers-can-now-be-dismissed-with-a-top-le.md +6 -0
  76. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +3 -1
  77. package/corpus/templates/clips/desktop/src/styles.css +13 -9
  78. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +5 -2
  79. package/dist/agent/production-agent.d.ts +34 -1
  80. package/dist/agent/production-agent.d.ts.map +1 -1
  81. package/dist/agent/production-agent.js +58 -5
  82. package/dist/agent/production-agent.js.map +1 -1
  83. package/dist/client/AssistantChat.d.ts +3 -1
  84. package/dist/client/AssistantChat.d.ts.map +1 -1
  85. package/dist/client/AssistantChat.js +96 -15
  86. package/dist/client/AssistantChat.js.map +1 -1
  87. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  88. package/dist/client/chat/tool-call-display.js +5 -1
  89. package/dist/client/chat/tool-call-display.js.map +1 -1
  90. package/dist/client/org/TeamPage.d.ts.map +1 -1
  91. package/dist/client/org/TeamPage.js +32 -13
  92. package/dist/client/org/TeamPage.js.map +1 -1
  93. package/dist/client/settings/DemoModeSection.d.ts +3 -3
  94. package/dist/client/settings/DemoModeSection.js +4 -4
  95. package/dist/client/settings/DemoModeSection.js.map +1 -1
  96. package/dist/client/settings/SettingsPanel.js +1 -1
  97. package/dist/client/settings/SettingsPanel.js.map +1 -1
  98. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  99. package/dist/client/settings/SettingsTabsPage.js +38 -2
  100. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  101. package/dist/collab/awareness.d.ts +2 -2
  102. package/dist/collab/awareness.d.ts.map +1 -1
  103. package/dist/demo/actions/toggle-demo-mode.js +2 -2
  104. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  105. package/dist/demo/config.js +3 -3
  106. package/dist/demo/config.js.map +1 -1
  107. package/dist/demo/redact.d.ts +1 -1
  108. package/dist/demo/redact.d.ts.map +1 -1
  109. package/dist/demo/redact.js +0 -0
  110. package/dist/demo/redact.js.map +1 -1
  111. package/dist/extensions/url-safety.d.ts +5 -0
  112. package/dist/extensions/url-safety.d.ts.map +1 -1
  113. package/dist/extensions/url-safety.js +10 -0
  114. package/dist/extensions/url-safety.js.map +1 -1
  115. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  116. package/dist/localization/default-messages.d.ts +7 -0
  117. package/dist/localization/default-messages.d.ts.map +1 -1
  118. package/dist/localization/default-messages.js +7 -0
  119. package/dist/localization/default-messages.js.map +1 -1
  120. package/dist/observability/routes.d.ts +5 -5
  121. package/dist/progress/routes.d.ts +1 -1
  122. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  123. package/dist/resources/handlers.d.ts +1 -1
  124. package/dist/templates/default/app/i18n/ar-SA.ts +7 -0
  125. package/dist/templates/default/app/i18n/de-DE.ts +7 -0
  126. package/dist/templates/default/app/i18n/en-US.ts +7 -0
  127. package/dist/templates/default/app/i18n/es-ES.ts +7 -0
  128. package/dist/templates/default/app/i18n/fr-FR.ts +7 -0
  129. package/dist/templates/default/app/i18n/hi-IN.ts +7 -0
  130. package/dist/templates/default/app/i18n/ja-JP.ts +7 -0
  131. package/dist/templates/default/app/i18n/ko-KR.ts +7 -0
  132. package/dist/templates/default/app/i18n/pt-BR.ts +7 -0
  133. package/dist/templates/default/app/i18n/zh-CN.ts +7 -0
  134. package/dist/templates/default/app/i18n/zh-TW.ts +7 -0
  135. package/docs/content/template-assets.mdx +139 -0
  136. package/package.json +1 -1
  137. package/src/templates/default/app/i18n/ar-SA.ts +7 -0
  138. package/src/templates/default/app/i18n/de-DE.ts +7 -0
  139. package/src/templates/default/app/i18n/en-US.ts +7 -0
  140. package/src/templates/default/app/i18n/es-ES.ts +7 -0
  141. package/src/templates/default/app/i18n/fr-FR.ts +7 -0
  142. package/src/templates/default/app/i18n/hi-IN.ts +7 -0
  143. package/src/templates/default/app/i18n/ja-JP.ts +7 -0
  144. package/src/templates/default/app/i18n/ko-KR.ts +7 -0
  145. package/src/templates/default/app/i18n/pt-BR.ts +7 -0
  146. package/src/templates/default/app/i18n/zh-CN.ts +7 -0
  147. package/src/templates/default/app/i18n/zh-TW.ts +7 -0
@@ -169,6 +169,46 @@ const brandKitDetailEnUS = {
169
169
  lowerLeft: "Lower left",
170
170
  skeletonEnabled: "Enabled",
171
171
  skeletonOff: "Off",
172
+ addReference: "Add reference",
173
+ referenceBoard: "Reference board",
174
+ referenceBoardEmptyDescription:
175
+ 'Add named visual slots like "Steve" so every run can use the right people, products, or style references.',
176
+ referenceDefaultLabel: "Reference",
177
+ referenceImageCount: "{{count}}/{{max}} images",
178
+ referenceSubjectImageCount: "{{count}}/{{max}} subject images",
179
+ moreImagesCount: "+{{count}}",
180
+ referenceLabel: "Label",
181
+ referenceRoleLabel: "Role",
182
+ referenceRole_subject: "Subject",
183
+ referenceRole_style: "Style",
184
+ referenceRole_product: "Product",
185
+ referenceRole_background: "Background",
186
+ referenceRole_composition: "Composition",
187
+ referenceDescription: "Description",
188
+ referenceDescriptionPlaceholder:
189
+ "e.g. This is Steve, our usual host. Render him faithfully.",
190
+ referenceMode: "Reference mode",
191
+ fixedReference: "Fixed",
192
+ swappableReference: "Swappable",
193
+ requiredPerRun: "Required",
194
+ required: "Required",
195
+ filledPerGeneration: "Filled per generation",
196
+ noReferenceImages: "No reference images",
197
+ chooseReferenceImage: "Choose from library",
198
+ searchLibraryImages: "Search library images",
199
+ editReference: "Edit reference",
200
+ uploadReferenceImage: "Upload image",
201
+ uploadingReferenceImage: "Uploading...",
202
+ referenceImageUploaded: "Reference image uploaded.",
203
+ couldNotUploadReferenceImage: "Could not upload reference image.",
204
+ removeReference: "Remove reference",
205
+ removeReferenceImage: "Remove reference image",
206
+ referenceBoardTotalLimitError:
207
+ "The reference board may attach at most 8 images total.",
208
+ referenceBoardSubjectLimitError:
209
+ "Subject reference entries may attach at most 4 images total.",
210
+ subjectReferenceModelTip:
211
+ "Tip: gemini-3-pro-image holds up to 5 people consistent — best for photo references.",
172
212
  openChat: "Open chat",
173
213
  defaultTextPolicy:
174
214
  "Prefer no embedded text. Keep any requested text short and readable.",
@@ -1003,6 +1043,50 @@ type PartialMessages = {
1003
1043
  };
1004
1044
  };
1005
1045
 
1046
+ // TODO(l10n): translate after QA.
1047
+ const referenceBoardL10nTodo = {
1048
+ addReference: "Add reference",
1049
+ referenceBoard: "Reference board",
1050
+ referenceBoardEmptyDescription:
1051
+ 'Add named visual slots like "Steve" so every run can use the right people, products, or style references.',
1052
+ referenceDefaultLabel: "Reference",
1053
+ referenceImageCount: "{{count}}/{{max}} images",
1054
+ referenceSubjectImageCount: "{{count}}/{{max}} subject images",
1055
+ moreImagesCount: "+{{count}}",
1056
+ referenceLabel: "Label",
1057
+ referenceRoleLabel: "Role",
1058
+ referenceRole_subject: "Subject",
1059
+ referenceRole_style: "Style",
1060
+ referenceRole_product: "Product",
1061
+ referenceRole_background: "Background",
1062
+ referenceRole_composition: "Composition",
1063
+ referenceDescription: "Description",
1064
+ referenceDescriptionPlaceholder:
1065
+ "e.g. This is Steve, our usual host. Render him faithfully.",
1066
+ referenceMode: "Reference mode",
1067
+ fixedReference: "Fixed",
1068
+ swappableReference: "Swappable",
1069
+ requiredPerRun: "Required",
1070
+ required: "Required",
1071
+ filledPerGeneration: "Filled per generation",
1072
+ noReferenceImages: "No reference images",
1073
+ chooseReferenceImage: "Choose from library",
1074
+ searchLibraryImages: "Search library images",
1075
+ editReference: "Edit reference",
1076
+ uploadReferenceImage: "Upload image",
1077
+ uploadingReferenceImage: "Uploading...",
1078
+ referenceImageUploaded: "Reference image uploaded.",
1079
+ couldNotUploadReferenceImage: "Could not upload reference image.",
1080
+ removeReference: "Remove reference",
1081
+ removeReferenceImage: "Remove reference image",
1082
+ referenceBoardTotalLimitError:
1083
+ "The reference board may attach at most 8 images total.",
1084
+ referenceBoardSubjectLimitError:
1085
+ "Subject reference entries may attach at most 4 images total.",
1086
+ subjectReferenceModelTip:
1087
+ "Tip: gemini-3-pro-image holds up to 5 people consistent — best for photo references.",
1088
+ } satisfies Partial<Messages["brandKitDetail"]>;
1089
+
1006
1090
  const brandKitDetailArSA = {
1007
1091
  addAssetsDescription:
1008
1092
  "قم بتحميل المواد المصدرية أو قم بإنشاء مرشحين، ثم حدد فقط الأصول التي يجب أن توجه الأجيال القادمة كمراجع.",
@@ -1081,6 +1165,7 @@ const brandKitDetailArSA = {
1081
1165
  lowerLeft: "أسفل اليسار",
1082
1166
  skeletonEnabled: "مفعل",
1083
1167
  skeletonOff: "متوقف",
1168
+ ...referenceBoardL10nTodo,
1084
1169
  couldNotAddSelectedToReferences: "لا يمكن إضافة الأصول المحددة إلى المراجع.",
1085
1170
  couldNotAddToReferences: "لا يمكن إضافة الأصل إلى المراجع.",
1086
1171
  couldNotArchiveBrandKit: "تعذر أرشفة مجموعة العلامة التجارية.",
@@ -1317,6 +1402,7 @@ const brandKitDetailDeDE = {
1317
1402
  lowerLeft: "Unten links",
1318
1403
  skeletonEnabled: "Aktiviert",
1319
1404
  skeletonOff: "Aus",
1405
+ ...referenceBoardL10nTodo,
1320
1406
  couldNotAddSelectedToReferences:
1321
1407
  "Ausgewählte Assets konnten nicht zu Referenzen hinzugefügt werden.",
1322
1408
  couldNotAddToReferences:
@@ -1559,6 +1645,7 @@ const brandKitDetailEsES = {
1559
1645
  lowerLeft: "Inferior izquierda",
1560
1646
  skeletonEnabled: "Activado",
1561
1647
  skeletonOff: "Desactivado",
1648
+ ...referenceBoardL10nTodo,
1562
1649
  couldNotAddSelectedToReferences:
1563
1650
  "No se pudieron agregar los recursos seleccionados a las Referencias.",
1564
1651
  couldNotAddToReferences: "No se pudo agregar activo a Referencias.",
@@ -1804,6 +1891,7 @@ const brandKitDetailFrFR = {
1804
1891
  lowerLeft: "En bas à gauche",
1805
1892
  skeletonEnabled: "Activé",
1806
1893
  skeletonOff: "Désactivé",
1894
+ ...referenceBoardL10nTodo,
1807
1895
  couldNotAddSelectedToReferences:
1808
1896
  "Impossible d'ajouter les éléments sélectionnés aux références.",
1809
1897
  couldNotAddToReferences: "Impossible d'ajouter un élément aux références.",
@@ -2043,6 +2131,7 @@ const brandKitDetailHiIN = {
2043
2131
  lowerLeft: "नीचे बाएं",
2044
2132
  skeletonEnabled: "सक्षम",
2045
2133
  skeletonOff: "बंद",
2134
+ ...referenceBoardL10nTodo,
2046
2135
  couldNotAddSelectedToReferences:
2047
2136
  "चयनित परिसंपत्तियों को संदर्भों में नहीं जोड़ा जा सका.",
2048
2137
  couldNotAddToReferences: "संदर्भों में संपत्ति नहीं जोड़ी जा सकी.",
@@ -2278,6 +2367,7 @@ const brandKitDetailJaJP = {
2278
2367
  lowerLeft: "左下",
2279
2368
  skeletonEnabled: "有効",
2280
2369
  skeletonOff: "オフ",
2370
+ ...referenceBoardL10nTodo,
2281
2371
  couldNotAddSelectedToReferences:
2282
2372
  "選択したアセットを参照に追加できませんでした。",
2283
2373
  couldNotAddToReferences: "アセットを参照に追加できませんでした。",
@@ -2518,6 +2608,7 @@ const brandKitDetailKoKR = {
2518
2608
  lowerLeft: "왼쪽 아래",
2519
2609
  skeletonEnabled: "활성화됨",
2520
2610
  skeletonOff: "꺼짐",
2611
+ ...referenceBoardL10nTodo,
2521
2612
  couldNotAddSelectedToReferences: "선택한 자산을 참조에 추가할 수 없습니다.",
2522
2613
  couldNotAddToReferences: "참조에 자산을 추가할 수 없습니다.",
2523
2614
  couldNotArchiveBrandKit: "브랜드 키트를 보관할 수 없습니다.",
@@ -2754,6 +2845,7 @@ const brandKitDetailPtBR = {
2754
2845
  lowerLeft: "Inferior esquerda",
2755
2846
  skeletonEnabled: "Ativado",
2756
2847
  skeletonOff: "Desativado",
2848
+ ...referenceBoardL10nTodo,
2757
2849
  couldNotAddSelectedToReferences:
2758
2850
  "Não foi possível adicionar os ativos selecionados às referências.",
2759
2851
  couldNotAddToReferences: "Não foi possível adicionar recurso às referências.",
@@ -3950,6 +4042,7 @@ export const messagesByLocale = {
3950
4042
  lowerLeft: "左下",
3951
4043
  skeletonEnabled: "已启用",
3952
4044
  skeletonOff: "关闭",
4045
+ ...referenceBoardL10nTodo,
3953
4046
  openChat: "打开聊天",
3954
4047
  defaultTextPolicy: "尽量不要嵌入文字。如需文字,请保持简短且易读。",
3955
4048
  generationPresetCreated: "生成预设已创建。",
@@ -1475,7 +1475,7 @@ export function BrandKitDetailRoute({
1475
1475
  <RunCard
1476
1476
  key={run.id}
1477
1477
  run={run}
1478
- outputAssets={assetById}
1478
+ assetById={assetById}
1479
1479
  rerunning={
1480
1480
  rerunGeneration.isPending || refreshGeneration.isPending
1481
1481
  }
@@ -1644,13 +1644,13 @@ type LaneGalleryItem = {
1644
1644
 
1645
1645
  function RunCard({
1646
1646
  run,
1647
- outputAssets,
1647
+ assetById,
1648
1648
  onRerun,
1649
1649
  onCreateHandoff,
1650
1650
  rerunning,
1651
1651
  }: {
1652
1652
  run: any;
1653
- outputAssets?: Map<string, any>;
1653
+ assetById?: Map<string, any>;
1654
1654
  onRerun: () => void;
1655
1655
  onCreateHandoff: () => void;
1656
1656
  rerunning?: boolean;
@@ -1661,14 +1661,16 @@ function RunCard({
1661
1661
  string,
1662
1662
  unknown
1663
1663
  >;
1664
- const selectedReferenceIds = Array.isArray(
1664
+ const selectedReferenceIds: string[] = Array.isArray(
1665
1665
  referenceSelection.selectedAssetIds,
1666
1666
  )
1667
1667
  ? referenceSelection.selectedAssetIds.filter(
1668
1668
  (id): id is string => typeof id === "string",
1669
1669
  )
1670
1670
  : Array.isArray(run.referenceAssetIds)
1671
- ? run.referenceAssetIds
1671
+ ? run.referenceAssetIds.filter(
1672
+ (id: unknown): id is string => typeof id === "string",
1673
+ )
1672
1674
  : [];
1673
1675
  const outputIds = Array.isArray(run.output?.assetIds)
1674
1676
  ? run.output.assetIds.filter(
@@ -1778,7 +1780,7 @@ function RunCard({
1778
1780
  {outputIds.length ? (
1779
1781
  <div className="mt-2 flex flex-wrap gap-2">
1780
1782
  {outputIds.map((assetId: any) => {
1781
- const outputAsset = outputAssets?.get(assetId);
1783
+ const outputAsset = assetById?.get(assetId);
1782
1784
  return (
1783
1785
  <Button
1784
1786
  key={assetId}
@@ -1812,11 +1814,21 @@ function RunCard({
1812
1814
  <div className="text-xs font-medium text-muted-foreground">
1813
1815
  {t("brandKitDetail.references")}
1814
1816
  </div>
1815
- <p className="mt-2 line-clamp-2 text-xs text-muted-foreground">
1816
- {selectedReferenceIds.length
1817
- ? selectedReferenceIds.map(shortId).join(", ")
1818
- : t("brandKitDetail.noneSelected")}
1819
- </p>
1817
+ {selectedReferenceIds.length ? (
1818
+ <div className="mt-2 flex flex-wrap gap-2">
1819
+ {selectedReferenceIds.map((assetId) => (
1820
+ <RunReferenceTile
1821
+ key={assetId}
1822
+ assetId={assetId}
1823
+ asset={assetById?.get(assetId)}
1824
+ />
1825
+ ))}
1826
+ </div>
1827
+ ) : (
1828
+ <p className="mt-2 text-xs text-muted-foreground">
1829
+ {t("brandKitDetail.noneSelected")}
1830
+ </p>
1831
+ )}
1820
1832
  </div>
1821
1833
  </div>
1822
1834
 
@@ -1834,6 +1846,49 @@ function RunCard({
1834
1846
  );
1835
1847
  }
1836
1848
 
1849
+ function RunReferenceTile({
1850
+ assetId,
1851
+ asset,
1852
+ }: {
1853
+ assetId: string;
1854
+ asset?: any;
1855
+ }) {
1856
+ const label = asset ? assetDisplayTitle(asset) : shortId(assetId);
1857
+ return (
1858
+ <Link
1859
+ to={asset ? `/asset/${asset.id}` : "#"}
1860
+ title={asset ? `${label} · ${asset.id}` : assetId}
1861
+ aria-disabled={!asset}
1862
+ className={[
1863
+ "group block w-20 overflow-hidden rounded-md border bg-background text-left transition",
1864
+ asset
1865
+ ? "hover:border-foreground/30 hover:shadow-sm"
1866
+ : "pointer-events-none border-dashed",
1867
+ ].join(" ")}
1868
+ >
1869
+ <div className="aspect-square bg-muted/40">
1870
+ {asset ? (
1871
+ <AssetPreview asset={asset} fit="cover" />
1872
+ ) : (
1873
+ <div className="flex h-full w-full items-center justify-center">
1874
+ <IconPhoto className="h-5 w-5 text-muted-foreground" />
1875
+ </div>
1876
+ )}
1877
+ </div>
1878
+ <div className="border-t px-1.5 py-1">
1879
+ <div className="truncate text-[11px] font-medium text-foreground">
1880
+ {label}
1881
+ </div>
1882
+ {asset ? (
1883
+ <div className="truncate text-[10px] text-muted-foreground">
1884
+ {shortId(assetId)}
1885
+ </div>
1886
+ ) : null}
1887
+ </div>
1888
+ </Link>
1889
+ );
1890
+ }
1891
+
1837
1892
  function RunFact({ label, value }: { label: string; value: string }) {
1838
1893
  return (
1839
1894
  <div className="rounded-md border bg-muted/20 px-3 py-2">