@agent-native/core 0.106.2 → 0.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +19 -0
  3. package/corpus/core/docs/content/external-agents.mdx +8 -0
  4. package/corpus/core/docs/content/integrations.mdx +597 -0
  5. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +7 -0
  6. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
  7. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +7 -0
  8. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +9 -0
  9. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
  10. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +9 -0
  11. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +9 -0
  12. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
  13. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +9 -0
  14. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +9 -0
  15. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
  16. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +9 -0
  17. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +8 -0
  18. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
  19. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +8 -0
  20. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +8 -0
  21. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
  22. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +8 -0
  23. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +8 -0
  24. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
  25. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +8 -0
  26. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +9 -0
  27. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
  28. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +9 -0
  29. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +6 -0
  30. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
  31. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +6 -0
  32. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +6 -0
  33. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
  34. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +6 -0
  35. package/corpus/core/docs/content/mcp-clients.mdx +51 -1
  36. package/corpus/core/docs/content/mcp-protocol.mdx +8 -0
  37. package/corpus/core/docs/content/organizations-teams-permissions.mdx +413 -0
  38. package/corpus/core/package.json +1 -1
  39. package/corpus/core/src/client/AssistantChat.tsx +13 -1
  40. package/corpus/core/src/client/chat/message-components.tsx +41 -0
  41. package/corpus/core/src/client/composer/TiptapComposer.tsx +45 -8
  42. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +30 -11
  43. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +240 -0
  44. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +159 -40
  45. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +433 -4
  46. package/corpus/core/src/client/resources/mcp-integration-logos.ts +108 -0
  47. package/corpus/core/src/deploy/build.ts +32 -0
  48. package/corpus/core/src/extensions/html-shell.ts +33 -1
  49. package/corpus/core/src/ingestion/office.ts +1 -2
  50. package/corpus/core/src/ingestion/pptx.ts +2 -4
  51. package/corpus/core/src/localization/default-messages.ts +126 -1
  52. package/corpus/core/src/mcp/actions/call-mcp-tool.ts +1 -0
  53. package/corpus/core/src/mcp/builtin-tools.ts +115 -10
  54. package/corpus/core/src/server/index.ts +4 -0
  55. package/corpus/core/src/server/org-admin.ts +28 -0
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  57. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  58. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
  59. package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +64 -0
  60. package/corpus/templates/analytics/AGENTS.md +5 -0
  61. package/corpus/templates/analytics/actions/clone-creative-context-dashboard.ts +86 -0
  62. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -0
  63. package/corpus/templates/analytics/app/i18n/zh-TW.ts +1 -0
  64. package/corpus/templates/analytics/app/i18n-data.ts +1 -0
  65. package/corpus/templates/analytics/app/pages/Ask.tsx +8 -4
  66. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +59 -0
  67. package/corpus/templates/analytics/app/routes/agent.tsx +7 -1
  68. package/corpus/templates/analytics/changelog/2026-07-17-library-now-flags-published-dashboards-with-newer-versions-a.md +6 -0
  69. package/corpus/templates/analytics/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  70. package/corpus/templates/analytics/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  71. package/corpus/templates/analytics/package.json +1 -0
  72. package/corpus/templates/analytics/server/lib/native-creative-context.ts +158 -0
  73. package/corpus/templates/analytics/server/plugins/creative-context.ts +10 -0
  74. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -3
  75. package/corpus/templates/assets/AGENTS.md +5 -0
  76. package/corpus/templates/assets/actions/clone-creative-context-asset.ts +74 -0
  77. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +2 -1
  78. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +308 -178
  79. package/corpus/templates/assets/app/routes/library.tsx +5 -11
  80. package/corpus/templates/assets/changelog/2026-07-17-library-now-flags-published-assets-with-newer-versions-and-l.md +6 -0
  81. package/corpus/templates/assets/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  82. package/corpus/templates/assets/server/lib/native-creative-context.ts +198 -0
  83. package/corpus/templates/assets/server/plugins/creative-context.ts +4 -0
  84. package/corpus/templates/brain/actions/provider-api-request.ts +1 -0
  85. package/corpus/templates/calendar/actions/provider-api-request.ts +1 -0
  86. package/corpus/templates/clips/actions/get-recording-insights.ts +7 -4
  87. package/corpus/templates/clips/actions/list-recordings.ts +48 -0
  88. package/corpus/templates/clips/actions/list-viewers.ts +2 -1
  89. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +3 -1
  90. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -3
  91. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +11 -6
  92. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -1
  93. package/corpus/templates/clips/app/lib/ffmpeg-export.ts +4 -2
  94. package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -3
  95. package/corpus/templates/clips/changelog/2026-07-17-dictation-keeps-sentence-spacing-and-no-longer-crashes-when-.md +6 -0
  96. package/corpus/templates/clips/changelog/2026-07-17-shared-clips-now-preserve-editor-access-and-show-editor-insi.md +6 -0
  97. package/corpus/templates/clips/changelog/2026-07-17-stitching-clips-no-longer-fails-when-editor-media-metadata-i.md +6 -0
  98. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -8
  99. package/corpus/templates/clips/shared/view-analytics.ts +4 -0
  100. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +12 -3
  101. package/corpus/templates/content/AGENTS.md +5 -0
  102. package/corpus/templates/content/actions/clone-creative-context-document.ts +61 -0
  103. package/corpus/templates/content/actions/provider-api-request.ts +1 -0
  104. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +21 -0
  105. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +29 -0
  106. package/corpus/templates/content/changelog/2026-07-17-library-now-flags-published-documents-with-newer-versions-an.md +6 -0
  107. package/corpus/templates/content/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  108. package/corpus/templates/content/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  109. package/corpus/templates/content/parity/matrix.md +1 -1
  110. package/corpus/templates/content/parity/matrix.ts +1 -0
  111. package/corpus/templates/content/server/lib/native-creative-context.ts +191 -0
  112. package/corpus/templates/content/server/plugins/creative-context.ts +8 -1
  113. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -3
  114. package/corpus/templates/design/AGENTS.md +5 -0
  115. package/corpus/templates/design/actions/clone-creative-context-design-native.ts +111 -0
  116. package/corpus/templates/design/actions/provider-api-request.ts +1 -0
  117. package/corpus/templates/design/app/pages/Index.tsx +44 -0
  118. package/corpus/templates/design/app/pages/design-editor/types.ts +1 -0
  119. package/corpus/templates/design/changelog/2026-07-17-library-now-flags-published-designs-with-newer-versions-and-.md +6 -0
  120. package/corpus/templates/design/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  121. package/corpus/templates/design/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  122. package/corpus/templates/design/server/lib/native-creative-context.ts +265 -0
  123. package/corpus/templates/design/server/plugins/creative-context.ts +8 -1
  124. package/corpus/templates/dispatch/actions/provider-api-request.ts +1 -0
  125. package/corpus/templates/mail/actions/provider-api-request.ts +1 -0
  126. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +11 -3
  127. package/corpus/templates/slides/AGENTS.md +5 -0
  128. package/corpus/templates/slides/actions/clone-creative-context-deck.ts +96 -0
  129. package/corpus/templates/slides/actions/extract-pdf.ts +3 -2
  130. package/corpus/templates/slides/actions/import-file.ts +3 -2
  131. package/corpus/templates/slides/actions/provider-api-request.ts +1 -0
  132. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +27 -0
  133. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -0
  134. package/corpus/templates/slides/changelog/2026-07-17-library-now-flags-published-decks-with-newer-versions-and-le.md +6 -0
  135. package/corpus/templates/slides/changelog/2026-07-17-pdf-and-powerpoint-imports-now-work-reliably-in-hosted-decks.md +6 -0
  136. package/corpus/templates/slides/changelog/2026-07-17-resources-can-be-added-to-creative-context-from-their-action.md +6 -0
  137. package/corpus/templates/slides/changelog/2026-07-17-you-can-add-exact-approved-artifact-versions-to-governed-cre.md +6 -0
  138. package/corpus/templates/slides/server/lib/native-creative-context.ts +288 -0
  139. package/corpus/templates/slides/server/plugins/creative-context.ts +4 -0
  140. package/dist/client/AssistantChat.d.ts.map +1 -1
  141. package/dist/client/AssistantChat.js +8 -2
  142. package/dist/client/AssistantChat.js.map +1 -1
  143. package/dist/client/chat/message-components.d.ts.map +1 -1
  144. package/dist/client/chat/message-components.js +35 -1
  145. package/dist/client/chat/message-components.js.map +1 -1
  146. package/dist/client/composer/TiptapComposer.d.ts +7 -0
  147. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  148. package/dist/client/composer/TiptapComposer.js +37 -8
  149. package/dist/client/composer/TiptapComposer.js.map +1 -1
  150. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  151. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  152. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  153. package/dist/client/resources/McpConnectionSuggestion.d.ts +9 -0
  154. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -0
  155. package/dist/client/resources/McpConnectionSuggestion.js +115 -0
  156. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -0
  157. package/dist/client/resources/McpIntegrationDialog.d.ts +2 -1
  158. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  159. package/dist/client/resources/McpIntegrationDialog.js +48 -20
  160. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  161. package/dist/client/resources/mcp-integration-catalog.d.ts +9 -0
  162. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  163. package/dist/client/resources/mcp-integration-catalog.js +387 -4
  164. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  165. package/dist/client/resources/mcp-integration-logos.d.ts +2 -0
  166. package/dist/client/resources/mcp-integration-logos.d.ts.map +1 -0
  167. package/dist/client/resources/mcp-integration-logos.js +109 -0
  168. package/dist/client/resources/mcp-integration-logos.js.map +1 -0
  169. package/dist/deploy/build.d.ts.map +1 -1
  170. package/dist/deploy/build.js +23 -0
  171. package/dist/deploy/build.js.map +1 -1
  172. package/dist/extensions/html-shell.d.ts.map +1 -1
  173. package/dist/extensions/html-shell.js +33 -1
  174. package/dist/extensions/html-shell.js.map +1 -1
  175. package/dist/ingestion/office.d.ts.map +1 -1
  176. package/dist/ingestion/office.js +1 -2
  177. package/dist/ingestion/office.js.map +1 -1
  178. package/dist/ingestion/pptx.js +2 -4
  179. package/dist/ingestion/pptx.js.map +1 -1
  180. package/dist/localization/default-messages.d.ts +98 -0
  181. package/dist/localization/default-messages.d.ts.map +1 -1
  182. package/dist/localization/default-messages.js +99 -1
  183. package/dist/localization/default-messages.js.map +1 -1
  184. package/dist/mcp/actions/call-mcp-tool.js +1 -0
  185. package/dist/mcp/actions/call-mcp-tool.js.map +1 -1
  186. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  187. package/dist/mcp/builtin-tools.js +87 -6
  188. package/dist/mcp/builtin-tools.js.map +1 -1
  189. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  190. package/dist/server/index.d.ts +1 -0
  191. package/dist/server/index.d.ts.map +1 -1
  192. package/dist/server/index.js +1 -0
  193. package/dist/server/index.js.map +1 -1
  194. package/dist/server/org-admin.d.ts +3 -0
  195. package/dist/server/org-admin.d.ts.map +1 -0
  196. package/dist/server/org-admin.js +24 -0
  197. package/dist/server/org-admin.js.map +1 -0
  198. package/dist/server/transcribe-voice.d.ts +1 -1
  199. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  200. package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  201. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
  202. package/docs/content/external-agents.mdx +8 -0
  203. package/docs/content/integrations.mdx +597 -0
  204. package/docs/content/locales/ar-SA/external-agents.mdx +7 -0
  205. package/docs/content/locales/ar-SA/mcp-clients.mdx +19 -1
  206. package/docs/content/locales/ar-SA/mcp-protocol.mdx +7 -0
  207. package/docs/content/locales/de-DE/external-agents.mdx +9 -0
  208. package/docs/content/locales/de-DE/mcp-clients.mdx +22 -1
  209. package/docs/content/locales/de-DE/mcp-protocol.mdx +9 -0
  210. package/docs/content/locales/es-ES/external-agents.mdx +9 -0
  211. package/docs/content/locales/es-ES/mcp-clients.mdx +23 -1
  212. package/docs/content/locales/es-ES/mcp-protocol.mdx +9 -0
  213. package/docs/content/locales/fr-FR/external-agents.mdx +9 -0
  214. package/docs/content/locales/fr-FR/mcp-clients.mdx +23 -1
  215. package/docs/content/locales/fr-FR/mcp-protocol.mdx +9 -0
  216. package/docs/content/locales/hi-IN/external-agents.mdx +8 -0
  217. package/docs/content/locales/hi-IN/mcp-clients.mdx +22 -1
  218. package/docs/content/locales/hi-IN/mcp-protocol.mdx +8 -0
  219. package/docs/content/locales/ja-JP/external-agents.mdx +8 -0
  220. package/docs/content/locales/ja-JP/mcp-clients.mdx +21 -1
  221. package/docs/content/locales/ja-JP/mcp-protocol.mdx +8 -0
  222. package/docs/content/locales/ko-KR/external-agents.mdx +8 -0
  223. package/docs/content/locales/ko-KR/mcp-clients.mdx +20 -1
  224. package/docs/content/locales/ko-KR/mcp-protocol.mdx +8 -0
  225. package/docs/content/locales/pt-BR/external-agents.mdx +9 -0
  226. package/docs/content/locales/pt-BR/mcp-clients.mdx +22 -1
  227. package/docs/content/locales/pt-BR/mcp-protocol.mdx +9 -0
  228. package/docs/content/locales/zh-CN/external-agents.mdx +6 -0
  229. package/docs/content/locales/zh-CN/mcp-clients.mdx +17 -1
  230. package/docs/content/locales/zh-CN/mcp-protocol.mdx +6 -0
  231. package/docs/content/locales/zh-TW/external-agents.mdx +6 -0
  232. package/docs/content/locales/zh-TW/mcp-clients.mdx +17 -1
  233. package/docs/content/locales/zh-TW/mcp-protocol.mdx +6 -0
  234. package/docs/content/mcp-clients.mdx +51 -1
  235. package/docs/content/mcp-protocol.mdx +8 -0
  236. package/docs/content/organizations-teams-permissions.mdx +413 -0
  237. package/package.json +1 -1
  238. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +9 -0
  239. package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +31 -0
  240. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +9 -0
@@ -9,6 +9,7 @@ import {
9
9
  useActionMutation,
10
10
  useActionQuery,
11
11
  } from "@agent-native/core/client";
12
+ import { CreativeContextShareSheet } from "@agent-native/creative-context/client";
12
13
  import {
13
14
  IconCheck,
14
15
  IconClipboard,
@@ -20,6 +21,7 @@ import {
20
21
  IconFolderPlus,
21
22
  IconLayoutBottombar,
22
23
  IconLayoutGrid,
24
+ IconLink,
23
25
  IconMessageCircle,
24
26
  IconPencil,
25
27
  IconPhoto,
@@ -311,7 +313,8 @@ export default function BrandKitDetailRedirect() {
311
313
  }
312
314
 
313
315
  function libraryTabFromValue(value: unknown): LibraryTab | null {
314
- return value === "references" ||
316
+ return value === "drafts" ||
317
+ value === "references" ||
315
318
  value === "generated" ||
316
319
  value === "runs" ||
317
320
  value === "settings"
@@ -361,7 +364,7 @@ export function BrandKitDetailRoute({
361
364
  useState<HTMLElement | null>(null);
362
365
  const [activeFolderId, setActiveFolderId] = useState<string | null>("all");
363
366
  const [activeTab, setActiveTab] = useState<LibraryTab>(
364
- () => urlTab ?? "references",
367
+ () => urlTab ?? "generated",
365
368
  );
366
369
  const [assetViewMode, setAssetViewMode] = useState<AssetViewMode>("cards");
367
370
  const [assetScope, setAssetScope] = useState<AssetLibraryScope>("all");
@@ -735,7 +738,7 @@ export function BrandKitDetailRoute({
735
738
 
736
739
  useEffect(() => {
737
740
  const selectableAssets =
738
- activeTab === "runs" || activeTab === "settings"
741
+ activeTab === "runs" || activeTab === "settings" || activeTab === "drafts"
739
742
  ? []
740
743
  : libraryBoardAssets;
741
744
  const selectableIds = new Set(selectableAssets.map((asset) => asset.id));
@@ -1028,9 +1031,112 @@ export function BrandKitDetailRoute({
1028
1031
  );
1029
1032
  }
1030
1033
  const assetById = new Map(assets.map((asset) => [asset.id, asset]));
1031
- const activeSurfaceTab = activeTab === "runs" ? activeTab : "assets";
1034
+ const surfaceTab: LibraryTab =
1035
+ activeTab === "settings" ? "generated" : activeTab;
1036
+ const draftsCount = liveCandidateSlots.length + draftCandidateAssets.length;
1032
1037
  const hideEmptyLanes =
1033
1038
  activeFolderId !== "all" || mediaFilter !== "all" || search.trim() !== "";
1039
+ const assetsToolbar = (
1040
+ <section className="space-y-3">
1041
+ <div className="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
1042
+ <div className="flex min-w-0 flex-wrap items-center gap-2">
1043
+ <FolderChip
1044
+ active={activeFolderId === "all"}
1045
+ label={t("library.allAssets")}
1046
+ count={libraryAssets.length}
1047
+ onClick={() => setActiveFolderId("all")}
1048
+ />
1049
+ <FolderChip
1050
+ active={activeFolderId === null}
1051
+ label={t("library.unfiled")}
1052
+ count={unfiledCount}
1053
+ onClick={() => setActiveFolderId(null)}
1054
+ />
1055
+ {folders.map((folder) => (
1056
+ <FolderChip
1057
+ key={folder.id}
1058
+ active={activeFolderId === folder.id}
1059
+ label={folder.title}
1060
+ count={
1061
+ libraryAssets.filter((asset) => asset.folderId === folder.id)
1062
+ .length
1063
+ }
1064
+ onClick={() => setActiveFolderId(folder.id)}
1065
+ />
1066
+ ))}
1067
+ </div>
1068
+ <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
1069
+ <div className="relative">
1070
+ <IconSearch className="pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
1071
+ <Input
1072
+ value={search}
1073
+ onChange={(event) => setSearch(event.target.value)}
1074
+ placeholder={t("library.searchAssets")}
1075
+ className="h-9 w-full pl-8 pr-8 sm:w-64"
1076
+ />
1077
+ {search && (
1078
+ <button
1079
+ type="button"
1080
+ aria-label={t("library.clearSearch")}
1081
+ className="absolute right-2 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground"
1082
+ onClick={() => setSearch("")}
1083
+ >
1084
+ <IconX className="h-3.5 w-3.5" />
1085
+ </button>
1086
+ )}
1087
+ </div>
1088
+ <Select
1089
+ value={mediaFilter}
1090
+ onValueChange={(value) =>
1091
+ setMediaFilter(value as "all" | "image" | "video")
1092
+ }
1093
+ >
1094
+ <SelectTrigger className="h-9 w-full sm:w-32">
1095
+ <SelectValue />
1096
+ </SelectTrigger>
1097
+ <SelectContent>
1098
+ <SelectItem value="all">
1099
+ {t("brandKitDetail.allMedia")}
1100
+ </SelectItem>
1101
+ <SelectItem value="image">
1102
+ {t("brandKitDetail.images")}
1103
+ </SelectItem>
1104
+ <SelectItem value="video">
1105
+ {t("brandKitDetail.videos")}
1106
+ </SelectItem>
1107
+ </SelectContent>
1108
+ </Select>
1109
+ </div>
1110
+ </div>
1111
+ </section>
1112
+ );
1113
+ const renderAssetsBoard = (boardAssets: any[], uploads: PendingUpload[]) => (
1114
+ <AssetSwimlaneBoard
1115
+ libraryId={libraryId}
1116
+ viewMode={assetViewMode}
1117
+ onViewModeChange={setAssetViewMode}
1118
+ scope="all"
1119
+ onScopeChange={setAssetScope}
1120
+ showScopeToggle={false}
1121
+ hideEmptyLanes={hideEmptyLanes}
1122
+ assets={boardAssets}
1123
+ pendingUploads={uploads}
1124
+ folders={folders}
1125
+ promotingReferenceKeys={promotingReferenceKeys}
1126
+ onUploadClick={() => fileInputRef.current?.click()}
1127
+ onDrop={(files) => void upload(files)}
1128
+ onMoveToReferences={(asset, slot) => {
1129
+ void handleMoveToReferences(asset, slot);
1130
+ }}
1131
+ onRemoveFromReferences={(asset) => {
1132
+ void handleRemoveFromReferences(asset);
1133
+ }}
1134
+ selectedIds={selectedAssetIds}
1135
+ onSelectedIdsChange={setSelectedAssetIds}
1136
+ onOptimisticDelete={markAssetsOptimisticallyDeleted}
1137
+ onRestoreOptimisticDelete={restoreOptimisticallyDeletedAssets}
1138
+ />
1139
+ );
1034
1140
  const uploadAction = (
1035
1141
  <Button
1036
1142
  variant="outline"
@@ -1252,117 +1358,65 @@ export function BrandKitDetailRoute({
1252
1358
  </div>
1253
1359
  )}
1254
1360
  <Tabs
1255
- value={activeSurfaceTab}
1256
- onValueChange={(value) =>
1257
- setActiveTab(
1258
- value === "assets" ? "references" : (value as LibraryTab),
1259
- )
1260
- }
1361
+ value={surfaceTab}
1362
+ onValueChange={(value) => setActiveTab(value as LibraryTab)}
1261
1363
  className="space-y-4"
1262
1364
  >
1263
1365
  <TabsList>
1264
- <TabsTrigger value="assets">{t("library.assetsTab")}</TabsTrigger>
1366
+ <TabsTrigger value="drafts" className="gap-1.5">
1367
+ {t("library.drafts")}
1368
+ {draftsCount > 0 ? (
1369
+ <span className="rounded-full bg-muted px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground">
1370
+ {draftsCount}
1371
+ </span>
1372
+ ) : null}
1373
+ </TabsTrigger>
1374
+ <TabsTrigger value="generated">
1375
+ {t("library.generated")}
1376
+ </TabsTrigger>
1377
+ <TabsTrigger value="references">
1378
+ {t("library.references")}
1379
+ </TabsTrigger>
1265
1380
  <TabsTrigger value="runs">{t("library.runs")}</TabsTrigger>
1266
1381
  </TabsList>
1267
1382
 
1268
- <TabsContent value="assets" className="space-y-5">
1269
- <section className="space-y-3">
1270
- <div className="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
1271
- <div className="flex min-w-0 flex-wrap items-center gap-2">
1272
- <FolderChip
1273
- active={activeFolderId === "all"}
1274
- label={t("library.allAssets")}
1275
- count={libraryAssets.length}
1276
- onClick={() => setActiveFolderId("all")}
1277
- />
1278
- <FolderChip
1279
- active={activeFolderId === null}
1280
- label={t("library.unfiled")}
1281
- count={unfiledCount}
1282
- onClick={() => setActiveFolderId(null)}
1283
- />
1284
- {folders.map((folder) => (
1285
- <FolderChip
1286
- key={folder.id}
1287
- active={activeFolderId === folder.id}
1288
- label={folder.title}
1289
- count={
1290
- libraryAssets.filter(
1291
- (asset) => asset.folderId === folder.id,
1292
- ).length
1293
- }
1294
- onClick={() => setActiveFolderId(folder.id)}
1295
- />
1296
- ))}
1297
- </div>
1298
- <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
1299
- <div className="relative">
1300
- <IconSearch className="pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
1301
- <Input
1302
- value={search}
1303
- onChange={(event) => setSearch(event.target.value)}
1304
- placeholder={t("library.searchAssets")}
1305
- className="h-9 w-full pl-8 pr-8 sm:w-64"
1306
- />
1307
- {search && (
1308
- <button
1309
- type="button"
1310
- aria-label={t("library.clearSearch")}
1311
- className="absolute right-2 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground"
1312
- onClick={() => setSearch("")}
1313
- >
1314
- <IconX className="h-3.5 w-3.5" />
1315
- </button>
1316
- )}
1317
- </div>
1318
- <Select
1319
- value={mediaFilter}
1320
- onValueChange={(value) =>
1321
- setMediaFilter(value as "all" | "image" | "video")
1322
- }
1323
- >
1324
- <SelectTrigger className="h-9 w-full sm:w-32">
1325
- <SelectValue />
1326
- </SelectTrigger>
1327
- <SelectContent>
1328
- <SelectItem value="all">
1329
- {t("brandKitDetail.allMedia")}
1330
- </SelectItem>
1331
- <SelectItem value="image">
1332
- {t("brandKitDetail.images")}
1333
- </SelectItem>
1334
- <SelectItem value="video">
1335
- {t("brandKitDetail.videos")}
1336
- </SelectItem>
1337
- </SelectContent>
1338
- </Select>
1383
+ <TabsContent value="drafts" className="space-y-4">
1384
+ {draftsCount > 0 ? (
1385
+ <LiveCandidatesStage
1386
+ slots={liveCandidateSlots}
1387
+ draftAssets={draftCandidateAssets}
1388
+ libraryId={libraryId}
1389
+ folders={folders}
1390
+ savingSlotId={savingCandidateSlotId}
1391
+ promotingReferenceKeys={promotingReferenceKeys}
1392
+ onSave={(slot, folderId) => {
1393
+ void handleSaveLiveCandidate(slot, folderId);
1394
+ }}
1395
+ onSaveDraft={(asset, folderId) => {
1396
+ void handleSaveDraftCandidate(asset, folderId);
1397
+ }}
1398
+ onMoveToReferences={handleMoveLiveCandidateToReferences}
1399
+ onMoveDraftToReferences={(asset) => {
1400
+ void handleMoveToReferences(asset);
1401
+ }}
1402
+ />
1403
+ ) : (
1404
+ <div className="flex min-h-64 items-center justify-center rounded-lg border border-dashed border-border bg-muted/20 p-8 text-center">
1405
+ <div className="max-w-sm text-sm text-muted-foreground">
1406
+ {t("library.noDrafts")}
1339
1407
  </div>
1340
1408
  </div>
1341
- </section>
1342
- <AssetSwimlaneBoard
1343
- libraryId={libraryId}
1344
- viewMode={assetViewMode}
1345
- onViewModeChange={setAssetViewMode}
1346
- scope={assetScope}
1347
- onScopeChange={setAssetScope}
1348
- hideEmptyLanes={hideEmptyLanes}
1349
- assets={libraryBoardAssets}
1350
- pendingUploads={pendingVisibleUploads}
1351
- folders={folders}
1352
- promotingReferenceKeys={promotingReferenceKeys}
1353
- onUploadClick={() => fileInputRef.current?.click()}
1354
- onDrop={(files) => void upload(files)}
1355
- onMoveToReferences={(asset, slot) => {
1356
- void handleMoveToReferences(asset, slot);
1357
- }}
1358
- onRemoveFromReferences={(asset) => {
1359
- void handleRemoveFromReferences(asset);
1360
- }}
1361
- selectedIds={selectedAssetIds}
1362
- onSelectedIdsChange={setSelectedAssetIds}
1363
- onOptimisticDelete={markAssetsOptimisticallyDeleted}
1364
- onRestoreOptimisticDelete={restoreOptimisticallyDeletedAssets}
1365
- />
1409
+ )}
1410
+ </TabsContent>
1411
+
1412
+ <TabsContent value="generated" className="space-y-5">
1413
+ {assetsToolbar}
1414
+ {renderAssetsBoard(saved, pendingVisibleUploads)}
1415
+ </TabsContent>
1416
+
1417
+ <TabsContent value="references" className="space-y-5">
1418
+ {assetsToolbar}
1419
+ {renderAssetsBoard(references, [])}
1366
1420
  </TabsContent>
1367
1421
 
1368
1422
  <TabsContent value="runs">
@@ -1439,7 +1493,7 @@ type PendingUpload = {
1439
1493
  status: "uploading" | "checking";
1440
1494
  };
1441
1495
 
1442
- type LibraryTab = "references" | "generated" | "runs" | "settings";
1496
+ type LibraryTab = "drafts" | "references" | "generated" | "runs" | "settings";
1443
1497
  type AssetViewMode = "lanes" | "cards";
1444
1498
  type AssetLibraryScope = "all" | "references";
1445
1499
 
@@ -2012,6 +2066,7 @@ function AssetSwimlaneBoard({
2012
2066
  onViewModeChange,
2013
2067
  scope,
2014
2068
  onScopeChange,
2069
+ showScopeToggle = true,
2015
2070
  hideEmptyLanes,
2016
2071
  assets,
2017
2072
  pendingUploads,
@@ -2031,6 +2086,7 @@ function AssetSwimlaneBoard({
2031
2086
  onViewModeChange: (mode: AssetViewMode) => void;
2032
2087
  scope: AssetLibraryScope;
2033
2088
  onScopeChange: (scope: AssetLibraryScope) => void;
2089
+ showScopeToggle?: boolean;
2034
2090
  hideEmptyLanes: boolean;
2035
2091
  assets: any[];
2036
2092
  pendingUploads: PendingUpload[];
@@ -2046,6 +2102,7 @@ function AssetSwimlaneBoard({
2046
2102
  onRestoreOptimisticDelete?: (ids: string[]) => void;
2047
2103
  }) {
2048
2104
  const t = useT();
2105
+ const [bulkContextOpen, setBulkContextOpen] = useState(false);
2049
2106
  const deleteAsset = useActionMutation("delete-asset");
2050
2107
  const deleteAssets = useActionMutation("delete-assets");
2051
2108
  const updateAsset = useActionMutation("update-asset");
@@ -2517,12 +2574,14 @@ function AssetSwimlaneBoard({
2517
2574
  ) : null}
2518
2575
  </div>
2519
2576
  <div className="flex shrink-0 flex-wrap items-center gap-2">
2520
- <AssetScopeToggle
2521
- value={scope}
2522
- onChange={onScopeChange}
2523
- allCount={assets.length}
2524
- referenceCount={referenceAssets.length}
2525
- />
2577
+ {showScopeToggle ? (
2578
+ <AssetScopeToggle
2579
+ value={scope}
2580
+ onChange={onScopeChange}
2581
+ allCount={assets.length}
2582
+ referenceCount={referenceAssets.length}
2583
+ />
2584
+ ) : null}
2526
2585
  <AssetViewModeToggle value={viewMode} onChange={onViewModeChange} />
2527
2586
  </div>
2528
2587
  </div>
@@ -2594,6 +2653,17 @@ function AssetSwimlaneBoard({
2594
2653
  {t("brandKitDetail.removeFromReferences")}
2595
2654
  </Button>
2596
2655
  ) : null}
2656
+ <Button
2657
+ type="button"
2658
+ variant="outline"
2659
+ size="sm"
2660
+ onClick={() => setBulkContextOpen(true)}
2661
+ disabled={deleting || changingReference}
2662
+ >
2663
+ <IconLink className="h-4 w-4" />
2664
+ Add to context
2665
+ {/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
2666
+ </Button>
2597
2667
  <Button
2598
2668
  type="button"
2599
2669
  variant="ghost"
@@ -2622,6 +2692,18 @@ function AssetSwimlaneBoard({
2622
2692
  ) : null}
2623
2693
  </div>
2624
2694
  )}
2695
+ <CreativeContextShareSheet
2696
+ open={bulkContextOpen}
2697
+ onOpenChange={setBulkContextOpen}
2698
+ resources={selectedAssets.map((asset) => ({
2699
+ appId: "assets",
2700
+ resourceType: "asset",
2701
+ resourceId: asset.id,
2702
+ title: assetDisplayTitle(asset),
2703
+ updatedAt: asset.updatedAt,
2704
+ preview: { kind: "document" as const, label: "Asset" },
2705
+ }))}
2706
+ />
2625
2707
 
2626
2708
  {viewMode === "cards" ? (
2627
2709
  <AssetCardsView items={visibleGalleryItems} />
@@ -3229,90 +3311,115 @@ function AssetActionsMenu({
3229
3311
  onRemoveFromReferences?: () => void;
3230
3312
  }) {
3231
3313
  const t = useT();
3314
+ const [contextOpen, setContextOpen] = useState(false);
3232
3315
  return (
3233
- <DropdownMenu>
3234
- <DropdownMenuTrigger asChild>
3235
- <Button
3236
- type="button"
3237
- variant="secondary"
3238
- size="icon"
3239
- className="h-8 w-8 shadow-sm"
3240
- aria-label={t("library.assetActions")}
3241
- disabled={busy}
3242
- >
3243
- <IconDotsVertical className="h-4 w-4" />
3244
- </Button>
3245
- </DropdownMenuTrigger>
3246
- <DropdownMenuContent align="end">
3247
- <DropdownMenuItem asChild>
3248
- <Link to={`/asset/${asset.id}`}>
3249
- <IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
3250
- {t("library.viewDetails")}
3251
- </Link>
3252
- </DropdownMenuItem>
3253
- {onMoveToReferences ? (
3254
- <DropdownMenuItem
3255
- onSelect={(event) => {
3256
- event.preventDefault();
3257
- onMoveToReferences();
3258
- }}
3316
+ <>
3317
+ <DropdownMenu>
3318
+ <DropdownMenuTrigger asChild>
3319
+ <Button
3320
+ type="button"
3321
+ variant="secondary"
3322
+ size="icon"
3323
+ className="h-8 w-8 shadow-sm"
3324
+ aria-label={t("library.assetActions")}
3325
+ disabled={busy}
3259
3326
  >
3260
- <IconPhotoPlus className="mr-2 h-4 w-4 shrink-0" />
3261
- {t("library.addToReferences")}
3327
+ <IconDotsVertical className="h-4 w-4" />
3328
+ </Button>
3329
+ </DropdownMenuTrigger>
3330
+ <DropdownMenuContent align="end">
3331
+ <DropdownMenuItem asChild>
3332
+ <Link to={`/asset/${asset.id}`}>
3333
+ <IconArrowUpRight className="mr-2 h-4 w-4 shrink-0" />
3334
+ {t("library.viewDetails")}
3335
+ </Link>
3262
3336
  </DropdownMenuItem>
3263
- ) : null}
3264
- {onRemoveFromReferences ? (
3265
3337
  <DropdownMenuItem
3266
3338
  onSelect={(event) => {
3267
3339
  event.preventDefault();
3268
- onRemoveFromReferences();
3340
+ setContextOpen(true);
3269
3341
  }}
3270
3342
  >
3271
- <IconX className="mr-2 h-4 w-4 shrink-0" />
3272
- {t("library.removeFromReferences")}
3343
+ <IconLink className="mr-2 h-4 w-4 shrink-0" />
3344
+ Add to context
3345
+ {/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
3273
3346
  </DropdownMenuItem>
3274
- ) : null}
3275
- <DropdownMenuSub>
3276
- <DropdownMenuSubTrigger>
3277
- <IconFolder className="mr-2 h-4 w-4 shrink-0" />
3278
- {t("library.moveTo")}
3279
- </DropdownMenuSubTrigger>
3280
- <DropdownMenuSubContent>
3347
+ {onMoveToReferences ? (
3281
3348
  <DropdownMenuItem
3282
- onSelect={() =>
3283
- updateAsset.mutate({
3284
- id: asset.id,
3285
- folderId: null,
3286
- })
3287
- }
3349
+ onSelect={(event) => {
3350
+ event.preventDefault();
3351
+ onMoveToReferences();
3352
+ }}
3353
+ >
3354
+ <IconPhotoPlus className="mr-2 h-4 w-4 shrink-0" />
3355
+ {t("library.addToReferences")}
3356
+ </DropdownMenuItem>
3357
+ ) : null}
3358
+ {onRemoveFromReferences ? (
3359
+ <DropdownMenuItem
3360
+ onSelect={(event) => {
3361
+ event.preventDefault();
3362
+ onRemoveFromReferences();
3363
+ }}
3288
3364
  >
3289
- {t("library.unfiled")}
3365
+ <IconX className="mr-2 h-4 w-4 shrink-0" />
3366
+ {t("library.removeFromReferences")}
3290
3367
  </DropdownMenuItem>
3291
- {folders.map((folder) => (
3368
+ ) : null}
3369
+ <DropdownMenuSub>
3370
+ <DropdownMenuSubTrigger>
3371
+ <IconFolder className="mr-2 h-4 w-4 shrink-0" />
3372
+ {t("library.moveTo")}
3373
+ </DropdownMenuSubTrigger>
3374
+ <DropdownMenuSubContent>
3292
3375
  <DropdownMenuItem
3293
- key={folder.id}
3294
3376
  onSelect={() =>
3295
3377
  updateAsset.mutate({
3296
3378
  id: asset.id,
3297
- folderId: folder.id,
3379
+ folderId: null,
3298
3380
  })
3299
3381
  }
3300
3382
  >
3301
- {folder.title}
3383
+ {t("library.unfiled")}
3302
3384
  </DropdownMenuItem>
3303
- ))}
3304
- </DropdownMenuSubContent>
3305
- </DropdownMenuSub>
3306
- <DropdownMenuSeparator />
3307
- <DropdownMenuItem
3308
- className="text-destructive focus:bg-destructive/10 focus:text-destructive"
3309
- onSelect={onDelete}
3310
- >
3311
- <IconTrash className="mr-2 h-4 w-4 shrink-0" />
3312
- {t("assetDetail.delete")}
3313
- </DropdownMenuItem>
3314
- </DropdownMenuContent>
3315
- </DropdownMenu>
3385
+ {folders.map((folder) => (
3386
+ <DropdownMenuItem
3387
+ key={folder.id}
3388
+ onSelect={() =>
3389
+ updateAsset.mutate({
3390
+ id: asset.id,
3391
+ folderId: folder.id,
3392
+ })
3393
+ }
3394
+ >
3395
+ {folder.title}
3396
+ </DropdownMenuItem>
3397
+ ))}
3398
+ </DropdownMenuSubContent>
3399
+ </DropdownMenuSub>
3400
+ <DropdownMenuSeparator />
3401
+ <DropdownMenuItem
3402
+ className="text-destructive focus:bg-destructive/10 focus:text-destructive"
3403
+ onSelect={onDelete}
3404
+ >
3405
+ <IconTrash className="mr-2 h-4 w-4 shrink-0" />
3406
+ {t("assetDetail.delete")}
3407
+ </DropdownMenuItem>
3408
+ </DropdownMenuContent>
3409
+ </DropdownMenu>
3410
+ <CreativeContextShareSheet
3411
+ open={contextOpen}
3412
+ onOpenChange={setContextOpen}
3413
+ resource={{
3414
+ appId: "assets",
3415
+ resourceType: "asset",
3416
+ resourceId: asset.id,
3417
+ title: assetDisplayTitle(asset),
3418
+ updatedAt: asset.updatedAt,
3419
+ preview: { kind: "document", label: "Asset" },
3420
+ }}
3421
+ />
3422
+ </>
3316
3423
  );
3317
3424
  }
3318
3425
 
@@ -3369,6 +3476,7 @@ function AssetLaneTile({
3369
3476
  onMoveToReferences?: () => void;
3370
3477
  }) {
3371
3478
  const t = useT();
3479
+ const [contextOpen, setContextOpen] = useState(false);
3372
3480
  const displayTitle = assetDisplayTitle(asset);
3373
3481
  const sourceText = assetLineageSourceText(asset);
3374
3482
  const canMoveToReferences = Boolean(onMoveToReferences);
@@ -3419,6 +3527,16 @@ function AssetLaneTile({
3419
3527
  {t("library.viewDetails")}
3420
3528
  </Link>
3421
3529
  </DropdownMenuItem>
3530
+ <DropdownMenuItem
3531
+ onSelect={(event) => {
3532
+ event.preventDefault();
3533
+ setContextOpen(true);
3534
+ }}
3535
+ >
3536
+ <IconLink className="mr-2 h-4 w-4 shrink-0" />
3537
+ Add to context
3538
+ {/* i18n-ignore assets template UI is raw-English pending template i18n pass */}
3539
+ </DropdownMenuItem>
3422
3540
  {canMoveToReferences ? (
3423
3541
  <DropdownMenuItem
3424
3542
  onSelect={(event) => {
@@ -3548,6 +3666,18 @@ function AssetLaneTile({
3548
3666
  </div>
3549
3667
  </div>
3550
3668
  ) : null}
3669
+ <CreativeContextShareSheet
3670
+ open={contextOpen}
3671
+ onOpenChange={setContextOpen}
3672
+ resource={{
3673
+ appId: "assets",
3674
+ resourceType: "asset",
3675
+ resourceId: asset.id,
3676
+ title: displayTitle,
3677
+ updatedAt: asset.updatedAt,
3678
+ preview: { kind: "document", label: "Asset" },
3679
+ }}
3680
+ />
3551
3681
  </div>
3552
3682
  );
3553
3683
  }
@@ -1011,7 +1011,7 @@ function LibraryKitSelector({
1011
1011
  type="button"
1012
1012
  className="-ml-1.5 inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-md px-1.5 py-1 text-left text-xl font-semibold leading-tight tracking-tight transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
1013
1013
  >
1014
- <span className="block min-w-0 max-w-[min(48rem,calc(100vw-7rem))] truncate sm:max-w-none">
1014
+ <span className="block min-w-0 break-words">
1015
1015
  {triggerLabel ?? selectedLibrary?.title ?? t("library.allAssets")}
1016
1016
  </span>
1017
1017
  <IconChevronDown className="h-4 w-4 shrink-0 text-muted-foreground" />
@@ -2155,16 +2155,10 @@ export function LibraryWorkspace({
2155
2155
  ) : routeSelectedLibraryId || hasLibraries ? (
2156
2156
  <div className="min-w-0">
2157
2157
  {routeSelectedLibraryId ? (
2158
- <>
2159
- <LibraryCandidateStage
2160
- activeLibraryId={routeSelectedLibraryId}
2161
- foldersByLibraryId={foldersByLibraryId}
2162
- />
2163
- <BrandKitDetailRoute
2164
- libraryId={routeSelectedLibraryId}
2165
- headerMode="actions"
2166
- />
2167
- </>
2158
+ <BrandKitDetailRoute
2159
+ libraryId={routeSelectedLibraryId}
2160
+ headerMode="actions"
2161
+ />
2168
2162
  ) : (
2169
2163
  <AllAssetsBrowser foldersByLibraryId={foldersByLibraryId} />
2170
2164
  )}
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-17
4
+ ---
5
+
6
+ Library now flags published assets with newer versions and lets you submit the update in place.