octocms 0.4.13 → 0.4.16

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 (796) hide show
  1. package/dist/admin/AdminApp.d.ts +1 -1
  2. package/dist/admin/AdminApp.js +2 -2
  3. package/dist/admin/AdminApp.js.map +1 -1
  4. package/dist/admin/actions/agent.d.ts +3 -3
  5. package/dist/admin/actions/agent.js.map +1 -1
  6. package/dist/admin/actions/media.d.ts.map +1 -1
  7. package/dist/admin/actions/media.js +3 -1
  8. package/dist/admin/actions/media.js.map +1 -1
  9. package/dist/admin/pages/AdminErrorView.d.ts.map +1 -1
  10. package/dist/admin/pages/AdminErrorView.js +9 -9
  11. package/dist/admin/pages/AdminErrorView.js.map +1 -1
  12. package/dist/admin/pages/AdminLayout.d.ts +1 -1
  13. package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
  14. package/dist/admin/pages/AdminLayout.js +2 -2
  15. package/dist/admin/pages/AdminLayout.js.map +1 -1
  16. package/dist/admin/pages/ChatPage.d.ts +3 -3
  17. package/dist/admin/pages/ChatPage.d.ts.map +1 -1
  18. package/dist/admin/pages/ChatPage.js +8 -5
  19. package/dist/admin/pages/ChatPage.js.map +1 -1
  20. package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
  21. package/dist/admin/pages/CollectionPage.js +5 -1
  22. package/dist/admin/pages/CollectionPage.js.map +1 -1
  23. package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
  24. package/dist/admin/pages/ContentModelPage.js +5 -1
  25. package/dist/admin/pages/ContentModelPage.js.map +1 -1
  26. package/dist/admin/pages/ContentPage.d.ts.map +1 -1
  27. package/dist/admin/pages/ContentPage.js +5 -1
  28. package/dist/admin/pages/ContentPage.js.map +1 -1
  29. package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
  30. package/dist/admin/pages/ContentTypePage.js +6 -2
  31. package/dist/admin/pages/ContentTypePage.js.map +1 -1
  32. package/dist/admin/pages/EntryPage.d.ts.map +1 -1
  33. package/dist/admin/pages/EntryPage.js +5 -1
  34. package/dist/admin/pages/EntryPage.js.map +1 -1
  35. package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -1
  36. package/dist/admin/pages/MediaAssetPage.js +6 -2
  37. package/dist/admin/pages/MediaAssetPage.js.map +1 -1
  38. package/dist/admin/pages/MediaPage.d.ts.map +1 -1
  39. package/dist/admin/pages/MediaPage.js +6 -2
  40. package/dist/admin/pages/MediaPage.js.map +1 -1
  41. package/dist/admin/theme/toggle.d.ts.map +1 -1
  42. package/dist/admin/theme/toggle.js +27 -27
  43. package/dist/admin/theme/toggle.js.map +1 -1
  44. package/dist/agent/chatSetup.d.ts +19 -0
  45. package/dist/agent/chatSetup.d.ts.map +1 -0
  46. package/dist/agent/chatSetup.js +119 -0
  47. package/dist/agent/chatSetup.js.map +1 -0
  48. package/dist/agent/featureFlag.d.ts +3 -3
  49. package/dist/agent/featureFlag.js.map +1 -1
  50. package/dist/agent/index.cjs +75 -5309
  51. package/dist/agent/index.cjs.map +1 -1
  52. package/dist/{agentDocs-M3R2CPUQ.js → agentDocs-QZ4NOQVH.js} +2 -2
  53. package/dist/{chunk-DCDFWNC6.js → chunk-I7VNI2IG.js} +4 -7
  54. package/dist/{chunk-DCDFWNC6.js.map → chunk-I7VNI2IG.js.map} +1 -1
  55. package/dist/chunk-TOUAHFDW.js +7 -0
  56. package/dist/{chunk-NAHOP7TG.js.map → chunk-TOUAHFDW.js.map} +1 -1
  57. package/dist/cli/index.js +4 -4
  58. package/dist/cli/lib/templates.js +3 -6
  59. package/dist/cli/lib/templates.js.map +1 -1
  60. package/dist/components/Chat/ChatAgentSetup.d.ts +7 -0
  61. package/dist/components/Chat/ChatAgentSetup.d.ts.map +1 -0
  62. package/dist/components/Chat/ChatAgentSetup.js +37 -0
  63. package/dist/components/Chat/ChatAgentSetup.js.map +1 -0
  64. package/dist/components/Chat/ChatPage.d.ts +6 -1
  65. package/dist/components/Chat/ChatPage.d.ts.map +1 -1
  66. package/dist/components/Chat/ChatPage.js +123 -128
  67. package/dist/components/Chat/ChatPage.js.map +1 -1
  68. package/dist/components/Chat/ChatSidebar.d.ts +10 -0
  69. package/dist/components/Chat/ChatSidebar.d.ts.map +1 -0
  70. package/dist/components/Chat/ChatSidebar.js +45 -0
  71. package/dist/components/Chat/ChatSidebar.js.map +1 -0
  72. package/dist/components/Chat/Composer.d.ts.map +1 -1
  73. package/dist/components/Chat/Composer.js +28 -45
  74. package/dist/components/Chat/Composer.js.map +1 -1
  75. package/dist/components/Chat/Message.d.ts.map +1 -1
  76. package/dist/components/Chat/Message.js +40 -39
  77. package/dist/components/Chat/Message.js.map +1 -1
  78. package/dist/components/Chat/ProposalCard.d.ts.map +1 -1
  79. package/dist/components/Chat/ProposalCard.js +56 -67
  80. package/dist/components/Chat/ProposalCard.js.map +1 -1
  81. package/dist/components/Chat/ToolCallCard.d.ts.map +1 -1
  82. package/dist/components/Chat/ToolCallCard.js +29 -38
  83. package/dist/components/Chat/ToolCallCard.js.map +1 -1
  84. package/dist/components/Chat/chatStorage.d.ts +64 -0
  85. package/dist/components/Chat/chatStorage.d.ts.map +1 -0
  86. package/dist/components/Chat/chatStorage.js +154 -0
  87. package/dist/components/Chat/chatStorage.js.map +1 -0
  88. package/dist/components/Chat/useChatHistory.d.ts +12 -0
  89. package/dist/components/Chat/useChatHistory.d.ts.map +1 -0
  90. package/dist/components/Chat/useChatHistory.js +196 -0
  91. package/dist/components/Chat/useChatHistory.js.map +1 -0
  92. package/dist/components/Chat/useChatStream.d.ts +6 -0
  93. package/dist/components/Chat/useChatStream.d.ts.map +1 -1
  94. package/dist/components/Chat/useChatStream.js +31 -2
  95. package/dist/components/Chat/useChatStream.js.map +1 -1
  96. package/dist/components/CommandK/CommandK.d.ts +1 -1
  97. package/dist/components/CommandK/CommandK.d.ts.map +1 -1
  98. package/dist/components/CommandK/CommandK.js +100 -116
  99. package/dist/components/CommandK/CommandK.js.map +1 -1
  100. package/dist/components/CommandK/parts.d.ts.map +1 -1
  101. package/dist/components/CommandK/parts.js +9 -11
  102. package/dist/components/CommandK/parts.js.map +1 -1
  103. package/dist/components/ContentModel/ConditionalBranchesEditor.d.ts.map +1 -1
  104. package/dist/components/ContentModel/ConditionalBranchesEditor.js +40 -45
  105. package/dist/components/ContentModel/ConditionalBranchesEditor.js.map +1 -1
  106. package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
  107. package/dist/components/ContentModel/ContentModelList.js +65 -80
  108. package/dist/components/ContentModel/ContentModelList.js.map +1 -1
  109. package/dist/components/ContentModel/ContentTypeDetail.d.ts.map +1 -1
  110. package/dist/components/ContentModel/ContentTypeDetail.js +253 -280
  111. package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
  112. package/dist/components/ContentModel/CreateContentTypeDialog.d.ts.map +1 -1
  113. package/dist/components/ContentModel/CreateContentTypeDialog.js +42 -30
  114. package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
  115. package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts.map +1 -1
  116. package/dist/components/ContentModel/DeleteContentTypeDialog.js +14 -15
  117. package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
  118. package/dist/components/ContentModel/DeleteFieldDialog.d.ts.map +1 -1
  119. package/dist/components/ContentModel/DeleteFieldDialog.js +27 -20
  120. package/dist/components/ContentModel/DeleteFieldDialog.js.map +1 -1
  121. package/dist/components/ContentModel/EditContentTypeDialog.d.ts.map +1 -1
  122. package/dist/components/ContentModel/EditContentTypeDialog.js +46 -34
  123. package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
  124. package/dist/components/ContentModel/FieldDialog.d.ts.map +1 -1
  125. package/dist/components/ContentModel/FieldDialog.js +95 -84
  126. package/dist/components/ContentModel/FieldDialog.js.map +1 -1
  127. package/dist/components/ContentModel/RichTextOptionsEditor.d.ts.map +1 -1
  128. package/dist/components/ContentModel/RichTextOptionsEditor.js +90 -81
  129. package/dist/components/ContentModel/RichTextOptionsEditor.js.map +1 -1
  130. package/dist/components/ContentModel/SchemaImpactList.d.ts.map +1 -1
  131. package/dist/components/ContentModel/SchemaImpactList.js +19 -36
  132. package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
  133. package/dist/components/ContentModel/SchemaOptionFieldInput.d.ts.map +1 -1
  134. package/dist/components/ContentModel/SchemaOptionFieldInput.js +63 -84
  135. package/dist/components/ContentModel/SchemaOptionFieldInput.js.map +1 -1
  136. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts +3 -0
  137. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts.map +1 -0
  138. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js +15 -0
  139. package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js.map +1 -0
  140. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts +3 -0
  141. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts.map +1 -0
  142. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js +11 -0
  143. package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js.map +1 -0
  144. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js +3 -3
  145. package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js.map +1 -1
  146. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.d.ts.map +1 -1
  147. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js +4 -12
  148. package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js.map +1 -1
  149. package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
  150. package/dist/components/Dashboard/DashboardContent.js +87 -114
  151. package/dist/components/Dashboard/DashboardContent.js.map +1 -1
  152. package/dist/components/Dashboard/RecentPullRequests.d.ts.map +1 -1
  153. package/dist/components/Dashboard/RecentPullRequests.js +33 -45
  154. package/dist/components/Dashboard/RecentPullRequests.js.map +1 -1
  155. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts +2 -7
  156. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts.map +1 -1
  157. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js +5 -20
  158. package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js.map +1 -1
  159. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js +9 -9
  160. package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js.map +1 -1
  161. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts +3 -0
  162. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts.map +1 -0
  163. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js +10 -0
  164. package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js.map +1 -0
  165. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts +9 -0
  166. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts.map +1 -0
  167. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js +16 -0
  168. package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js.map +1 -0
  169. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.d.ts.map +1 -1
  170. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js +7 -18
  171. package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js.map +1 -1
  172. package/dist/components/DiffView/DiffHunk.d.ts.map +1 -1
  173. package/dist/components/DiffView/DiffHunk.js +12 -40
  174. package/dist/components/DiffView/DiffHunk.js.map +1 -1
  175. package/dist/components/DiffView/DiffView.d.ts.map +1 -1
  176. package/dist/components/DiffView/DiffView.js +33 -52
  177. package/dist/components/DiffView/DiffView.js.map +1 -1
  178. package/dist/components/EditPost/EditPost.d.ts.map +1 -1
  179. package/dist/components/EditPost/EditPost.js +139 -200
  180. package/dist/components/EditPost/EditPost.js.map +1 -1
  181. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts +3 -0
  182. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts.map +1 -0
  183. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js +21 -0
  184. package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js.map +1 -0
  185. package/dist/components/EditPost/skeletons/EntryFormSkeleton.d.ts.map +1 -1
  186. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js +1 -9
  187. package/dist/components/EditPost/skeletons/EntryFormSkeleton.js.map +1 -1
  188. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.d.ts.map +1 -1
  189. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js +12 -20
  190. package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js.map +1 -1
  191. package/dist/components/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
  192. package/dist/components/{ErrorBoundary.js → ErrorBoundary/ErrorBoundary.js} +15 -21
  193. package/dist/components/ErrorBoundary/ErrorBoundary.js.map +1 -0
  194. package/dist/components/HistorySection/HistorySection.d.ts.map +1 -1
  195. package/dist/components/HistorySection/HistorySection.js +23 -42
  196. package/dist/components/HistorySection/HistorySection.js.map +1 -1
  197. package/dist/components/InlineEntryEditor/InlineEntryEditor.d.ts.map +1 -1
  198. package/dist/components/InlineEntryEditor/InlineEntryEditor.js +120 -123
  199. package/dist/components/InlineEntryEditor/InlineEntryEditor.js.map +1 -1
  200. package/dist/components/Layout/BranchSelectorDialog.d.ts +9 -0
  201. package/dist/components/Layout/BranchSelectorDialog.d.ts.map +1 -0
  202. package/dist/components/Layout/BranchSelectorDialog.js +130 -0
  203. package/dist/components/Layout/BranchSelectorDialog.js.map +1 -0
  204. package/dist/components/Layout/CreateBranchDialog.d.ts.map +1 -0
  205. package/dist/components/{CreateBranchDialog.js → Layout/CreateBranchDialog.js} +16 -16
  206. package/dist/components/Layout/CreateBranchDialog.js.map +1 -0
  207. package/dist/components/Layout/Layout.d.ts.map +1 -1
  208. package/dist/components/Layout/Layout.js +18 -26
  209. package/dist/components/Layout/Layout.js.map +1 -1
  210. package/dist/components/Layout/LeftNavItem.d.ts.map +1 -1
  211. package/dist/components/Layout/LeftNavItem.js +7 -7
  212. package/dist/components/Layout/LeftNavItem.js.map +1 -1
  213. package/dist/components/Layout/Page.d.ts +16 -0
  214. package/dist/components/Layout/Page.d.ts.map +1 -0
  215. package/dist/components/Layout/Page.js +47 -0
  216. package/dist/components/Layout/Page.js.map +1 -0
  217. package/dist/components/Layout/TopHeader.d.ts +1 -1
  218. package/dist/components/Layout/TopHeader.d.ts.map +1 -1
  219. package/dist/components/Layout/TopHeader.js +70 -165
  220. package/dist/components/Layout/TopHeader.js.map +1 -1
  221. package/dist/components/Layout/UserAccountDialog.d.ts +12 -0
  222. package/dist/components/Layout/UserAccountDialog.d.ts.map +1 -0
  223. package/dist/components/Layout/UserAccountDialog.js +48 -0
  224. package/dist/components/Layout/UserAccountDialog.js.map +1 -0
  225. package/dist/components/Layout/skeletons/AgentNavSkeleton.js +1 -1
  226. package/dist/components/Layout/skeletons/AgentNavSkeleton.js.map +1 -1
  227. package/dist/components/Layout/skeletons/BranchChipSkeleton.d.ts.map +1 -1
  228. package/dist/components/Layout/skeletons/BranchChipSkeleton.js +1 -8
  229. package/dist/components/Layout/skeletons/BranchChipSkeleton.js.map +1 -1
  230. package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts +3 -0
  231. package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts.map +1 -0
  232. package/dist/components/Layout/skeletons/NeutralPageSkeleton.js +11 -0
  233. package/dist/components/Layout/skeletons/NeutralPageSkeleton.js.map +1 -0
  234. package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts +19 -0
  235. package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts.map +1 -0
  236. package/dist/components/Layout/skeletons/PageChromeSkeleton.js +31 -0
  237. package/dist/components/Layout/skeletons/PageChromeSkeleton.js.map +1 -0
  238. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts +9 -0
  239. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts.map +1 -0
  240. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js +15 -0
  241. package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js.map +1 -0
  242. package/dist/components/Layout/skeletons/TopHeaderSkeleton.d.ts.map +1 -1
  243. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js +10 -17
  244. package/dist/components/Layout/skeletons/TopHeaderSkeleton.js.map +1 -1
  245. package/dist/components/Layout/skeletons/routeSkeletons.d.ts +16 -0
  246. package/dist/components/Layout/skeletons/routeSkeletons.d.ts.map +1 -0
  247. package/dist/components/Layout/skeletons/routeSkeletons.js +48 -0
  248. package/dist/components/Layout/skeletons/routeSkeletons.js.map +1 -0
  249. package/dist/components/LinkedBySection/LinkedBySection.js +13 -13
  250. package/dist/components/LinkedBySection/LinkedBySection.js.map +1 -1
  251. package/dist/components/MediaAsset/MediaAsset.d.ts +1 -1
  252. package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -1
  253. package/dist/components/MediaAsset/MediaAsset.js +126 -136
  254. package/dist/components/MediaAsset/MediaAsset.js.map +1 -1
  255. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts +3 -0
  256. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts.map +1 -0
  257. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js +21 -0
  258. package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js.map +1 -0
  259. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.d.ts.map +1 -1
  260. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js +26 -22
  261. package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js.map +1 -1
  262. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.d.ts.map +1 -1
  263. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js +1 -9
  264. package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js.map +1 -1
  265. package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -1
  266. package/dist/components/MediaManager/CreateFolderDialog.js +15 -8
  267. package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -1
  268. package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -1
  269. package/dist/components/MediaManager/DeleteFolderDialog.js +1 -2
  270. package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -1
  271. package/dist/components/MediaManager/MarkdownImageEditToolbar.d.ts.map +1 -1
  272. package/dist/components/MediaManager/MarkdownImageEditToolbar.js +7 -9
  273. package/dist/components/MediaManager/MarkdownImageEditToolbar.js.map +1 -1
  274. package/dist/components/MediaManager/MarkdownInsertImageDialog.d.ts.map +1 -1
  275. package/dist/components/MediaManager/MarkdownInsertImageDialog.js +6 -9
  276. package/dist/components/MediaManager/MarkdownInsertImageDialog.js.map +1 -1
  277. package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -1
  278. package/dist/components/MediaManager/MediaLeftPanel.js +21 -23
  279. package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -1
  280. package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -1
  281. package/dist/components/MediaManager/MediaListTable.js +15 -21
  282. package/dist/components/MediaManager/MediaListTable.js.map +1 -1
  283. package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
  284. package/dist/components/MediaManager/MediaManager.js +101 -151
  285. package/dist/components/MediaManager/MediaManager.js.map +1 -1
  286. package/dist/components/MediaManager/MediaSelectDialog.js +22 -64
  287. package/dist/components/MediaManager/MediaSelectDialog.js.map +1 -1
  288. package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -1
  289. package/dist/components/MediaManager/MediaUploadBar.js +9 -10
  290. package/dist/components/MediaManager/MediaUploadBar.js.map +1 -1
  291. package/dist/components/MediaManager/MediaUploadDialog.d.ts.map +1 -1
  292. package/dist/components/MediaManager/MediaUploadDialog.js +18 -11
  293. package/dist/components/MediaManager/MediaUploadDialog.js.map +1 -1
  294. package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts +8 -0
  295. package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts.map +1 -0
  296. package/dist/components/MediaManager/MediaViewModeSwitcher.js +14 -0
  297. package/dist/components/MediaManager/MediaViewModeSwitcher.js.map +1 -0
  298. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.d.ts.map +1 -1
  299. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js +4 -12
  300. package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js.map +1 -1
  301. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.d.ts.map +1 -1
  302. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js +5 -13
  303. package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js.map +1 -1
  304. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.d.ts.map +1 -1
  305. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js +7 -15
  306. package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js.map +1 -1
  307. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts +3 -0
  308. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts.map +1 -0
  309. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js +15 -0
  310. package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js.map +1 -0
  311. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts +3 -0
  312. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts.map +1 -0
  313. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js +21 -0
  314. package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js.map +1 -0
  315. package/dist/components/public/MarkdownContent.d.ts.map +1 -1
  316. package/dist/components/public/MarkdownContent.js +1 -2
  317. package/dist/components/public/MarkdownContent.js.map +1 -1
  318. package/dist/components/public/RichTextContent.d.ts.map +1 -1
  319. package/dist/components/public/RichTextContent.js +19 -8
  320. package/dist/components/public/RichTextContent.js.map +1 -1
  321. package/dist/components/public/SearchBox.d.ts.map +1 -1
  322. package/dist/components/public/SearchBox.js +32 -60
  323. package/dist/components/public/SearchBox.js.map +1 -1
  324. package/dist/components/public/index.cjs +6 -413
  325. package/dist/components/public/index.cjs.map +1 -1
  326. package/dist/components/skeletons/MainSlotSkeleton.d.ts +0 -7
  327. package/dist/components/skeletons/MainSlotSkeleton.d.ts.map +1 -1
  328. package/dist/components/skeletons/MainSlotSkeleton.js +4 -17
  329. package/dist/components/skeletons/MainSlotSkeleton.js.map +1 -1
  330. package/dist/components/skeletons/blocks.d.ts.map +1 -1
  331. package/dist/components/skeletons/blocks.js +15 -7
  332. package/dist/components/skeletons/blocks.js.map +1 -1
  333. package/dist/components/skeletons/index.d.ts +4 -4
  334. package/dist/components/skeletons/index.d.ts.map +1 -1
  335. package/dist/components/skeletons/index.js +1 -2
  336. package/dist/components/skeletons/index.js.map +1 -1
  337. package/dist/components/skeletons/primitives.d.ts +2 -2
  338. package/dist/components/skeletons/primitives.d.ts.map +1 -1
  339. package/dist/components/skeletons/primitives.js +3 -3
  340. package/dist/components/skeletons/primitives.js.map +1 -1
  341. package/dist/components/test/dndTestUtils.d.ts +7 -0
  342. package/dist/components/test/dndTestUtils.d.ts.map +1 -0
  343. package/dist/components/test/dndTestUtils.js +15 -0
  344. package/dist/components/test/dndTestUtils.js.map +1 -0
  345. package/dist/components/ui/Avatar/Avatar.d.ts +5 -0
  346. package/dist/components/ui/Avatar/Avatar.d.ts.map +1 -0
  347. package/dist/components/ui/Avatar/Avatar.js +63 -0
  348. package/dist/components/ui/Avatar/Avatar.js.map +1 -0
  349. package/dist/components/ui/{branch-chip.d.ts → BranchChip/BranchChip.d.ts} +2 -5
  350. package/dist/components/ui/BranchChip/BranchChip.d.ts.map +1 -0
  351. package/dist/components/ui/BranchChip/BranchChip.js +47 -0
  352. package/dist/components/ui/BranchChip/BranchChip.js.map +1 -0
  353. package/dist/components/ui/Button/Button.d.ts +15 -0
  354. package/dist/components/ui/Button/Button.d.ts.map +1 -0
  355. package/dist/components/ui/Button/Button.js +49 -0
  356. package/dist/components/ui/Button/Button.js.map +1 -0
  357. package/dist/components/ui/Card/Card.d.ts +6 -0
  358. package/dist/components/ui/Card/Card.d.ts.map +1 -0
  359. package/dist/components/ui/{card.js → Card/Card.js} +12 -22
  360. package/dist/components/ui/Card/Card.js.map +1 -0
  361. package/dist/components/ui/{chip.d.ts → Chip/Chip.d.ts} +1 -1
  362. package/dist/components/ui/Chip/Chip.d.ts.map +1 -0
  363. package/dist/components/ui/Chip/Chip.js +24 -0
  364. package/dist/components/ui/Chip/Chip.js.map +1 -0
  365. package/dist/components/ui/Dialog/Dialog.d.ts +32 -0
  366. package/dist/components/ui/Dialog/Dialog.d.ts.map +1 -0
  367. package/dist/components/ui/Dialog/Dialog.js +194 -0
  368. package/dist/components/ui/Dialog/Dialog.js.map +1 -0
  369. package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts +66 -0
  370. package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts.map +1 -0
  371. package/dist/components/ui/DropdownMenu/DropdownMenu.js +308 -0
  372. package/dist/components/ui/DropdownMenu/DropdownMenu.js.map +1 -0
  373. package/dist/components/ui/{field.d.ts → FormField/Field.d.ts} +1 -1
  374. package/dist/components/ui/FormField/Field.d.ts.map +1 -0
  375. package/dist/components/ui/FormField/Field.js +41 -0
  376. package/dist/components/ui/FormField/Field.js.map +1 -0
  377. package/dist/components/{FieldShell.d.ts → ui/FormField/FieldShell.d.ts} +2 -2
  378. package/dist/components/ui/FormField/FieldShell.d.ts.map +1 -0
  379. package/dist/components/ui/FormField/FieldShell.js +29 -0
  380. package/dist/components/ui/FormField/FieldShell.js.map +1 -0
  381. package/dist/components/ui/FormField/FormBooleanField.d.ts.map +1 -0
  382. package/dist/components/ui/FormField/FormBooleanField.js +56 -0
  383. package/dist/components/ui/FormField/FormBooleanField.js.map +1 -0
  384. package/dist/components/ui/FormField/FormColorField.d.ts.map +1 -0
  385. package/dist/components/{FormColorField.js → ui/FormField/FormColorField.js} +10 -13
  386. package/dist/components/ui/FormField/FormColorField.js.map +1 -0
  387. package/dist/components/{FormConditionalField.d.ts → ui/FormField/FormConditionalField.d.ts} +1 -1
  388. package/dist/components/ui/FormField/FormConditionalField.d.ts.map +1 -0
  389. package/dist/components/{FormConditionalField.js → ui/FormField/FormConditionalField.js} +61 -58
  390. package/dist/components/ui/FormField/FormConditionalField.js.map +1 -0
  391. package/dist/components/ui/FormField/FormDatetimeField.d.ts.map +1 -0
  392. package/dist/components/ui/FormField/FormDatetimeField.js +48 -0
  393. package/dist/components/ui/FormField/FormDatetimeField.js.map +1 -0
  394. package/dist/components/{FormFields.d.ts → ui/FormField/FormFields.d.ts} +1 -1
  395. package/dist/components/ui/FormField/FormFields.d.ts.map +1 -0
  396. package/dist/components/{FormFields.js → ui/FormField/FormFields.js} +6 -6
  397. package/dist/components/ui/FormField/FormFields.js.map +1 -0
  398. package/dist/components/{FormImageField.d.ts → ui/FormField/FormImageField.d.ts} +1 -1
  399. package/dist/components/ui/FormField/FormImageField.d.ts.map +1 -0
  400. package/dist/components/{FormImageField.js → ui/FormField/FormImageField.js} +25 -30
  401. package/dist/components/ui/FormField/FormImageField.js.map +1 -0
  402. package/dist/components/ui/FormField/FormJsonField.d.ts.map +1 -0
  403. package/dist/components/{FormJsonField.js → ui/FormField/FormJsonField.js} +7 -10
  404. package/dist/components/ui/FormField/FormJsonField.js.map +1 -0
  405. package/dist/components/ui/FormField/FormMarkdownField.d.ts.map +1 -0
  406. package/dist/components/{FormMarkdownField.js → ui/FormField/FormMarkdownField.js} +11 -20
  407. package/dist/components/ui/FormField/FormMarkdownField.js.map +1 -0
  408. package/dist/components/ui/FormField/FormNumberField.d.ts.map +1 -0
  409. package/dist/components/ui/FormField/FormNumberField.js +38 -0
  410. package/dist/components/ui/FormField/FormNumberField.js.map +1 -0
  411. package/dist/components/{FormReferenceField.d.ts → ui/FormField/FormReferenceField.d.ts} +1 -1
  412. package/dist/components/ui/FormField/FormReferenceField.d.ts.map +1 -0
  413. package/dist/components/{FormReferenceField.js → ui/FormField/FormReferenceField.js} +109 -118
  414. package/dist/components/ui/FormField/FormReferenceField.js.map +1 -0
  415. package/dist/components/{FormRichTextField.d.ts → ui/FormField/FormRichTextField.d.ts} +1 -1
  416. package/dist/components/ui/FormField/FormRichTextField.d.ts.map +1 -0
  417. package/dist/components/{FormRichTextField.js → ui/FormField/FormRichTextField.js} +28 -33
  418. package/dist/components/ui/FormField/FormRichTextField.js.map +1 -0
  419. package/dist/components/{FormSelectField.d.ts → ui/FormField/FormSelectField.d.ts} +1 -1
  420. package/dist/components/ui/FormField/FormSelectField.d.ts.map +1 -0
  421. package/dist/components/{FormSelectField.js → ui/FormField/FormSelectField.js} +11 -23
  422. package/dist/components/ui/FormField/FormSelectField.js.map +1 -0
  423. package/dist/components/ui/FormField/FormSlugField.d.ts.map +1 -0
  424. package/dist/components/{FormSlugField.js → ui/FormField/FormSlugField.js} +21 -26
  425. package/dist/components/ui/FormField/FormSlugField.js.map +1 -0
  426. package/dist/components/ui/FormField/FormStringField.d.ts.map +1 -0
  427. package/dist/components/ui/FormField/FormStringField.js +23 -0
  428. package/dist/components/ui/FormField/FormStringField.js.map +1 -0
  429. package/dist/components/ui/FormField/FormStringListField.d.ts.map +1 -0
  430. package/dist/components/{FormStringListField.js → ui/FormField/FormStringListField.js} +14 -25
  431. package/dist/components/ui/FormField/FormStringListField.js.map +1 -0
  432. package/dist/components/ui/FormField/FormTextField.d.ts.map +1 -0
  433. package/dist/components/ui/FormField/FormTextField.js +35 -0
  434. package/dist/components/ui/FormField/FormTextField.js.map +1 -0
  435. package/dist/components/ui/FormField/FormUrlField.d.ts.map +1 -0
  436. package/dist/components/ui/FormField/FormUrlField.js +26 -0
  437. package/dist/components/ui/FormField/FormUrlField.js.map +1 -0
  438. package/dist/components/{richtext → ui/FormField/richtext}/ComponentEmbedEditor.d.ts +1 -1
  439. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.d.ts.map +1 -0
  440. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js +165 -0
  441. package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js.map +1 -0
  442. package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.d.ts.map +1 -0
  443. package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.js +25 -39
  444. package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.js.map +1 -0
  445. package/dist/components/ui/FormField/richtext/ImageEmbedEditor.d.ts.map +1 -0
  446. package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.js +77 -56
  447. package/dist/components/ui/FormField/richtext/ImageEmbedEditor.js.map +1 -0
  448. package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.d.ts.map +1 -0
  449. package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.js +55 -43
  450. package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.js.map +1 -0
  451. package/dist/components/ui/FormField/richtext/SlashCommandMenu.d.ts.map +1 -0
  452. package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.js +21 -33
  453. package/dist/components/ui/FormField/richtext/SlashCommandMenu.js.map +1 -0
  454. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.d.ts.map +1 -0
  455. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js +61 -0
  456. package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js.map +1 -0
  457. package/dist/components/ui/Icon/Icon.d.ts +77 -0
  458. package/dist/components/ui/Icon/Icon.d.ts.map +1 -0
  459. package/dist/components/ui/Icon/Icon.js +618 -0
  460. package/dist/components/ui/Icon/Icon.js.map +1 -0
  461. package/dist/components/ui/{input.d.ts → Input/Input.d.ts} +1 -1
  462. package/dist/components/ui/Input/Input.d.ts.map +1 -0
  463. package/dist/components/ui/Input/Input.js +25 -0
  464. package/dist/components/ui/Input/Input.js.map +1 -0
  465. package/dist/components/ui/{kbd.d.ts → Kbd/Kbd.d.ts} +1 -1
  466. package/dist/components/ui/Kbd/Kbd.d.ts.map +1 -0
  467. package/dist/components/ui/Kbd/Kbd.js +19 -0
  468. package/dist/components/ui/Kbd/Kbd.js.map +1 -0
  469. package/dist/components/ui/Label/Label.d.ts +3 -0
  470. package/dist/components/ui/Label/Label.d.ts.map +1 -0
  471. package/dist/components/ui/Label/Label.js +20 -0
  472. package/dist/components/ui/Label/Label.js.map +1 -0
  473. package/dist/components/ui/Portal/Portal.d.ts +8 -0
  474. package/dist/components/ui/Portal/Portal.d.ts.map +1 -0
  475. package/dist/components/ui/Portal/Portal.js +14 -0
  476. package/dist/components/ui/Portal/Portal.js.map +1 -0
  477. package/dist/components/ui/Select/Select.d.ts +33 -0
  478. package/dist/components/ui/Select/Select.d.ts.map +1 -0
  479. package/dist/components/ui/Select/Select.js +280 -0
  480. package/dist/components/ui/Select/Select.js.map +1 -0
  481. package/dist/components/ui/Slot/Slot.d.ts +6 -0
  482. package/dist/components/ui/Slot/Slot.d.ts.map +1 -0
  483. package/dist/components/ui/Slot/Slot.js +39 -0
  484. package/dist/components/ui/Slot/Slot.js.map +1 -0
  485. package/dist/components/ui/{status-badge.d.ts → StatusBadge/StatusBadge.d.ts} +2 -2
  486. package/dist/components/ui/StatusBadge/StatusBadge.d.ts.map +1 -0
  487. package/dist/components/ui/{status-badge.js → StatusBadge/StatusBadge.js} +8 -9
  488. package/dist/components/ui/StatusBadge/StatusBadge.js.map +1 -0
  489. package/dist/components/ui/Switcher/Switcher.d.ts +9 -0
  490. package/dist/components/ui/Switcher/Switcher.d.ts.map +1 -0
  491. package/dist/components/ui/Switcher/Switcher.js +75 -0
  492. package/dist/components/ui/Switcher/Switcher.js.map +1 -0
  493. package/dist/components/ui/{table.d.ts → Table/Table.d.ts} +1 -1
  494. package/dist/components/ui/Table/Table.d.ts.map +1 -0
  495. package/dist/components/ui/{table.js → Table/Table.js} +11 -29
  496. package/dist/components/ui/Table/Table.js.map +1 -0
  497. package/dist/components/ui/Tabs/Tabs.d.ts +16 -0
  498. package/dist/components/ui/Tabs/Tabs.d.ts.map +1 -0
  499. package/dist/components/ui/Tabs/Tabs.js +96 -0
  500. package/dist/components/ui/Tabs/Tabs.js.map +1 -0
  501. package/dist/components/ui/{textarea.d.ts → Textarea/Textarea.d.ts} +1 -1
  502. package/dist/components/ui/Textarea/Textarea.d.ts.map +1 -0
  503. package/dist/components/ui/Textarea/Textarea.js +16 -0
  504. package/dist/components/ui/Textarea/Textarea.js.map +1 -0
  505. package/dist/components/ui/Toast/Toast.d.ts +21 -0
  506. package/dist/components/ui/Toast/Toast.d.ts.map +1 -0
  507. package/dist/components/ui/Toast/Toast.js +98 -0
  508. package/dist/components/ui/Toast/Toast.js.map +1 -0
  509. package/dist/components/ui/{toaster.d.ts → Toaster/Toaster.d.ts} +1 -1
  510. package/dist/components/ui/Toaster/Toaster.d.ts.map +1 -0
  511. package/dist/components/ui/Toaster/Toaster.js +27 -0
  512. package/dist/components/ui/Toaster/Toaster.js.map +1 -0
  513. package/dist/components/ui/index.d.ts +45 -31
  514. package/dist/components/ui/index.d.ts.map +1 -1
  515. package/dist/components/ui/index.js +76 -36
  516. package/dist/components/ui/index.js.map +1 -1
  517. package/dist/config.cjs +4 -99
  518. package/dist/config.cjs.map +1 -1
  519. package/dist/defineConfig.cjs +0 -2
  520. package/dist/defineConfig.cjs.map +1 -1
  521. package/dist/globals.css +9648 -430
  522. package/dist/hooks/useComposedRefs.d.ts +5 -0
  523. package/dist/hooks/useComposedRefs.d.ts.map +1 -0
  524. package/dist/hooks/useComposedRefs.js +23 -0
  525. package/dist/hooks/useComposedRefs.js.map +1 -0
  526. package/dist/hooks/useControllableState.d.ts +8 -0
  527. package/dist/hooks/useControllableState.d.ts.map +1 -0
  528. package/dist/hooks/useControllableState.js +28 -0
  529. package/dist/hooks/useControllableState.js.map +1 -0
  530. package/dist/hooks/usePopoverContent.d.ts +26 -0
  531. package/dist/hooks/usePopoverContent.d.ts.map +1 -0
  532. package/dist/hooks/usePopoverContent.js +44 -0
  533. package/dist/hooks/usePopoverContent.js.map +1 -0
  534. package/dist/hooks/useToast.d.ts +4 -4
  535. package/dist/hooks/useToast.d.ts.map +1 -1
  536. package/dist/hooks/useToast.js +1 -3
  537. package/dist/hooks/useToast.js.map +1 -1
  538. package/dist/index.cjs +11 -9506
  539. package/dist/index.cjs.map +1 -1
  540. package/dist/{init-KWH66PKY.js → init-KNIWQGJL.js} +3 -18
  541. package/dist/init-KNIWQGJL.js.map +1 -0
  542. package/dist/lib/configStore.cjs +1 -3
  543. package/dist/lib/configStore.cjs.map +1 -1
  544. package/dist/lib/slugField.d.ts.map +1 -1
  545. package/dist/lib/slugField.js +3 -3
  546. package/dist/lib/slugField.js.map +1 -1
  547. package/dist/lib/slugify.d.ts +13 -0
  548. package/dist/lib/slugify.d.ts.map +1 -0
  549. package/dist/lib/slugify.js +8 -0
  550. package/dist/lib/slugify.js.map +1 -0
  551. package/dist/lib/utils.d.ts +5 -9
  552. package/dist/lib/utils.d.ts.map +1 -1
  553. package/dist/lib/utils.js +29 -3
  554. package/dist/lib/utils.js.map +1 -1
  555. package/dist/query.cjs +58 -9011
  556. package/dist/query.cjs.map +1 -1
  557. package/dist/types.cjs +0 -2
  558. package/dist/types.cjs.map +1 -1
  559. package/dist/types.d.ts +3 -1
  560. package/dist/types.d.ts.map +1 -1
  561. package/dist/{update-QNJRYPMC.js → update-QALIQG76.js} +2 -2
  562. package/dist/withOctoCMS.cjs +2 -36
  563. package/dist/withOctoCMS.cjs.map +1 -1
  564. package/globals.css +9648 -430
  565. package/package.json +1 -16
  566. package/dist/chunk-NAHOP7TG.js +0 -7
  567. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +0 -5
  568. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +0 -1
  569. package/dist/components/ContentModel/ContentModelList.skeleton.js +0 -16
  570. package/dist/components/ContentModel/ContentModelList.skeleton.js.map +0 -1
  571. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +0 -5
  572. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +0 -1
  573. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +0 -22
  574. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +0 -1
  575. package/dist/components/ContentTypes.d.ts +0 -7
  576. package/dist/components/ContentTypes.d.ts.map +0 -1
  577. package/dist/components/ContentTypes.js +0 -132
  578. package/dist/components/ContentTypes.js.map +0 -1
  579. package/dist/components/CreateBranchDialog.d.ts.map +0 -1
  580. package/dist/components/CreateBranchDialog.js.map +0 -1
  581. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +0 -3
  582. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +0 -1
  583. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +0 -10
  584. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +0 -1
  585. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +0 -7
  586. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +0 -1
  587. package/dist/components/Dashboard/DashboardContent.list.skeleton.js +0 -22
  588. package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +0 -1
  589. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +0 -2
  590. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +0 -1
  591. package/dist/components/Dashboard/DashboardContent.skeleton.js +0 -13
  592. package/dist/components/Dashboard/DashboardContent.skeleton.js.map +0 -1
  593. package/dist/components/EditPost/EditPost.skeleton.d.ts +0 -5
  594. package/dist/components/EditPost/EditPost.skeleton.d.ts.map +0 -1
  595. package/dist/components/EditPost/EditPost.skeleton.js +0 -34
  596. package/dist/components/EditPost/EditPost.skeleton.js.map +0 -1
  597. package/dist/components/ErrorBoundary.d.ts.map +0 -1
  598. package/dist/components/ErrorBoundary.js.map +0 -1
  599. package/dist/components/FieldHintAndError.d.ts +0 -8
  600. package/dist/components/FieldHintAndError.d.ts.map +0 -1
  601. package/dist/components/FieldHintAndError.js +0 -14
  602. package/dist/components/FieldHintAndError.js.map +0 -1
  603. package/dist/components/FieldLabel.d.ts +0 -11
  604. package/dist/components/FieldLabel.d.ts.map +0 -1
  605. package/dist/components/FieldLabel.js +0 -17
  606. package/dist/components/FieldLabel.js.map +0 -1
  607. package/dist/components/FieldShell.d.ts.map +0 -1
  608. package/dist/components/FieldShell.js +0 -29
  609. package/dist/components/FieldShell.js.map +0 -1
  610. package/dist/components/FileExplorer/FileExplorer.d.ts +0 -8
  611. package/dist/components/FileExplorer/FileExplorer.d.ts.map +0 -1
  612. package/dist/components/FileExplorer/FileExplorer.js +0 -68
  613. package/dist/components/FileExplorer/FileExplorer.js.map +0 -1
  614. package/dist/components/FormBooleanField.d.ts.map +0 -1
  615. package/dist/components/FormBooleanField.js +0 -52
  616. package/dist/components/FormBooleanField.js.map +0 -1
  617. package/dist/components/FormColorField.d.ts.map +0 -1
  618. package/dist/components/FormColorField.js.map +0 -1
  619. package/dist/components/FormConditionalField.d.ts.map +0 -1
  620. package/dist/components/FormConditionalField.js.map +0 -1
  621. package/dist/components/FormDatetimeField.d.ts.map +0 -1
  622. package/dist/components/FormDatetimeField.js +0 -42
  623. package/dist/components/FormDatetimeField.js.map +0 -1
  624. package/dist/components/FormFields.d.ts.map +0 -1
  625. package/dist/components/FormFields.js.map +0 -1
  626. package/dist/components/FormImageField.d.ts.map +0 -1
  627. package/dist/components/FormImageField.js.map +0 -1
  628. package/dist/components/FormJsonField.d.ts.map +0 -1
  629. package/dist/components/FormJsonField.js.map +0 -1
  630. package/dist/components/FormMarkdownField.d.ts.map +0 -1
  631. package/dist/components/FormMarkdownField.js.map +0 -1
  632. package/dist/components/FormNumberField.d.ts.map +0 -1
  633. package/dist/components/FormNumberField.js +0 -43
  634. package/dist/components/FormNumberField.js.map +0 -1
  635. package/dist/components/FormReferenceField.d.ts.map +0 -1
  636. package/dist/components/FormReferenceField.js.map +0 -1
  637. package/dist/components/FormRichTextField.d.ts.map +0 -1
  638. package/dist/components/FormRichTextField.js.map +0 -1
  639. package/dist/components/FormSelectField.d.ts.map +0 -1
  640. package/dist/components/FormSelectField.js.map +0 -1
  641. package/dist/components/FormSlugField.d.ts.map +0 -1
  642. package/dist/components/FormSlugField.js.map +0 -1
  643. package/dist/components/FormStringField.d.ts.map +0 -1
  644. package/dist/components/FormStringField.js +0 -28
  645. package/dist/components/FormStringField.js.map +0 -1
  646. package/dist/components/FormStringListField.d.ts.map +0 -1
  647. package/dist/components/FormStringListField.js.map +0 -1
  648. package/dist/components/FormTextField.d.ts.map +0 -1
  649. package/dist/components/FormTextField.js +0 -40
  650. package/dist/components/FormTextField.js.map +0 -1
  651. package/dist/components/FormUrlField.d.ts.map +0 -1
  652. package/dist/components/FormUrlField.js +0 -31
  653. package/dist/components/FormUrlField.js.map +0 -1
  654. package/dist/components/Layout/PageBar.d.ts +0 -10
  655. package/dist/components/Layout/PageBar.d.ts.map +0 -1
  656. package/dist/components/Layout/PageBar.js +0 -43
  657. package/dist/components/Layout/PageBar.js.map +0 -1
  658. package/dist/components/Layout/PageShell.d.ts +0 -30
  659. package/dist/components/Layout/PageShell.d.ts.map +0 -1
  660. package/dist/components/Layout/PageShell.js +0 -33
  661. package/dist/components/Layout/PageShell.js.map +0 -1
  662. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +0 -3
  663. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +0 -1
  664. package/dist/components/MediaAsset/MediaAsset.skeleton.js +0 -42
  665. package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +0 -1
  666. package/dist/components/MediaManager/MediaManager.skeleton.d.ts +0 -3
  667. package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +0 -1
  668. package/dist/components/MediaManager/MediaManager.skeleton.js +0 -30
  669. package/dist/components/MediaManager/MediaManager.skeleton.js.map +0 -1
  670. package/dist/components/StatusBadge.d.ts +0 -2
  671. package/dist/components/StatusBadge.d.ts.map +0 -1
  672. package/dist/components/StatusBadge.js +0 -7
  673. package/dist/components/StatusBadge.js.map +0 -1
  674. package/dist/components/richtext/ComponentEmbedEditor.d.ts.map +0 -1
  675. package/dist/components/richtext/ComponentEmbedEditor.js +0 -153
  676. package/dist/components/richtext/ComponentEmbedEditor.js.map +0 -1
  677. package/dist/components/richtext/ConditionEmbedEditor.d.ts.map +0 -1
  678. package/dist/components/richtext/ConditionEmbedEditor.js.map +0 -1
  679. package/dist/components/richtext/ImageEmbedEditor.d.ts.map +0 -1
  680. package/dist/components/richtext/ImageEmbedEditor.js.map +0 -1
  681. package/dist/components/richtext/ReferenceEmbedEditor.d.ts.map +0 -1
  682. package/dist/components/richtext/ReferenceEmbedEditor.js.map +0 -1
  683. package/dist/components/richtext/SlashCommandMenu.d.ts.map +0 -1
  684. package/dist/components/richtext/SlashCommandMenu.js.map +0 -1
  685. package/dist/components/richtext/VariableEmbedEditor.d.ts.map +0 -1
  686. package/dist/components/richtext/VariableEmbedEditor.js +0 -58
  687. package/dist/components/richtext/VariableEmbedEditor.js.map +0 -1
  688. package/dist/components/ui/avatar-stack.d.ts +0 -13
  689. package/dist/components/ui/avatar-stack.d.ts.map +0 -1
  690. package/dist/components/ui/avatar-stack.js +0 -27
  691. package/dist/components/ui/avatar-stack.js.map +0 -1
  692. package/dist/components/ui/avatar.d.ts +0 -7
  693. package/dist/components/ui/avatar.d.ts.map +0 -1
  694. package/dist/components/ui/avatar.js +0 -45
  695. package/dist/components/ui/avatar.js.map +0 -1
  696. package/dist/components/ui/banner.d.ts +0 -13
  697. package/dist/components/ui/banner.d.ts.map +0 -1
  698. package/dist/components/ui/banner.js +0 -24
  699. package/dist/components/ui/banner.js.map +0 -1
  700. package/dist/components/ui/branch-chip.d.ts.map +0 -1
  701. package/dist/components/ui/branch-chip.js +0 -58
  702. package/dist/components/ui/branch-chip.js.map +0 -1
  703. package/dist/components/ui/button.d.ts +0 -14
  704. package/dist/components/ui/button.d.ts.map +0 -1
  705. package/dist/components/ui/button.js +0 -65
  706. package/dist/components/ui/button.js.map +0 -1
  707. package/dist/components/ui/card.d.ts +0 -7
  708. package/dist/components/ui/card.d.ts.map +0 -1
  709. package/dist/components/ui/card.js.map +0 -1
  710. package/dist/components/ui/chip.d.ts.map +0 -1
  711. package/dist/components/ui/chip.js +0 -44
  712. package/dist/components/ui/chip.js.map +0 -1
  713. package/dist/components/ui/dialog.d.ts +0 -20
  714. package/dist/components/ui/dialog.d.ts.map +0 -1
  715. package/dist/components/ui/dialog.js +0 -93
  716. package/dist/components/ui/dialog.js.map +0 -1
  717. package/dist/components/ui/dropdown-menu.d.ts +0 -28
  718. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  719. package/dist/components/ui/dropdown-menu.js +0 -165
  720. package/dist/components/ui/dropdown-menu.js.map +0 -1
  721. package/dist/components/ui/empty.d.ts +0 -11
  722. package/dist/components/ui/empty.d.ts.map +0 -1
  723. package/dist/components/ui/empty.js +0 -24
  724. package/dist/components/ui/empty.js.map +0 -1
  725. package/dist/components/ui/field.d.ts.map +0 -1
  726. package/dist/components/ui/field.js +0 -52
  727. package/dist/components/ui/field.js.map +0 -1
  728. package/dist/components/ui/input.d.ts.map +0 -1
  729. package/dist/components/ui/input.js +0 -51
  730. package/dist/components/ui/input.js.map +0 -1
  731. package/dist/components/ui/kbd.d.ts.map +0 -1
  732. package/dist/components/ui/kbd.js +0 -30
  733. package/dist/components/ui/kbd.js.map +0 -1
  734. package/dist/components/ui/label.d.ts +0 -6
  735. package/dist/components/ui/label.d.ts.map +0 -1
  736. package/dist/components/ui/label.js +0 -20
  737. package/dist/components/ui/label.js.map +0 -1
  738. package/dist/components/ui/publish-button.d.ts +0 -7
  739. package/dist/components/ui/publish-button.d.ts.map +0 -1
  740. package/dist/components/ui/publish-button.js +0 -50
  741. package/dist/components/ui/publish-button.js.map +0 -1
  742. package/dist/components/ui/select.d.ts +0 -14
  743. package/dist/components/ui/select.d.ts.map +0 -1
  744. package/dist/components/ui/select.js +0 -132
  745. package/dist/components/ui/select.js.map +0 -1
  746. package/dist/components/ui/sonner.d.ts +0 -6
  747. package/dist/components/ui/sonner.d.ts.map +0 -1
  748. package/dist/components/ui/sonner.js +0 -37
  749. package/dist/components/ui/sonner.js.map +0 -1
  750. package/dist/components/ui/status-badge.d.ts.map +0 -1
  751. package/dist/components/ui/status-badge.js.map +0 -1
  752. package/dist/components/ui/table.d.ts.map +0 -1
  753. package/dist/components/ui/table.js.map +0 -1
  754. package/dist/components/ui/tabs-pill.d.ts +0 -17
  755. package/dist/components/ui/tabs-pill.d.ts.map +0 -1
  756. package/dist/components/ui/tabs-pill.js +0 -67
  757. package/dist/components/ui/tabs-pill.js.map +0 -1
  758. package/dist/components/ui/tabs.d.ts +0 -8
  759. package/dist/components/ui/tabs.d.ts.map +0 -1
  760. package/dist/components/ui/tabs.js +0 -59
  761. package/dist/components/ui/tabs.js.map +0 -1
  762. package/dist/components/ui/textarea.d.ts.map +0 -1
  763. package/dist/components/ui/textarea.js +0 -25
  764. package/dist/components/ui/textarea.js.map +0 -1
  765. package/dist/components/ui/toast-card.d.ts +0 -15
  766. package/dist/components/ui/toast-card.d.ts.map +0 -1
  767. package/dist/components/ui/toast-card.js +0 -90
  768. package/dist/components/ui/toast-card.js.map +0 -1
  769. package/dist/components/ui/toast.d.ts +0 -16
  770. package/dist/components/ui/toast.d.ts.map +0 -1
  771. package/dist/components/ui/toast.js +0 -95
  772. package/dist/components/ui/toast.js.map +0 -1
  773. package/dist/components/ui/toaster.d.ts.map +0 -1
  774. package/dist/components/ui/toaster.js +0 -30
  775. package/dist/components/ui/toaster.js.map +0 -1
  776. package/dist/init-KWH66PKY.js.map +0 -1
  777. /package/dist/{agentDocs-M3R2CPUQ.js.map → agentDocs-QZ4NOQVH.js.map} +0 -0
  778. /package/dist/components/{ErrorBoundary.d.ts → ErrorBoundary/ErrorBoundary.d.ts} +0 -0
  779. /package/dist/components/{CreateBranchDialog.d.ts → Layout/CreateBranchDialog.d.ts} +0 -0
  780. /package/dist/components/{FormBooleanField.d.ts → ui/FormField/FormBooleanField.d.ts} +0 -0
  781. /package/dist/components/{FormColorField.d.ts → ui/FormField/FormColorField.d.ts} +0 -0
  782. /package/dist/components/{FormDatetimeField.d.ts → ui/FormField/FormDatetimeField.d.ts} +0 -0
  783. /package/dist/components/{FormJsonField.d.ts → ui/FormField/FormJsonField.d.ts} +0 -0
  784. /package/dist/components/{FormMarkdownField.d.ts → ui/FormField/FormMarkdownField.d.ts} +0 -0
  785. /package/dist/components/{FormNumberField.d.ts → ui/FormField/FormNumberField.d.ts} +0 -0
  786. /package/dist/components/{FormSlugField.d.ts → ui/FormField/FormSlugField.d.ts} +0 -0
  787. /package/dist/components/{FormStringField.d.ts → ui/FormField/FormStringField.d.ts} +0 -0
  788. /package/dist/components/{FormStringListField.d.ts → ui/FormField/FormStringListField.d.ts} +0 -0
  789. /package/dist/components/{FormTextField.d.ts → ui/FormField/FormTextField.d.ts} +0 -0
  790. /package/dist/components/{FormUrlField.d.ts → ui/FormField/FormUrlField.d.ts} +0 -0
  791. /package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.d.ts +0 -0
  792. /package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.d.ts +0 -0
  793. /package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.d.ts +0 -0
  794. /package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.d.ts +0 -0
  795. /package/dist/components/{richtext → ui/FormField/richtext}/VariableEmbedEditor.d.ts +0 -0
  796. /package/dist/{update-QNJRYPMC.js.map → update-QALIQG76.js.map} +0 -0
@@ -12,7 +12,7 @@ type AdminAppProps = {
12
12
  * /cms/content → ContentPage (alias for /cms — kept for legacy links)
13
13
  * /cms/content/<type> → CollectionPage
14
14
  * /cms/content/<type>/<id> → EntryPage
15
- * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)
15
+ * /cms/chat → ChatPage (setup guide when agent not enabled)
16
16
  * /cms/media → MediaPage (library — grid + folders)
17
17
  * /cms/media/<id> → MediaAssetPage (full-page asset editor)
18
18
  * /cms/model → ContentModelPage
@@ -1,6 +1,6 @@
1
1
  import "../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { DashboardContentSkeleton } from "../components/Dashboard/DashboardContent.skeleton";
3
+ import { NeutralPageSkeleton } from "../components/Layout/skeletons/NeutralPageSkeleton";
4
4
  import { ChatPage } from "./pages/ChatPage";
5
5
  import { CollectionPage } from "./pages/CollectionPage";
6
6
  import { ContentModelPage } from "./pages/ContentModelPage";
@@ -43,7 +43,7 @@ async function AdminApp({ params }) {
43
43
  const [, type, id] = segments;
44
44
  return /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }, `${type}/${id}`);
45
45
  }
46
- return /* @__PURE__ */ jsx(DashboardContentSkeleton, {});
46
+ return /* @__PURE__ */ jsx(NeutralPageSkeleton, {});
47
47
  }
48
48
  export {
49
49
  AdminApp
@@ -1 +1 @@
1
- {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → ContentPage (admin home — content list)\n * /cms/content → ContentPage (alias for /cms — kept for legacy links)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * **No `Suspense` in the dispatcher** — `await params` runs in this async RSC; Next.js\n * keeps the previous segment visible during navigation. Thin server shells (`*Page`)\n * hand off to client components that load via TanStack Query and render their own\n * block-level skeletons (`LeftPanelSkeleton`, `ContentTableSkeleton`, etc.).\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <ContentPage />;\n }\n\n if (segments[0] === 'chat') {\n return <ChatPage />;\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return <MediaPage />;\n }\n const id = segments[1];\n return <MediaAssetPage id={id} key={id} />;\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return <ContentModelPage />;\n }\n const [, type] = segments;\n return <ContentTypePage type={type} key={type} />;\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return <ContentPage />;\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return <CollectionPage params={Promise.resolve({ type })} key={type} />;\n }\n const [, type, id] = segments;\n return <EntryPage params={Promise.resolve({ type, id })} key={`${type}/${id}`} />;\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAwCW;AAxCX,SAAS,gCAAgC;AAEzC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA0B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,eAAY;AAAA,EACtB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WAAO,oBAAC,YAAS;AAAA,EACnB;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,aAAU;AAAA,IACpB;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WAAO,oBAAC,kBAAe,MAAa,EAAI;AAAA,EAC1C;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,oBAAiB;AAAA,IAC3B;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WAAO,oBAAC,mBAAgB,QAAiB,IAAM;AAAA,EACjD;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,eAAY;AAAA,IACtB;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aAAO,oBAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,KAAQA,KAAM;AAAA,IACvE;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WAAO,oBAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAQ,GAAG,IAAI,IAAI,EAAE,EAAI;AAAA,EACjF;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
1
+ {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import { NeutralPageSkeleton } from '../components/Layout/skeletons/NeutralPageSkeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → ContentPage (admin home — content list)\n * /cms/content → ContentPage (alias for /cms — kept for legacy links)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (setup guide when agent not enabled)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * **No `Suspense` in the dispatcher** — `await params` runs in this async RSC; Next.js\n * keeps the previous segment visible during navigation. Thin server shells (`*Page`)\n * hand off to client components that load via TanStack Query and render their own\n * block-level skeletons (`LeftPanelSkeleton`, `ContentTableSkeleton`, etc.).\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <ContentPage />;\n }\n\n if (segments[0] === 'chat') {\n return <ChatPage />;\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return <MediaPage />;\n }\n const id = segments[1];\n return <MediaAssetPage id={id} key={id} />;\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return <ContentModelPage />;\n }\n const [, type] = segments;\n return <ContentTypePage type={type} key={type} />;\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return <ContentPage />;\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return <CollectionPage params={Promise.resolve({ type })} key={type} />;\n }\n const [, type, id] = segments;\n return <EntryPage params={Promise.resolve({ type, id })} key={`${type}/${id}`} />;\n }\n\n return <NeutralPageSkeleton />;\n}\n"],"mappings":";AAwCW;AAxCX,SAAS,2BAA2B;AAEpC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA0B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,eAAY;AAAA,EACtB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WAAO,oBAAC,YAAS;AAAA,EACnB;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,aAAU;AAAA,IACpB;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WAAO,oBAAC,kBAAe,MAAa,EAAI;AAAA,EAC1C;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,oBAAiB;AAAA,IAC3B;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WAAO,oBAAC,mBAAgB,QAAiB,IAAM;AAAA,EACjD;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,eAAY;AAAA,IACtB;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aAAO,oBAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,KAAQA,KAAM;AAAA,IACvE;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WAAO,oBAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAQ,GAAG,IAAI,IAAI,EAAE,EAAI;AAAA,EACjF;AAEA,SAAO,oBAAC,uBAAoB;AAC9B;","names":["type"]}
@@ -9,9 +9,9 @@ export type AgentClientStatus = {
9
9
  /**
10
10
  * Server-side check exposed to the admin client (Header nav link).
11
11
  *
12
- * Never returns the API key. Returns `{ enabled: false }` when the chat is
13
- * disabled, so the client can hide the nav link without learning *why* —
14
- * mirroring the route-handler 404.
12
+ * Never returns the API key. Returns `{ enabled: false }` when the chat API is
13
+ * disabled (missing config, key, or budget). The `/cms/chat` page still renders
14
+ * a setup guide; this action is for optional client UI that needs a boolean gate.
15
15
  */
16
16
  export declare function getAgentClientStatus(): Promise<AgentClientStatus>;
17
17
  export type AcceptProposalActionResult = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/agent.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport { getServerSession } from 'next-auth/next';\n\nimport { getAgentConfig } from '../../agent/configStore';\nimport { getAgentStatus, isAgentEnabled } from '../../agent/featureFlag';\nimport { acceptProposal, isProposal, type AcceptResult } from '../../agent/proposals';\nimport { authOptions } from '../auth';\n\nexport type AgentClientStatus =\n | { enabled: false }\n | {\n enabled: true;\n provider: 'anthropic' | 'openai' | 'local';\n model: string;\n };\n\n/**\n * Server-side check exposed to the admin client (Header nav link).\n *\n * Never returns the API key. Returns `{ enabled: false }` when the chat is\n * disabled, so the client can hide the nav link without learning *why* —\n * mirroring the route-handler 404.\n */\nexport async function getAgentClientStatus(): Promise<AgentClientStatus> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) return { enabled: false };\n // Recompute via getAgentStatus so we exercise the same code path the route uses.\n const status = getAgentStatus(cfg);\n if (!status.enabled) return { enabled: false };\n return { enabled: true, provider: cfg.provider.type, model: cfg.provider.model };\n}\n\nexport type AcceptProposalActionResult =\n | { ok: true; entryPath: string }\n | { ok: false; error: string; fieldErrors?: Record<string, string> };\n\n/**\n * Server action — apply a chat-agent edit/create proposal.\n *\n * Replaces the previous `POST /api/agent/proposals/accept` Route Handler. The\n * client (`useChatStream`) calls this directly via the Server Action transport\n * — no public endpoint, no thin re-export file.\n *\n * Stateless by design: the entire proposal payload arrives over the wire and\n * is re-validated here (and again inside `acceptProposal` via the schema\n * validator + `saveFile`).\n *\n * Returns `{ ok: false, error }` on validation / write failures so the client\n * can render an inline error without try/catch around the action call.\n * Throws only when the agent is disabled or the caller is unauthenticated —\n * those are caller-bug shapes, not user-facing flow.\n */\nexport async function acceptProposalAction(proposal: unknown): Promise<AcceptProposalActionResult> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) {\n throw new Error('Chat agent is disabled.');\n }\n\n const session = await getServerSession(authOptions);\n if (!session) {\n throw new Error('Unauthorized.');\n }\n\n if (!isProposal(proposal)) {\n return { ok: false, error: 'Invalid proposal payload.' };\n }\n\n const result: AcceptResult = await acceptProposal(proposal);\n if (!result.ok) {\n return result.fieldErrors\n ? { ok: false, error: result.error, fieldErrors: result.fieldErrors }\n : { ok: false, error: result.error };\n }\n return { ok: true, entryPath: result.entryPath };\n}\n\n/**\n * Server action — record that the user dismissed a proposal.\n *\n * Replaces the previous `POST /api/agent/proposals/reject` Route Handler.\n * There's no server-side proposal record to mark rejected; this just\n * acknowledges the click. The client reflects rejection in its own state and\n * feeds the rejection back to the model on the next chat turn as a synthetic\n * system note. The `reason` argument is currently ignored — kept for forward\n * compatibility (e.g. analytics / per-rejection telemetry).\n *\n * Auth-gated to keep the surface consistent with `acceptProposalAction`.\n */\nexport async function rejectProposalAction(_reason?: string | null): Promise<{ ok: true }> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) {\n throw new Error('Chat agent is disabled.');\n }\n\n const session = await getServerSession(authOptions);\n if (!session) {\n throw new Error('Unauthorized.');\n }\n\n return { ok: true };\n}\n"],"mappings":";;AAEA,OAAO;AAEP,SAAS,wBAAwB;AAEjC,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB,sBAAsB;AAC/C,SAAS,gBAAgB,kBAAqC;AAC9D,SAAS,mBAAmB;AAiB5B,eAAsB,uBAAmD;AACvE,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAG,QAAO,EAAE,SAAS,MAAM;AAE1D,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,CAAC,OAAO,QAAS,QAAO,EAAE,SAAS,MAAM;AAC7C,SAAO,EAAE,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,OAAO,IAAI,SAAS,MAAM;AACjF;AAsBA,eAAsB,qBAAqB,UAAwD;AACjG,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAEA,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO,EAAE,IAAI,OAAO,OAAO,4BAA4B;AAAA,EACzD;AAEA,QAAM,SAAuB,MAAM,eAAe,QAAQ;AAC1D,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,OAAO,cACV,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,aAAa,OAAO,YAAY,IAClE,EAAE,IAAI,OAAO,OAAO,OAAO,MAAM;AAAA,EACvC;AACA,SAAO,EAAE,IAAI,MAAM,WAAW,OAAO,UAAU;AACjD;AAcA,eAAsB,qBAAqB,SAAgD;AACzF,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;","names":[]}
1
+ {"version":3,"sources":["../../../admin/actions/agent.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport { getServerSession } from 'next-auth/next';\n\nimport { getAgentConfig } from '../../agent/configStore';\nimport { getAgentStatus, isAgentEnabled } from '../../agent/featureFlag';\nimport { acceptProposal, isProposal, type AcceptResult } from '../../agent/proposals';\nimport { authOptions } from '../auth';\n\nexport type AgentClientStatus =\n | { enabled: false }\n | {\n enabled: true;\n provider: 'anthropic' | 'openai' | 'local';\n model: string;\n };\n\n/**\n * Server-side check exposed to the admin client (Header nav link).\n *\n * Never returns the API key. Returns `{ enabled: false }` when the chat API is\n * disabled (missing config, key, or budget). The `/cms/chat` page still renders\n * a setup guide; this action is for optional client UI that needs a boolean gate.\n */\nexport async function getAgentClientStatus(): Promise<AgentClientStatus> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) return { enabled: false };\n // Recompute via getAgentStatus so we exercise the same code path the route uses.\n const status = getAgentStatus(cfg);\n if (!status.enabled) return { enabled: false };\n return { enabled: true, provider: cfg.provider.type, model: cfg.provider.model };\n}\n\nexport type AcceptProposalActionResult =\n | { ok: true; entryPath: string }\n | { ok: false; error: string; fieldErrors?: Record<string, string> };\n\n/**\n * Server action — apply a chat-agent edit/create proposal.\n *\n * Replaces the previous `POST /api/agent/proposals/accept` Route Handler. The\n * client (`useChatStream`) calls this directly via the Server Action transport\n * — no public endpoint, no thin re-export file.\n *\n * Stateless by design: the entire proposal payload arrives over the wire and\n * is re-validated here (and again inside `acceptProposal` via the schema\n * validator + `saveFile`).\n *\n * Returns `{ ok: false, error }` on validation / write failures so the client\n * can render an inline error without try/catch around the action call.\n * Throws only when the agent is disabled or the caller is unauthenticated —\n * those are caller-bug shapes, not user-facing flow.\n */\nexport async function acceptProposalAction(proposal: unknown): Promise<AcceptProposalActionResult> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) {\n throw new Error('Chat agent is disabled.');\n }\n\n const session = await getServerSession(authOptions);\n if (!session) {\n throw new Error('Unauthorized.');\n }\n\n if (!isProposal(proposal)) {\n return { ok: false, error: 'Invalid proposal payload.' };\n }\n\n const result: AcceptResult = await acceptProposal(proposal);\n if (!result.ok) {\n return result.fieldErrors\n ? { ok: false, error: result.error, fieldErrors: result.fieldErrors }\n : { ok: false, error: result.error };\n }\n return { ok: true, entryPath: result.entryPath };\n}\n\n/**\n * Server action — record that the user dismissed a proposal.\n *\n * Replaces the previous `POST /api/agent/proposals/reject` Route Handler.\n * There's no server-side proposal record to mark rejected; this just\n * acknowledges the click. The client reflects rejection in its own state and\n * feeds the rejection back to the model on the next chat turn as a synthetic\n * system note. The `reason` argument is currently ignored — kept for forward\n * compatibility (e.g. analytics / per-rejection telemetry).\n *\n * Auth-gated to keep the surface consistent with `acceptProposalAction`.\n */\nexport async function rejectProposalAction(_reason?: string | null): Promise<{ ok: true }> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) {\n throw new Error('Chat agent is disabled.');\n }\n\n const session = await getServerSession(authOptions);\n if (!session) {\n throw new Error('Unauthorized.');\n }\n\n return { ok: true };\n}\n"],"mappings":";;AAEA,OAAO;AAEP,SAAS,wBAAwB;AAEjC,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB,sBAAsB;AAC/C,SAAS,gBAAgB,kBAAqC;AAC9D,SAAS,mBAAmB;AAiB5B,eAAsB,uBAAmD;AACvE,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAG,QAAO,EAAE,SAAS,MAAM;AAE1D,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,CAAC,OAAO,QAAS,QAAO,EAAE,SAAS,MAAM;AAC7C,SAAO,EAAE,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,OAAO,IAAI,SAAS,MAAM;AACjF;AAsBA,eAAsB,qBAAqB,UAAwD;AACjG,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAEA,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO,EAAE,IAAI,OAAO,OAAO,4BAA4B;AAAA,EACzD;AAEA,QAAM,SAAuB,MAAM,eAAe,QAAQ;AAC1D,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,OAAO,cACV,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,aAAa,OAAO,YAAY,IAClE,EAAE,IAAI,OAAO,OAAO,OAAO,MAAM;AAAA,EACvC;AACA,SAAO,EAAE,IAAI,MAAM,WAAW,OAAO,UAAU;AACjD;AAcA,eAAsB,qBAAqB,SAAgD;AACzF,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,eAAe;AAAA,EACjC;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../admin/actions/media.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAU1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,OAAO,EAAwC,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAiE1G;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,SAAS,EAAE,CA2D3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,QAAQ,KAAG,OAAO,CAAC,iBAAiB,CAsF/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,YAAY,CA8CvE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,YAAY,CA2BxF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAU,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,YAAY,CAmC9F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CA8B5E,CAAC"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../admin/actions/media.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAU1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,OAAO,EAAwC,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAmE1G;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,SAAS,EAAE,CA2D3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,QAAQ,KAAG,OAAO,CAAC,iBAAiB,CAsF/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,YAAY,CA8CvE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,YAAY,CA2BxF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAU,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,YAAY,CAmC9F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CA8B5E,CAAC"}
@@ -53,6 +53,7 @@ function contentToMediaFile(content) {
53
53
  const width = typeof fields.width === "number" && fields.width > 0 ? fields.width : null;
54
54
  const height = typeof fields.height === "number" && fields.height > 0 ? fields.height : null;
55
55
  const blur = fields.blurDataURL;
56
+ const blurDataURL = typeof blur === "string" && blur.length > 0 ? blur : null;
56
57
  const hasBlurPlaceholder = typeof blur === "string" && blur.length > 0;
57
58
  return {
58
59
  id,
@@ -64,7 +65,8 @@ function contentToMediaFile(content) {
64
65
  publicUrl: `/media/${id}.${ext}`,
65
66
  width,
66
67
  height,
67
- hasBlurPlaceholder
68
+ hasBlurPlaceholder,
69
+ blurDataURL
68
70
  };
69
71
  }
70
72
  const getMediaEntries = async () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/media.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { cookies } from 'next/headers';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport { extractImageMetadata } from '../../lib/extractImageMetadata';\nimport type { MediaFile } from '../../types';\n\nimport { mediaContentFolder, mediaEntryPath } from '../../lib/mediaPath';\nimport { getAgentConfig } from '../../agent/configStore';\nimport { syncEmbeddingsAfterRemove, syncEmbeddingsAfterUpsert } from '../../agent/embeddingsHook';\n\nimport { deleteGitHubFile, isProductionMode, saveGitHubBinaryFile, saveGitHubFile } from '../github';\nimport { applyMutation, getStoredMediaEntries } from '../store/contentStore';\nimport { assertFeatureBranchForWritesIfRequired, getContentFiles, getFile, getMediaContentFiles } from './files';\nimport { actionErr, actionOk, getErrorMessage, type ActionResult, type UploadMediaResult } from './utils';\n\nconst MAX_UPLOAD_SIZE = 10 * 1024 * 1024; // 10 MB\n\n/** Best-effort embedding sync after a media write — same shape as the hook used by content writes. */\nasync function syncMediaEmbeddingUpsert(\n entryPath: string,\n payload: { sys?: { type?: string }; fields?: Record<string, unknown> },\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const cfg = getConfig();\n const activeBranch = isProductionMode() ? (await cookies()).get('cms-active-branch')?.value : undefined;\n await syncEmbeddingsAfterUpsert({\n agentConfig,\n config: cfg,\n entryPath,\n payload,\n companions: {},\n branch: activeBranch,\n isProduction: isProductionMode(),\n });\n}\n\nasync function syncMediaEmbeddingRemove(entryPath: string): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const activeBranch = isProductionMode() ? (await cookies()).get('cms-active-branch')?.value : undefined;\n await syncEmbeddingsAfterRemove({\n agentConfig,\n entryPath,\n branch: activeBranch,\n isProduction: isProductionMode(),\n });\n}\n\n/** Convert parsed entry content to a MediaFile object. Returns null if the entry is invalid. */\nfunction contentToMediaFile(content: Record<string, unknown>): MediaFile | null {\n const config = getConfig();\n const sys = content.sys as { id?: string } | undefined;\n const fields = content.fields as Record<string, unknown> | undefined;\n if (!sys?.id || !fields) return null;\n\n const id = sys.id;\n const ext = (typeof fields.extension === 'string' ? fields.extension : '') || '';\n const title = typeof fields.title === 'string' ? fields.title : '';\n const width = typeof fields.width === 'number' && fields.width > 0 ? fields.width : null;\n const height = typeof fields.height === 'number' && fields.height > 0 ? fields.height : null;\n const blur = fields.blurDataURL;\n const hasBlurPlaceholder = typeof blur === 'string' && blur.length > 0;\n\n return {\n id,\n title,\n originalName: (typeof fields.originalName === 'string' ? fields.originalName : '') || '',\n extension: ext,\n folder: (typeof fields.folder === 'string' ? fields.folder : '') || '/',\n path: `${config.mediaFolder}/${id}.${ext}`,\n publicUrl: `/media/${id}.${ext}`,\n width,\n height,\n hasBlurPlaceholder,\n };\n}\n\n/**\n * Get all media entries from the configured media-content folder\n * (`config.mediaContentFolder`, default `cms/media/`).\n */\nexport const getMediaEntries = async (): Promise<MediaFile[]> => {\n // Try in-memory store first (instant, all media entries pre-indexed)\n if (isProductionMode()) {\n try {\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n const storedMedia = await getStoredMediaEntries(activeBranch);\n\n if (storedMedia) {\n const entries: MediaFile[] = [];\n for (const [, stored] of storedMedia) {\n const mf = contentToMediaFile(stored.content);\n if (mf) entries.push(mf);\n }\n return entries;\n }\n } catch {\n // Store unavailable — fall through to per-file reads\n }\n }\n\n const files = await getMediaContentFiles();\n const entries: MediaFile[] = [];\n\n for (const file of files) {\n try {\n const content = await getFile(file);\n const mf = contentToMediaFile(content);\n if (!mf) continue;\n // Stamp the dev-mode mtime so the list can sort by \"newest first\".\n // Production reads from GitHub which doesn't expose stat — `updatedAt`\n // stays undefined and the list falls back to insertion order. The\n // The `process.env.NODE_ENV !== 'production'` guard is replaced with a\n // string literal at build time, so this block is dead code in production\n // bundles. The bundler DCEs it, removing the path.join(process.cwd(), …)\n // call that would otherwise trip NFT into over-tracing.\n if (process.env.NODE_ENV !== 'production') {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n mf.updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore — stat unavailable, sort will treat as oldest\n }\n }\n entries.push(mf);\n } catch (_e) {\n // Skip invalid entries\n }\n }\n\n // Default sort: newest first. Entries without `updatedAt` (e.g. production\n // reads) sort to the end so dev mode and prod stay visually consistent.\n entries.sort((a, b) => {\n if (!a.updatedAt && !b.updatedAt) return 0;\n if (!a.updatedAt) return 1;\n if (!b.updatedAt) return -1;\n return b.updatedAt.localeCompare(a.updatedAt);\n });\n\n return entries;\n};\n\n/**\n * Upload a media file. Creates a physical file at `<mediaFolder>/[uuid].[ext]`\n * and a media entry at `<mediaContentFolder>/media-[uuid].json`.\n *\n * @returns The media entry UUID\n */\nexport const uploadMedia = async (formData: FormData): Promise<UploadMediaResult> => {\n const config = getConfig();\n const file = formData.get('file') as File | null;\n const folder = (formData.get('folder') as string | null) || '/';\n const titleRaw = formData.get('title');\n const title = typeof titleRaw === 'string' ? titleRaw.trim() : '';\n\n if (!title) {\n return { success: false, error: 'Title is required for every uploaded image' };\n }\n\n if (!file || !(file instanceof File)) {\n return { success: false, error: 'No file provided' };\n }\n\n if (file.size > MAX_UPLOAD_SIZE) {\n return {\n success: false,\n error: `File too large. Maximum size is ${MAX_UPLOAD_SIZE / 1024 / 1024} MB`,\n };\n }\n\n const ext = file.name.split('.').pop()?.toLowerCase() || '';\n\n if (!config.mediaAllowedFormats.includes(ext)) {\n return {\n success: false,\n error: `File format \".${ext}\" is not allowed. Allowed: ${config.mediaAllowedFormats.join(', ')}`,\n };\n }\n\n const id = crypto.randomUUID();\n const physicalPath = `${config.mediaFolder}/${id}.${ext}`;\n const entryPath = mediaEntryPath(id);\n\n try {\n const buffer = Buffer.from(await file.arrayBuffer());\n const generateBlurRaw = formData.get('generateBlur');\n // Default ON — only the explicit string '0' or 'false' opts out.\n const generateBlur = !(generateBlurRaw === '0' || generateBlurRaw === 'false');\n const { width, height, blurDataURL } = await extractImageMetadata(buffer, { generateBlur });\n\n const fields: Record<string, unknown> = {\n title,\n // Stored filename = the actual on-disk filename (UUID-based), not the\n // user's upload name. Avoids leaking messy filenames like\n // \"Long file name.jpg\" into the UI; the physical file already lives at\n // `<mediaFolder>/<uuid>.<ext>` so this stays consistent.\n originalName: `${id}.${ext}`,\n extension: ext,\n folder,\n };\n if (width != null) fields.width = width;\n if (height != null) fields.height = height;\n if (blurDataURL != null) fields.blurDataURL = blurDataURL;\n\n const entry = {\n sys: { id, type: 'media' },\n fields,\n };\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubBinaryFile(physicalPath, buffer, `Upload media ${file.name}`, activeBranch);\n await saveGitHubFile(entryPath, `${JSON.stringify(entry, null, 2)}\\n`, `Add media entry ${id}`, activeBranch);\n\n // Write-through: add media entry to in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.mkdir(path.join(process.cwd(), config.mediaFolder), { recursive: true });\n await fsPromises.writeFile(path.join(process.cwd(), physicalPath), buffer);\n\n await fsPromises.mkdir(path.join(process.cwd(), mediaContentFolder()), { recursive: true });\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), `${JSON.stringify(entry, null, 2)}\\n`, 'utf8');\n }\n\n // Best-effort: index the new media entry so it appears in chat-agent search.\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return { success: true, id };\n } catch (e) {\n return { success: false, error: `Failed to upload file: ${getErrorMessage(e)}` };\n }\n};\n\n/**\n * Delete a media entry and its physical file.\n * Blocks deletion if the image is referenced by any content entry.\n */\nexport const deleteMedia = async (mediaId: string): Promise<ActionResult> => {\n const config = getConfig();\n const refs = await checkMediaReferences(mediaId);\n\n if (refs.length > 0) {\n return {\n success: false,\n error: `Cannot delete: image is used in ${refs.length} content entry(ies)`,\n };\n }\n\n const entryPath = mediaEntryPath(mediaId);\n let entry;\n\n try {\n entry = await getFile(entryPath);\n } catch (_e) {\n return { success: false, error: 'Media entry not found' };\n }\n\n const ext = entry?.fields?.extension || '';\n const physicalPath = `${config.mediaFolder}/${mediaId}.${ext}`;\n\n try {\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await deleteGitHubFile(physicalPath, `Delete media file ${mediaId}`, activeBranch);\n await deleteGitHubFile(entryPath, `Delete media entry ${mediaId}`, activeBranch);\n\n // Write-through: remove media entry from in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'delete', path: entryPath });\n }\n } else {\n await fsPromises.unlink(path.join(process.cwd(), physicalPath));\n await fsPromises.unlink(path.join(process.cwd(), entryPath));\n }\n\n // Drop from the chat-agent search index.\n await syncMediaEmbeddingRemove(entryPath);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to delete media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Move a media entry to a different virtual folder.\n */\nexport const moveMedia = async (mediaId: string, newFolder: string): Promise<ActionResult> => {\n const entryPath = mediaEntryPath(mediaId);\n\n try {\n const entry = await getFile(entryPath);\n entry.fields.folder = newFolder || '/';\n\n const data = `${JSON.stringify(entry, null, 2)}\\n`;\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubFile(entryPath, data, `Move media ${mediaId} to ${newFolder}`, activeBranch);\n\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), data, 'utf8');\n }\n\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to move media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Update human-readable title on a media entry (required for accessibility / alt text).\n */\nexport const updateMediaMetadata = async (mediaId: string, title: string): Promise<ActionResult> => {\n const trimmed = title.trim();\n if (!trimmed) {\n return { success: false, error: 'Title is required' };\n }\n\n const entryPath = mediaEntryPath(mediaId);\n\n try {\n const entry = await getFile(entryPath);\n if (!entry?.fields || typeof entry.fields !== 'object') {\n return { success: false, error: 'Media entry not found' };\n }\n entry.fields.title = trimmed;\n\n const data = `${JSON.stringify(entry, null, 2)}\\n`;\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubFile(entryPath, data, `Update media title ${mediaId}`, activeBranch);\n\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), data, 'utf8');\n }\n\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to update media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Check all content entries for image fields referencing this media ID.\n * Returns an array of file paths that reference the given media ID.\n */\nexport const checkMediaReferences = async (mediaId: string): Promise<string[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const references: string[] = [];\n\n for (const file of allFiles) {\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n\n if (!collection) continue;\n\n const imageFieldKeys = Object.keys(collection.fields).filter((k) => collection.fields[k].format === 'image');\n\n for (const field of imageFieldKeys) {\n if (content?.fields?.[field] === mediaId) {\n references.push(file);\n break;\n }\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return references;\n};\n"],"mappings":"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","names":["entries"]}
1
+ {"version":3,"sources":["../../../admin/actions/media.ts"],"sourcesContent":["'use server';\n\nimport './registerConfig';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { cookies } from 'next/headers';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport { extractImageMetadata } from '../../lib/extractImageMetadata';\nimport type { MediaFile } from '../../types';\n\nimport { mediaContentFolder, mediaEntryPath } from '../../lib/mediaPath';\nimport { getAgentConfig } from '../../agent/configStore';\nimport { syncEmbeddingsAfterRemove, syncEmbeddingsAfterUpsert } from '../../agent/embeddingsHook';\n\nimport { deleteGitHubFile, isProductionMode, saveGitHubBinaryFile, saveGitHubFile } from '../github';\nimport { applyMutation, getStoredMediaEntries } from '../store/contentStore';\nimport { assertFeatureBranchForWritesIfRequired, getContentFiles, getFile, getMediaContentFiles } from './files';\nimport { actionErr, actionOk, getErrorMessage, type ActionResult, type UploadMediaResult } from './utils';\n\nconst MAX_UPLOAD_SIZE = 10 * 1024 * 1024; // 10 MB\n\n/** Best-effort embedding sync after a media write — same shape as the hook used by content writes. */\nasync function syncMediaEmbeddingUpsert(\n entryPath: string,\n payload: { sys?: { type?: string }; fields?: Record<string, unknown> },\n): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const cfg = getConfig();\n const activeBranch = isProductionMode() ? (await cookies()).get('cms-active-branch')?.value : undefined;\n await syncEmbeddingsAfterUpsert({\n agentConfig,\n config: cfg,\n entryPath,\n payload,\n companions: {},\n branch: activeBranch,\n isProduction: isProductionMode(),\n });\n}\n\nasync function syncMediaEmbeddingRemove(entryPath: string): Promise<void> {\n const agentConfig = getAgentConfig();\n if (!agentConfig) return;\n const activeBranch = isProductionMode() ? (await cookies()).get('cms-active-branch')?.value : undefined;\n await syncEmbeddingsAfterRemove({\n agentConfig,\n entryPath,\n branch: activeBranch,\n isProduction: isProductionMode(),\n });\n}\n\n/** Convert parsed entry content to a MediaFile object. Returns null if the entry is invalid. */\nfunction contentToMediaFile(content: Record<string, unknown>): MediaFile | null {\n const config = getConfig();\n const sys = content.sys as { id?: string } | undefined;\n const fields = content.fields as Record<string, unknown> | undefined;\n if (!sys?.id || !fields) return null;\n\n const id = sys.id;\n const ext = (typeof fields.extension === 'string' ? fields.extension : '') || '';\n const title = typeof fields.title === 'string' ? fields.title : '';\n const width = typeof fields.width === 'number' && fields.width > 0 ? fields.width : null;\n const height = typeof fields.height === 'number' && fields.height > 0 ? fields.height : null;\n const blur = fields.blurDataURL;\n const blurDataURL = typeof blur === 'string' && blur.length > 0 ? blur : null;\n const hasBlurPlaceholder = typeof blur === 'string' && blur.length > 0;\n\n return {\n id,\n title,\n originalName: (typeof fields.originalName === 'string' ? fields.originalName : '') || '',\n extension: ext,\n folder: (typeof fields.folder === 'string' ? fields.folder : '') || '/',\n path: `${config.mediaFolder}/${id}.${ext}`,\n publicUrl: `/media/${id}.${ext}`,\n width,\n height,\n hasBlurPlaceholder,\n blurDataURL,\n };\n}\n\n/**\n * Get all media entries from the configured media-content folder\n * (`config.mediaContentFolder`, default `cms/media/`).\n */\nexport const getMediaEntries = async (): Promise<MediaFile[]> => {\n // Try in-memory store first (instant, all media entries pre-indexed)\n if (isProductionMode()) {\n try {\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n const storedMedia = await getStoredMediaEntries(activeBranch);\n\n if (storedMedia) {\n const entries: MediaFile[] = [];\n for (const [, stored] of storedMedia) {\n const mf = contentToMediaFile(stored.content);\n if (mf) entries.push(mf);\n }\n return entries;\n }\n } catch {\n // Store unavailable — fall through to per-file reads\n }\n }\n\n const files = await getMediaContentFiles();\n const entries: MediaFile[] = [];\n\n for (const file of files) {\n try {\n const content = await getFile(file);\n const mf = contentToMediaFile(content);\n if (!mf) continue;\n // Stamp the dev-mode mtime so the list can sort by \"newest first\".\n // Production reads from GitHub which doesn't expose stat — `updatedAt`\n // stays undefined and the list falls back to insertion order. The\n // The `process.env.NODE_ENV !== 'production'` guard is replaced with a\n // string literal at build time, so this block is dead code in production\n // bundles. The bundler DCEs it, removing the path.join(process.cwd(), …)\n // call that would otherwise trip NFT into over-tracing.\n if (process.env.NODE_ENV !== 'production') {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n mf.updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore — stat unavailable, sort will treat as oldest\n }\n }\n entries.push(mf);\n } catch (_e) {\n // Skip invalid entries\n }\n }\n\n // Default sort: newest first. Entries without `updatedAt` (e.g. production\n // reads) sort to the end so dev mode and prod stay visually consistent.\n entries.sort((a, b) => {\n if (!a.updatedAt && !b.updatedAt) return 0;\n if (!a.updatedAt) return 1;\n if (!b.updatedAt) return -1;\n return b.updatedAt.localeCompare(a.updatedAt);\n });\n\n return entries;\n};\n\n/**\n * Upload a media file. Creates a physical file at `<mediaFolder>/[uuid].[ext]`\n * and a media entry at `<mediaContentFolder>/media-[uuid].json`.\n *\n * @returns The media entry UUID\n */\nexport const uploadMedia = async (formData: FormData): Promise<UploadMediaResult> => {\n const config = getConfig();\n const file = formData.get('file') as File | null;\n const folder = (formData.get('folder') as string | null) || '/';\n const titleRaw = formData.get('title');\n const title = typeof titleRaw === 'string' ? titleRaw.trim() : '';\n\n if (!title) {\n return { success: false, error: 'Title is required for every uploaded image' };\n }\n\n if (!file || !(file instanceof File)) {\n return { success: false, error: 'No file provided' };\n }\n\n if (file.size > MAX_UPLOAD_SIZE) {\n return {\n success: false,\n error: `File too large. Maximum size is ${MAX_UPLOAD_SIZE / 1024 / 1024} MB`,\n };\n }\n\n const ext = file.name.split('.').pop()?.toLowerCase() || '';\n\n if (!config.mediaAllowedFormats.includes(ext)) {\n return {\n success: false,\n error: `File format \".${ext}\" is not allowed. Allowed: ${config.mediaAllowedFormats.join(', ')}`,\n };\n }\n\n const id = crypto.randomUUID();\n const physicalPath = `${config.mediaFolder}/${id}.${ext}`;\n const entryPath = mediaEntryPath(id);\n\n try {\n const buffer = Buffer.from(await file.arrayBuffer());\n const generateBlurRaw = formData.get('generateBlur');\n // Default ON — only the explicit string '0' or 'false' opts out.\n const generateBlur = !(generateBlurRaw === '0' || generateBlurRaw === 'false');\n const { width, height, blurDataURL } = await extractImageMetadata(buffer, { generateBlur });\n\n const fields: Record<string, unknown> = {\n title,\n // Stored filename = the actual on-disk filename (UUID-based), not the\n // user's upload name. Avoids leaking messy filenames like\n // \"Long file name.jpg\" into the UI; the physical file already lives at\n // `<mediaFolder>/<uuid>.<ext>` so this stays consistent.\n originalName: `${id}.${ext}`,\n extension: ext,\n folder,\n };\n if (width != null) fields.width = width;\n if (height != null) fields.height = height;\n if (blurDataURL != null) fields.blurDataURL = blurDataURL;\n\n const entry = {\n sys: { id, type: 'media' },\n fields,\n };\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubBinaryFile(physicalPath, buffer, `Upload media ${file.name}`, activeBranch);\n await saveGitHubFile(entryPath, `${JSON.stringify(entry, null, 2)}\\n`, `Add media entry ${id}`, activeBranch);\n\n // Write-through: add media entry to in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.mkdir(path.join(process.cwd(), config.mediaFolder), { recursive: true });\n await fsPromises.writeFile(path.join(process.cwd(), physicalPath), buffer);\n\n await fsPromises.mkdir(path.join(process.cwd(), mediaContentFolder()), { recursive: true });\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), `${JSON.stringify(entry, null, 2)}\\n`, 'utf8');\n }\n\n // Best-effort: index the new media entry so it appears in chat-agent search.\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return { success: true, id };\n } catch (e) {\n return { success: false, error: `Failed to upload file: ${getErrorMessage(e)}` };\n }\n};\n\n/**\n * Delete a media entry and its physical file.\n * Blocks deletion if the image is referenced by any content entry.\n */\nexport const deleteMedia = async (mediaId: string): Promise<ActionResult> => {\n const config = getConfig();\n const refs = await checkMediaReferences(mediaId);\n\n if (refs.length > 0) {\n return {\n success: false,\n error: `Cannot delete: image is used in ${refs.length} content entry(ies)`,\n };\n }\n\n const entryPath = mediaEntryPath(mediaId);\n let entry;\n\n try {\n entry = await getFile(entryPath);\n } catch (_e) {\n return { success: false, error: 'Media entry not found' };\n }\n\n const ext = entry?.fields?.extension || '';\n const physicalPath = `${config.mediaFolder}/${mediaId}.${ext}`;\n\n try {\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await deleteGitHubFile(physicalPath, `Delete media file ${mediaId}`, activeBranch);\n await deleteGitHubFile(entryPath, `Delete media entry ${mediaId}`, activeBranch);\n\n // Write-through: remove media entry from in-memory store\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'delete', path: entryPath });\n }\n } else {\n await fsPromises.unlink(path.join(process.cwd(), physicalPath));\n await fsPromises.unlink(path.join(process.cwd(), entryPath));\n }\n\n // Drop from the chat-agent search index.\n await syncMediaEmbeddingRemove(entryPath);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to delete media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Move a media entry to a different virtual folder.\n */\nexport const moveMedia = async (mediaId: string, newFolder: string): Promise<ActionResult> => {\n const entryPath = mediaEntryPath(mediaId);\n\n try {\n const entry = await getFile(entryPath);\n entry.fields.folder = newFolder || '/';\n\n const data = `${JSON.stringify(entry, null, 2)}\\n`;\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubFile(entryPath, data, `Move media ${mediaId} to ${newFolder}`, activeBranch);\n\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), data, 'utf8');\n }\n\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to move media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Update human-readable title on a media entry (required for accessibility / alt text).\n */\nexport const updateMediaMetadata = async (mediaId: string, title: string): Promise<ActionResult> => {\n const trimmed = title.trim();\n if (!trimmed) {\n return { success: false, error: 'Title is required' };\n }\n\n const entryPath = mediaEntryPath(mediaId);\n\n try {\n const entry = await getFile(entryPath);\n if (!entry?.fields || typeof entry.fields !== 'object') {\n return { success: false, error: 'Media entry not found' };\n }\n entry.fields.title = trimmed;\n\n const data = `${JSON.stringify(entry, null, 2)}\\n`;\n\n if (process.env.NODE_ENV === 'production' || isProductionMode()) {\n await assertFeatureBranchForWritesIfRequired();\n const activeBranch = (await cookies()).get('cms-active-branch')?.value;\n await saveGitHubFile(entryPath, data, `Update media title ${mediaId}`, activeBranch);\n\n if (activeBranch) {\n applyMutation(activeBranch, { type: 'upsert', path: entryPath, content: entry, sha: '' });\n }\n } else {\n await fsPromises.writeFile(path.join(process.cwd(), entryPath), data, 'utf8');\n }\n\n await syncMediaEmbeddingUpsert(entryPath, entry);\n\n return actionOk();\n } catch (e) {\n return actionErr(new Error(`Failed to update media: ${getErrorMessage(e)}`));\n }\n};\n\n/**\n * Check all content entries for image fields referencing this media ID.\n * Returns an array of file paths that reference the given media ID.\n */\nexport const checkMediaReferences = async (mediaId: string): Promise<string[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const references: string[] = [];\n\n for (const file of allFiles) {\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n\n if (!collection) continue;\n\n const imageFieldKeys = Object.keys(collection.fields).filter((k) => collection.fields[k].format === 'image');\n\n for (const field of imageFieldKeys) {\n if (content?.fields?.[field] === mediaId) {\n references.push(file);\n break;\n }\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return references;\n};\n"],"mappings":"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","names":["entries"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminErrorView.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminErrorView.tsx"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,2CAErG;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,KAA8B,EAC9B,QAAiB,EACjB,SAAuB,GACxB,EAAE,mBAAmB,2CAmCrB"}
1
+ {"version":3,"file":"AdminErrorView.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminErrorView.tsx"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,2CAErG;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,KAA8B,EAC9B,QAAiB,EACjB,SAAuB,GACxB,EAAE,mBAAmB,2CA6BrB"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import "../../chunk-B5LE2OEC.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import { Button } from "../../components/ui/button";
4
+ import { Button } from "../../components/ui";
5
5
  import { isContentSourceError, parseContentSourceFromMessage } from "../../lib/contentSourceError";
6
6
  function AdminError({ error, reset }) {
7
7
  return /* @__PURE__ */ jsx(AdminErrorView, { error, reset });
@@ -19,15 +19,15 @@ function AdminErrorView({
19
19
  const userMessage = (_a = fromInstance == null ? void 0 : fromInstance.userMessage) != null ? _a : fromMessage == null ? void 0 : fromMessage.userMessage;
20
20
  const code = (_b = fromInstance == null ? void 0 : fromInstance.code) != null ? _b : fromMessage == null ? void 0 : fromMessage.code;
21
21
  const isAvailability = code === "github_unavailable" || code === "github_rate_limit";
22
- return /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center bg-muted/20 p-6", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm", children: [
23
- /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold tracking-tight text-foreground", children: title }),
24
- userMessage ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: userMessage }) : /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: "An unexpected error occurred while loading this page." }),
25
- isAvailability ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "You can try again in a few minutes." }) : null,
26
- /* @__PURE__ */ jsxs("div", { className: "mt-5 flex flex-wrap gap-2", children: [
27
- /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", onClick: () => reset(), children: "Try again" }),
28
- /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", asChild: true, children: /* @__PURE__ */ jsx("a", { href: backHref, children: backLabel }) })
22
+ return /* @__PURE__ */ jsx("div", { className: "octo-admin-error", children: /* @__PURE__ */ jsxs("div", { className: "octo-admin-error__card", children: [
23
+ /* @__PURE__ */ jsx("h2", { className: "octo-admin-error__title", children: title }),
24
+ userMessage ? /* @__PURE__ */ jsx("p", { className: "octo-admin-error__msg", children: userMessage }) : /* @__PURE__ */ jsx("p", { className: "octo-admin-error__msg", children: "An unexpected error occurred while loading this page." }),
25
+ isAvailability ? /* @__PURE__ */ jsx("p", { className: "octo-admin-error__hint", children: "You can try again in a few minutes." }) : null,
26
+ /* @__PURE__ */ jsxs("div", { className: "octo-admin-error__actions", children: [
27
+ /* @__PURE__ */ jsx(Button, { type: "button", onClick: () => reset(), children: "Try again" }),
28
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", asChild: true, children: /* @__PURE__ */ jsx("a", { href: backHref, children: backLabel }) })
29
29
  ] }),
30
- error.digest ? /* @__PURE__ */ jsxs("p", { className: "mt-6 text-[11px] uppercase tracking-wide text-muted-foreground", children: [
30
+ error.digest ? /* @__PURE__ */ jsxs("p", { className: "octo-admin-error__digest", children: [
31
31
  "Reference: ",
32
32
  error.digest
33
33
  ] }) : null
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/AdminErrorView.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Button } from '../../components/ui/button';\nimport { isContentSourceError, parseContentSourceFromMessage } from '../../lib/contentSourceError';\n\n/**\n * Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's\n * standard `{ error, reset }` props and renders the shared `AdminErrorView`.\n *\n * Wired into the user app via a one-line re-export:\n * `export { AdminError as default } from 'octocms/admin'`\n */\nexport function AdminError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {\n return <AdminErrorView error={error} reset={reset} />;\n}\n\nexport type AdminErrorViewProps = {\n error: Error & { digest?: string };\n reset: () => void;\n /** Section title shown above the message. Defaults to \"Something went wrong\". */\n title?: string;\n /** Optional href for the secondary \"Back\" button. Defaults to /cms. */\n backHref?: string;\n /** Optional label for the secondary button. Defaults to \"Dashboard\". */\n backLabel?: string;\n};\n\n/**\n * Shared admin error view used by every per-segment `error.tsx` file under\n * `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root\n * error boundary in `src/app/error.tsx`, but inside the admin chrome.\n */\nexport function AdminErrorView({\n error,\n reset,\n title = 'Something went wrong',\n backHref = '/cms',\n backLabel = 'Dashboard',\n}: AdminErrorViewProps) {\n const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;\n const fromMessage = parseContentSourceFromMessage(error.message);\n const userMessage = fromInstance?.userMessage ?? fromMessage?.userMessage;\n const code = fromInstance?.code ?? fromMessage?.code;\n const isAvailability = code === 'github_unavailable' || code === 'github_rate_limit';\n\n return (\n <div className=\"flex flex-1 items-center justify-center bg-muted/20 p-6\">\n <div className=\"w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm\">\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">{title}</h2>\n {userMessage ? (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">{userMessage}</p>\n ) : (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">\n An unexpected error occurred while loading this page.\n </p>\n )}\n {isAvailability ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">You can try again in a few minutes.</p>\n ) : null}\n <div className=\"mt-5 flex flex-wrap gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => reset()}>\n Try again\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" asChild>\n <a href={backHref}>{backLabel}</a>\n </Button>\n </div>\n {error.digest ? (\n <p className=\"mt-6 text-[11px] uppercase tracking-wide text-muted-foreground\">Reference: {error.digest}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;AAeS,cA8CD,YA9CC;AAXT,SAAS,cAAc;AACvB,SAAS,sBAAsB,qCAAqC;AAS7D,SAAS,WAAW,EAAE,OAAO,MAAM,GAA8D;AACtG,SAAO,oBAAC,kBAAe,OAAc,OAAc;AACrD;AAkBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AACd,GAAwB;AAxCxB;AAyCE,QAAM,eAAe,qBAAqB,KAAK,IAAI,EAAE,aAAa,MAAM,aAAa,MAAM,MAAM,KAAK,IAAI;AAC1G,QAAM,cAAc,8BAA8B,MAAM,OAAO;AAC/D,QAAM,eAAc,kDAAc,gBAAd,YAA6B,2CAAa;AAC9D,QAAM,QAAO,kDAAc,SAAd,YAAsB,2CAAa;AAChD,QAAM,iBAAiB,SAAS,wBAAwB,SAAS;AAEjE,SACE,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+EACb;AAAA,wBAAC,QAAG,WAAU,0DAA0D,iBAAM;AAAA,IAC7E,cACC,oBAAC,OAAE,WAAU,gDAAgD,uBAAY,IAEzE,oBAAC,OAAE,WAAU,gDAA+C,mEAE5D;AAAA,IAED,iBACC,oBAAC,OAAE,WAAU,sCAAqC,iDAAmC,IACnF;AAAA,IACJ,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,MAAM,GAAG,uBAExD;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,WAAU,SAAO,MACvD,8BAAC,OAAE,MAAM,UAAW,qBAAU,GAChC;AAAA,OACF;AAAA,IACC,MAAM,SACL,qBAAC,OAAE,WAAU,kEAAiE;AAAA;AAAA,MAAY,MAAM;AAAA,OAAO,IACrG;AAAA,KACN,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/AdminErrorView.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Button } from '../../components/ui';\nimport { isContentSourceError, parseContentSourceFromMessage } from '../../lib/contentSourceError';\n\n/**\n * Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's\n * standard `{ error, reset }` props and renders the shared `AdminErrorView`.\n *\n * Wired into the user app via a one-line re-export:\n * `export { AdminError as default } from 'octocms/admin'`\n */\nexport function AdminError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {\n return <AdminErrorView error={error} reset={reset} />;\n}\n\nexport type AdminErrorViewProps = {\n error: Error & { digest?: string };\n reset: () => void;\n /** Section title shown above the message. Defaults to \"Something went wrong\". */\n title?: string;\n /** Optional href for the secondary \"Back\" button. Defaults to /cms. */\n backHref?: string;\n /** Optional label for the secondary button. Defaults to \"Dashboard\". */\n backLabel?: string;\n};\n\n/**\n * Shared admin error view used by every per-segment `error.tsx` file under\n * `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root\n * error boundary in `src/app/error.tsx`, but inside the admin chrome.\n */\nexport function AdminErrorView({\n error,\n reset,\n title = 'Something went wrong',\n backHref = '/cms',\n backLabel = 'Dashboard',\n}: AdminErrorViewProps) {\n const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;\n const fromMessage = parseContentSourceFromMessage(error.message);\n const userMessage = fromInstance?.userMessage ?? fromMessage?.userMessage;\n const code = fromInstance?.code ?? fromMessage?.code;\n const isAvailability = code === 'github_unavailable' || code === 'github_rate_limit';\n\n return (\n <div className=\"octo-admin-error\">\n <div className=\"octo-admin-error__card\">\n <h2 className=\"octo-admin-error__title\">{title}</h2>\n {userMessage ? (\n <p className=\"octo-admin-error__msg\">{userMessage}</p>\n ) : (\n <p className=\"octo-admin-error__msg\">An unexpected error occurred while loading this page.</p>\n )}\n {isAvailability ? <p className=\"octo-admin-error__hint\">You can try again in a few minutes.</p> : null}\n <div className=\"octo-admin-error__actions\">\n <Button type=\"button\" onClick={() => reset()}>\n Try again\n </Button>\n <Button type=\"button\" variant=\"outline\" asChild>\n <a href={backHref}>{backLabel}</a>\n </Button>\n </div>\n {error.digest ? <p className=\"octo-admin-error__digest\">Reference: {error.digest}</p> : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;AAeS,cA0CD,YA1CC;AAXT,SAAS,cAAc;AACvB,SAAS,sBAAsB,qCAAqC;AAS7D,SAAS,WAAW,EAAE,OAAO,MAAM,GAA8D;AACtG,SAAO,oBAAC,kBAAe,OAAc,OAAc;AACrD;AAkBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AACd,GAAwB;AAxCxB;AAyCE,QAAM,eAAe,qBAAqB,KAAK,IAAI,EAAE,aAAa,MAAM,aAAa,MAAM,MAAM,KAAK,IAAI;AAC1G,QAAM,cAAc,8BAA8B,MAAM,OAAO;AAC/D,QAAM,eAAc,kDAAc,gBAAd,YAA6B,2CAAa;AAC9D,QAAM,QAAO,kDAAc,SAAd,YAAsB,2CAAa;AAChD,QAAM,iBAAiB,SAAS,wBAAwB,SAAS;AAEjE,SACE,oBAAC,SAAI,WAAU,oBACb,+BAAC,SAAI,WAAU,0BACb;AAAA,wBAAC,QAAG,WAAU,2BAA2B,iBAAM;AAAA,IAC9C,cACC,oBAAC,OAAE,WAAU,yBAAyB,uBAAY,IAElD,oBAAC,OAAE,WAAU,yBAAwB,mEAAqD;AAAA,IAE3F,iBAAiB,oBAAC,OAAE,WAAU,0BAAyB,iDAAmC,IAAO;AAAA,IAClG,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAO,MAAK,UAAS,SAAS,MAAM,MAAM,GAAG,uBAE9C;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAO,MAC7C,8BAAC,OAAE,MAAM,UAAW,qBAAU,GAChC;AAAA,OACF;AAAA,IACC,MAAM,SAAS,qBAAC,OAAE,WAAU,4BAA2B;AAAA;AAAA,MAAY,MAAM;AAAA,OAAO,IAAO;AAAA,KAC1F,GACF;AAEJ;","names":[]}
@@ -1,5 +1,5 @@
1
- import '../../globals.css';
2
1
  import '@mdxeditor/editor/style.css';
2
+ import '../../globals.css';
3
3
  import type { Metadata } from 'next';
4
4
  import React from 'react';
5
5
  export declare const metadata: Metadata;
@@ -1 +1 @@
1
- {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AASxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;AA2BF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,QAAQ,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,4CAMhF,CAAC"}
1
+ {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AASxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;AA2BF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,QAAQ,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,4CAMhF,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import "../../globals.css";
4
3
  import "@mdxeditor/editor/style.css";
4
+ import "../../globals.css";
5
5
  import { Suspense } from "react";
6
6
  import { AdminBootstrapSkeleton } from "../../components/skeletons";
7
7
  import Provider from "../provider";
8
- import { Toaster } from "../../components/ui/toaster";
8
+ import { Toaster } from "../../components/ui";
9
9
  import Layout from "../../components/Layout/Layout";
10
10
  import { getThemeCookie } from "../theme/cookie";
11
11
  import { getConfig } from "../../lib/configStore";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '../../globals.css';\nimport '@mdxeditor/editor/style.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport { AdminBootstrapSkeleton } from '../../components/skeletons';\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui/toaster';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../theme/cookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n // No Suspense around `<Layout>{children}</Layout>` here: the catch-all page\n // suspends inside the client `Layout` `<main>` boundary so `TopHeader` stays\n // mounted. `AdminLayout`'s outer `<Suspense>` only wraps this async inner\n // (cookie read) and shows `AdminBootstrapSkeleton` until providers mount.\n return (\n <Provider config={config}>\n <Layout initialTheme={initialTheme}>{children}</Layout>\n <Toaster />\n </Provider>\n );\n}\n\n/**\n * Synchronous CMS layout shell.\n * Wraps `AdminLayoutInner` in `<Suspense>` so the async cookie read is\n * inside the boundary and does not block the rest of the page.\n */\nexport const AdminLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {\n return (\n <Suspense fallback={<AdminBootstrapSkeleton />}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </Suspense>\n );\n};\n"],"mappings":";AAkCI,SACE,KADF;AAlCJ,OAAO;AACP,OAAO;AAEP,SAAgB,gBAAgB;AAEhC,SAAS,8BAA8B;AACvC,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAEnB,MAAM,WAAqB;AAAA,EAChC,OAAO;AACT;AAWA,eAAe,iBAAiB,EAAE,SAAS,GAA4C;AACrF,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,SAAS,UAAU;AAMzB,SACE,qBAAC,YAAS,QACR;AAAA,wBAAC,UAAO,cAA6B,UAAS;AAAA,IAC9C,oBAAC,WAAQ;AAAA,KACX;AAEJ;AAOO,MAAM,cAAc,CAAC,EAAE,SAAS,MAA+C;AACpF,SACE,oBAAC,YAAS,UAAU,oBAAC,0BAAuB,GAC1C,8BAAC,oBAAkB,UAAS,GAC9B;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '@mdxeditor/editor/style.css';\nimport '../../globals.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport { AdminBootstrapSkeleton } from '../../components/skeletons';\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../theme/cookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n // No Suspense around `<Layout>{children}</Layout>` here: the catch-all page\n // suspends inside the client `Layout` `<main>` boundary so `TopHeader` stays\n // mounted. `AdminLayout`'s outer `<Suspense>` only wraps this async inner\n // (cookie read) and shows `AdminBootstrapSkeleton` until providers mount.\n return (\n <Provider config={config}>\n <Layout initialTheme={initialTheme}>{children}</Layout>\n <Toaster />\n </Provider>\n );\n}\n\n/**\n * Synchronous CMS layout shell.\n * Wraps `AdminLayoutInner` in `<Suspense>` so the async cookie read is\n * inside the boundary and does not block the rest of the page.\n */\nexport const AdminLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {\n return (\n <Suspense fallback={<AdminBootstrapSkeleton />}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </Suspense>\n );\n};\n"],"mappings":";AAkCI,SACE,KADF;AAlCJ,OAAO;AACP,OAAO;AAEP,SAAgB,gBAAgB;AAEhC,SAAS,8BAA8B;AACvC,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAEnB,MAAM,WAAqB;AAAA,EAChC,OAAO;AACT;AAWA,eAAe,iBAAiB,EAAE,SAAS,GAA4C;AACrF,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,SAAS,UAAU;AAMzB,SACE,qBAAC,YAAS,QACR;AAAA,wBAAC,UAAO,cAA6B,UAAS;AAAA,IAC9C,oBAAC,WAAQ;AAAA,KACX;AAEJ;AAOO,MAAM,cAAc,CAAC,EAAE,SAAS,MAA+C;AACpF,SACE,oBAAC,YAAS,UAAU,oBAAC,0BAAuB,GAC1C,8BAAC,oBAAkB,UAAS,GAC9B;AAEJ;","names":[]}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Server component wrapper for the chat page.
3
3
  *
4
- * Returns 404 (instead of rendering) when the chat agent isn't configured for
5
- * this deploy. The same gate is applied on the API route, so neither the UI
6
- * nor its data layer leak the feature's existence.
4
+ * Always renders `/cms/chat`. When the agent is not ready, the client shows an
5
+ * in-page setup guide (see `docs/chat-agent.md`). Chat API routes stay 404 until
6
+ * `isAgentEnabled` passes credentials are never sent to the browser.
7
7
  */
8
8
  export declare function ChatPage(): import("react/jsx-runtime").JSX.Element;
9
9
  //# sourceMappingURL=ChatPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ChatPage.tsx"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,QAAQ,4CAcvB"}
1
+ {"version":3,"file":"ChatPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ChatPage.tsx"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,wBAAgB,QAAQ,4CAevB"}
@@ -1,17 +1,20 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { notFound } from "next/navigation";
4
- import { ChatPage as ChatPageClient } from "../../components/Chat/ChatPage";
3
+ import dynamic from "next/dynamic";
5
4
  import { getAgentConfig } from "../../agent/configStore";
6
- import { isAgentEnabled } from "../../agent/featureFlag";
5
+ import { buildChatSetupInfo, isChatAgentReady } from "../../agent/chatSetup";
6
+ const ChatPageClient = dynamic(() => import("../../components/Chat/ChatPage"), {
7
+ loading: () => null
8
+ });
7
9
  function ChatPage() {
8
10
  const agentConfig = getAgentConfig();
9
- if (!agentConfig || !isAgentEnabled(agentConfig)) {
10
- notFound();
11
+ if (!isChatAgentReady(agentConfig)) {
12
+ return /* @__PURE__ */ jsx(ChatPageClient, { mode: "setup", setup: buildChatSetupInfo(agentConfig) });
11
13
  }
12
14
  return /* @__PURE__ */ jsx(
13
15
  ChatPageClient,
14
16
  {
17
+ mode: "ready",
15
18
  initialMeta: { provider: agentConfig.provider.type, model: agentConfig.provider.model },
16
19
  attachmentLimits: {
17
20
  maxAttachmentBytes: agentConfig.maxAttachmentBytes,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/ChatPage.tsx"],"sourcesContent":["import React from 'react';\nimport { notFound } from 'next/navigation';\n\nimport { ChatPage as ChatPageClient } from '../../components/Chat/ChatPage';\nimport { getAgentConfig } from '../../agent/configStore';\nimport { isAgentEnabled } from '../../agent/featureFlag';\n\n/**\n * Server component wrapper for the chat page.\n *\n * Returns 404 (instead of rendering) when the chat agent isn't configured for\n * this deploy. The same gate is applied on the API route, so neither the UI\n * nor its data layer leak the feature's existence.\n */\nexport function ChatPage() {\n const agentConfig = getAgentConfig();\n if (!agentConfig || !isAgentEnabled(agentConfig)) {\n notFound();\n }\n return (\n <ChatPageClient\n initialMeta={{ provider: agentConfig.provider.type, model: agentConfig.provider.model }}\n attachmentLimits={{\n maxAttachmentBytes: agentConfig.maxAttachmentBytes,\n maxAttachmentsPerTurn: agentConfig.maxAttachmentsPerTurn,\n }}\n />\n );\n}\n"],"mappings":";AAoBI;AAnBJ,SAAS,gBAAgB;AAEzB,SAAS,YAAY,sBAAsB;AAC3C,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AASxB,SAAS,WAAW;AACzB,QAAM,cAAc,eAAe;AACnC,MAAI,CAAC,eAAe,CAAC,eAAe,WAAW,GAAG;AAChD,aAAS;AAAA,EACX;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa,EAAE,UAAU,YAAY,SAAS,MAAM,OAAO,YAAY,SAAS,MAAM;AAAA,MACtF,kBAAkB;AAAA,QAChB,oBAAoB,YAAY;AAAA,QAChC,uBAAuB,YAAY;AAAA,MACrC;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/ChatPage.tsx"],"sourcesContent":["import React from 'react';\nimport dynamic from 'next/dynamic';\n\nimport { getAgentConfig } from '../../agent/configStore';\nimport { buildChatSetupInfo, isChatAgentReady } from '../../agent/chatSetup';\n\nconst ChatPageClient = dynamic(() => import('../../components/Chat/ChatPage'), {\n loading: () => null,\n});\n\n/**\n * Server component wrapper for the chat page.\n *\n * Always renders `/cms/chat`. When the agent is not ready, the client shows an\n * in-page setup guide (see `docs/chat-agent.md`). Chat API routes stay 404 until\n * `isAgentEnabled` passes credentials are never sent to the browser.\n */\nexport function ChatPage() {\n const agentConfig = getAgentConfig();\n if (!isChatAgentReady(agentConfig)) {\n return <ChatPageClient mode=\"setup\" setup={buildChatSetupInfo(agentConfig)} />;\n }\n return (\n <ChatPageClient\n mode=\"ready\"\n initialMeta={{ provider: agentConfig!.provider.type, model: agentConfig!.provider.model }}\n attachmentLimits={{\n maxAttachmentBytes: agentConfig!.maxAttachmentBytes,\n maxAttachmentsPerTurn: agentConfig!.maxAttachmentsPerTurn,\n }}\n />\n );\n}\n"],"mappings":";AAoBW;AAnBX,OAAO,aAAa;AAEpB,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB,wBAAwB;AAErD,MAAM,iBAAiB,QAAQ,MAAM,OAAO,gCAAgC,GAAG;AAAA,EAC7E,SAAS,MAAM;AACjB,CAAC;AASM,SAAS,WAAW;AACzB,QAAM,cAAc,eAAe;AACnC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,WAAO,oBAAC,kBAAe,MAAK,SAAQ,OAAO,mBAAmB,WAAW,GAAG;AAAA,EAC9E;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa,EAAE,UAAU,YAAa,SAAS,MAAM,OAAO,YAAa,SAAS,MAAM;AAAA,MACxF,kBAAkB;AAAA,QAChB,oBAAoB,YAAa;AAAA,QACjC,uBAAuB,YAAa;AAAA,MACtC;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAQA,wBAAsB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DAkBrF"}
1
+ {"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAaA,wBAAsB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DAkBrF"}
@@ -1,10 +1,14 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { redirect } from "next/navigation";
4
+ import dynamic from "next/dynamic";
4
5
  import { getServerSession } from "next-auth";
5
- import DashboardContent from "../../components/Dashboard/DashboardContent";
6
+ import { DashboardCollectionPageSkeleton } from "../../components/Dashboard/skeletons/DashboardCollectionPageSkeleton";
6
7
  import { getConfig } from "../../lib/configStore";
7
8
  import { authOptions } from "../auth";
9
+ const DashboardContent = dynamic(() => import("../../components/Dashboard/DashboardContent"), {
10
+ loading: () => /* @__PURE__ */ jsx(DashboardCollectionPageSkeleton, {})
11
+ });
8
12
  async function CollectionPage({ params }) {
9
13
  const session = await getServerSession(authOptions);
10
14
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport DashboardContent from '../../components/Dashboard/DashboardContent';\nimport { getConfig } from '../../lib/configStore';\nimport { authOptions } from '../auth';\n\nexport async function CollectionPage({ params }: { params: Promise<{ type: string }> }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const { type } = await params;\n const collections = Object.keys(getConfig().collections);\n\n if (!type) {\n redirect(`/cms/content`);\n }\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return <DashboardContent selectedType={type} />;\n}\n"],"mappings":";AAyBS;AAzBT,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAGjC,OAAO,sBAAsB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,eAAsB,eAAe,EAAE,OAAO,GAA0C;AACtF,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AAEvD,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AACA,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SAAO,oBAAC,oBAAiB,cAAc,MAAM;AAC/C;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport dynamic from 'next/dynamic';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport { DashboardCollectionPageSkeleton } from '../../components/Dashboard/skeletons/DashboardCollectionPageSkeleton';\nimport { getConfig } from '../../lib/configStore';\nimport { authOptions } from '../auth';\n\nconst DashboardContent = dynamic(() => import('../../components/Dashboard/DashboardContent'), {\n loading: () => <DashboardCollectionPageSkeleton />,\n});\n\nexport async function CollectionPage({ params }: { params: Promise<{ type: string }> }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const { type } = await params;\n const collections = Object.keys(getConfig().collections);\n\n if (!type) {\n redirect(`/cms/content`);\n }\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return <DashboardContent selectedType={type} />;\n}\n"],"mappings":";AAUiB;AAVjB,SAAS,gBAAgB;AACzB,OAAO,aAAa;AACpB,SAAS,wBAAwB;AAGjC,SAAS,uCAAuC;AAChD,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,MAAM,mBAAmB,QAAQ,MAAM,OAAO,6CAA6C,GAAG;AAAA,EAC5F,SAAS,MAAM,oBAAC,mCAAgC;AAClD,CAAC;AAED,eAAsB,eAAe,EAAE,OAAO,GAA0C;AACtF,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AAEvD,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AACA,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SAAO,oBAAC,oBAAiB,cAAc,MAAM;AAC/C;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAsB,gBAAgB,4DAQrC"}
1
+ {"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAsB,gBAAgB,4DAQrC"}
@@ -1,8 +1,12 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
+ import dynamic from "next/dynamic";
3
4
  import { getServerSession } from "next-auth";
4
- import ContentModelList from "../../components/ContentModel/ContentModelList";
5
+ import { ContentModelListPageSkeleton } from "../../components/ContentModel/skeletons/ContentModelListPageSkeleton";
5
6
  import { authOptions } from "../auth";
7
+ const ContentModelList = dynamic(() => import("../../components/ContentModel/ContentModelList"), {
8
+ loading: () => /* @__PURE__ */ jsx(ContentModelListPageSkeleton, {})
9
+ });
6
10
  async function ContentModelPage() {
7
11
  const session = await getServerSession(authOptions);
8
12
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport ContentModelList from '../../components/ContentModel/ContentModelList';\nimport { authOptions } from '../auth';\n\n/**\n * Auth-gated thin shell. `ContentModelList` fetches its own data via\n * `useSchema` + `useEntryList` and renders block-level skeletons while\n * pending. See `octocms/admin/query/hooks/useSchema.ts`.\n */\nexport async function ContentModelPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return <ContentModelList />;\n}\n"],"mappings":";AAkBS;AAjBT,SAAS,wBAAwB;AAEjC,OAAO,sBAAsB;AAC7B,SAAS,mBAAmB;AAO5B,eAAsB,mBAAmB;AACvC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,oBAAiB;AAC3B;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React from 'react';\nimport dynamic from 'next/dynamic';\nimport { getServerSession } from 'next-auth';\n\nimport { ContentModelListPageSkeleton } from '../../components/ContentModel/skeletons/ContentModelListPageSkeleton';\nimport { authOptions } from '../auth';\n\nconst ContentModelList = dynamic(() => import('../../components/ContentModel/ContentModelList'), {\n loading: () => <ContentModelListPageSkeleton />,\n});\n\n/**\n * Auth-gated thin shell. `ContentModelList` fetches its own data via\n * `useSchema` + `useEntryList` and renders block-level skeletons while\n * pending. See `octocms/admin/query/hooks/useSchema.ts`.\n */\nexport async function ContentModelPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return <ContentModelList />;\n}\n"],"mappings":";AAQiB;AAPjB,OAAO,aAAa;AACpB,SAAS,wBAAwB;AAEjC,SAAS,oCAAoC;AAC7C,SAAS,mBAAmB;AAE5B,MAAM,mBAAmB,QAAQ,MAAM,OAAO,gDAAgD,GAAG;AAAA,EAC/F,SAAS,MAAM,oBAAC,gCAA6B;AAC/C,CAAC;AAOD,eAAsB,mBAAmB;AACvC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,oBAAiB;AAC3B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ContentPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentPage.tsx"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,4DAQhC"}
1
+ {"version":3,"file":"ContentPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentPage.tsx"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,4DAQhC"}
@@ -1,8 +1,12 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
+ import dynamic from "next/dynamic";
3
4
  import { getServerSession } from "next-auth";
4
- import DashboardContent from "../../components/Dashboard/DashboardContent";
5
+ import { DashboardPageSkeleton } from "../../components/Dashboard/skeletons/DashboardPageSkeleton";
5
6
  import { authOptions } from "../auth";
7
+ const DashboardContent = dynamic(() => import("../../components/Dashboard/DashboardContent"), {
8
+ loading: () => /* @__PURE__ */ jsx(DashboardPageSkeleton, {})
9
+ });
6
10
  async function ContentPage() {
7
11
  const session = await getServerSession(authOptions);
8
12
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/ContentPage.tsx"],"sourcesContent":["import React from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport DashboardContent from '../../components/Dashboard/DashboardContent';\nimport { authOptions } from '../auth';\n\nexport async function ContentPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return <DashboardContent />;\n}\n"],"mappings":";AAaS;AAZT,SAAS,wBAAwB;AAEjC,OAAO,sBAAsB;AAC7B,SAAS,mBAAmB;AAE5B,eAAsB,cAAc;AAClC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,oBAAiB;AAC3B;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/ContentPage.tsx"],"sourcesContent":["import React from 'react';\nimport dynamic from 'next/dynamic';\nimport { getServerSession } from 'next-auth';\n\nimport { DashboardPageSkeleton } from '../../components/Dashboard/skeletons/DashboardPageSkeleton';\nimport { authOptions } from '../auth';\n\nconst DashboardContent = dynamic(() => import('../../components/Dashboard/DashboardContent'), {\n loading: () => <DashboardPageSkeleton />,\n});\n\nexport async function ContentPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return <DashboardContent />;\n}\n"],"mappings":";AAQiB;AAPjB,OAAO,aAAa;AACpB,SAAS,wBAAwB;AAEjC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAE5B,MAAM,mBAAmB,QAAQ,MAAM,OAAO,6CAA6C,GAAG;AAAA,EAC5F,SAAS,MAAM,oBAAC,yBAAsB;AACxC,CAAC;AAED,eAAsB,cAAc;AAClC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,oBAAiB;AAC3B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ContentTypePage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentTypePage.tsx"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,2DAY/D"}
1
+ {"version":3,"file":"ContentTypePage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentTypePage.tsx"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,2DAY/D"}
@@ -1,9 +1,13 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
+ import dynamic from "next/dynamic";
3
4
  import { getServerSession } from "next-auth";
4
- import ContentTypeDetail from "../../components/ContentModel/ContentTypeDetail";
5
- import { ErrorBoundary } from "../../components/ErrorBoundary";
5
+ import { ContentTypeDetailPageSkeleton } from "../../components/ContentModel/skeletons/ContentTypeDetailPageSkeleton";
6
+ import { ErrorBoundary } from "../../components/ErrorBoundary/ErrorBoundary";
6
7
  import { authOptions } from "../auth";
8
+ const ContentTypeDetail = dynamic(() => import("../../components/ContentModel/ContentTypeDetail"), {
9
+ loading: () => /* @__PURE__ */ jsx(ContentTypeDetailPageSkeleton, {})
10
+ });
7
11
  async function ContentTypePage({ type }) {
8
12
  const session = await getServerSession(authOptions);
9
13
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/ContentTypePage.tsx"],"sourcesContent":["import React from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport ContentTypeDetail from '../../components/ContentModel/ContentTypeDetail';\nimport { ErrorBoundary } from '../../components/ErrorBoundary';\nimport { authOptions } from '../auth';\n\n/**\n * Auth-gated thin shell. `ContentTypeDetail` fetches schema + entries via\n * `useSchema` + `useEntryList` and renders block skeletons while pending.\n */\nexport async function ContentTypePage({ type }: { type: string }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return (\n <ErrorBoundary label=\"content type editor\" resetKeys={[type]}>\n <ContentTypeDetail type={type} />\n </ErrorBoundary>\n );\n}\n"],"mappings":";AAoBM;AAnBN,SAAS,wBAAwB;AAEjC,OAAO,uBAAuB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAM5B,eAAsB,gBAAgB,EAAE,KAAK,GAAqB;AAChE,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,iBAAc,OAAM,uBAAsB,WAAW,CAAC,IAAI,GACzD,8BAAC,qBAAkB,MAAY,GACjC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/ContentTypePage.tsx"],"sourcesContent":["import React from 'react';\nimport dynamic from 'next/dynamic';\nimport { getServerSession } from 'next-auth';\n\nimport { ContentTypeDetailPageSkeleton } from '../../components/ContentModel/skeletons/ContentTypeDetailPageSkeleton';\nimport { ErrorBoundary } from '../../components/ErrorBoundary/ErrorBoundary';\nimport { authOptions } from '../auth';\n\nconst ContentTypeDetail = dynamic(() => import('../../components/ContentModel/ContentTypeDetail'), {\n loading: () => <ContentTypeDetailPageSkeleton />,\n});\n\n/**\n * Auth-gated thin shell. `ContentTypeDetail` fetches schema + entries via\n * `useSchema` + `useEntryList` and renders block skeletons while pending.\n */\nexport async function ContentTypePage({ type }: { type: string }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n return (\n <ErrorBoundary label=\"content type editor\" resetKeys={[type]}>\n <ContentTypeDetail type={type} />\n </ErrorBoundary>\n );\n}\n"],"mappings":";AASiB;AARjB,OAAO,aAAa;AACpB,SAAS,wBAAwB;AAEjC,SAAS,qCAAqC;AAC9C,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAE5B,MAAM,oBAAoB,QAAQ,MAAM,OAAO,iDAAiD,GAAG;AAAA,EACjG,SAAS,MAAM,oBAAC,iCAA8B;AAChD,CAAC;AAMD,eAAsB,gBAAgB,EAAE,KAAK,GAAqB;AAChE,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,iBAAc,OAAM,uBAAsB,WAAW,CAAC,IAAI,GACzD,8BAAC,qBAAkB,MAAY,GACjC;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"EntryPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/EntryPage.tsx"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DA8B5F"}
1
+ {"version":3,"file":"EntryPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/EntryPage.tsx"],"names":[],"mappings":"AAcA;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DA8B5F"}
@@ -1,11 +1,15 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { redirect } from "next/navigation";
4
+ import dynamic from "next/dynamic";
4
5
  import { getServerSession } from "next-auth";
5
- import EditPost from "../../components/EditPost/EditPost";
6
+ import { EditPostPageSkeleton } from "../../components/EditPost/skeletons/EditPostPageSkeleton";
6
7
  import { FileContextProvider } from "../../hooks/useFileState";
7
8
  import { getConfig } from "../../lib/configStore";
8
9
  import { authOptions } from "../auth";
10
+ const EditPost = dynamic(() => import("../../components/EditPost/EditPost"), {
11
+ loading: () => /* @__PURE__ */ jsx(EditPostPageSkeleton, {})
12
+ });
9
13
  async function EntryPage({ params }) {
10
14
  const { type, id } = await params;
11
15
  if (!type) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/EntryPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport EditPost from '../../components/EditPost/EditPost';\nimport { FileContextProvider } from '../../hooks/useFileState';\nimport { getConfig } from '../../lib/configStore';\nimport { authOptions } from '../auth';\n\n/**\n * Auth-gated thin shell. `EditPost` resolves the entry's file path from\n * `type + id`, fetches it via `useEntry`, and renders block-level skeletons\n * (form + sidebar) while pending. Not-found is handled in-component so\n * navigation between entries stays inside the cached SPA.\n *\n * `FileContextProvider` is preserved as a UI-state bus (selectedFile bag)\n * — it no longer carries pre-fetched data.\n */\nexport async function EntryPage({ params }: { params: Promise<{ type: string; id: string }> }) {\n const { type, id } = await params;\n\n if (!type) {\n redirect(`/cms/content`);\n }\n\n // Media entries have a dedicated full-page editor at /cms/media/[id].\n if (type === 'media') {\n redirect(`/cms/media/${id}`);\n }\n\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n // Validate type is a known collection — surfaces invalid URLs as a redirect\n // rather than confusing client-side empty state.\n const collections = Object.keys(getConfig().collections);\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return (\n <FileContextProvider defaultType={type}>\n <EditPost type={type} id={id} />\n </FileContextProvider>\n );\n}\n"],"mappings":";AA6CM;AA7CN,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAGjC,OAAO,cAAc;AACrB,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAW5B,eAAsB,UAAU,EAAE,OAAO,GAAsD;AAC7F,QAAM,EAAE,MAAM,GAAG,IAAI,MAAM;AAE3B,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AAGA,MAAI,SAAS,SAAS;AACpB,aAAS,cAAc,EAAE,EAAE;AAAA,EAC7B;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAIA,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AACvD,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SACE,oBAAC,uBAAoB,aAAa,MAChC,8BAAC,YAAS,MAAY,IAAQ,GAChC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/EntryPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport dynamic from 'next/dynamic';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport { EditPostPageSkeleton } from '../../components/EditPost/skeletons/EditPostPageSkeleton';\nimport { FileContextProvider } from '../../hooks/useFileState';\nimport { getConfig } from '../../lib/configStore';\nimport { authOptions } from '../auth';\n\nconst EditPost = dynamic(() => import('../../components/EditPost/EditPost'), {\n loading: () => <EditPostPageSkeleton />,\n});\n\n/**\n * Auth-gated thin shell. `EditPost` resolves the entry's file path from\n * `type + id`, fetches it via `useEntry`, and renders block-level skeletons\n * (form + sidebar) while pending. Not-found is handled in-component so\n * navigation between entries stays inside the cached SPA.\n *\n * `FileContextProvider` is preserved as a UI-state bus (selectedFile bag)\n * — it no longer carries pre-fetched data.\n */\nexport async function EntryPage({ params }: { params: Promise<{ type: string; id: string }> }) {\n const { type, id } = await params;\n\n if (!type) {\n redirect(`/cms/content`);\n }\n\n // Media entries have a dedicated full-page editor at /cms/media/[id].\n if (type === 'media') {\n redirect(`/cms/media/${id}`);\n }\n\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n // Validate type is a known collection — surfaces invalid URLs as a redirect\n // rather than confusing client-side empty state.\n const collections = Object.keys(getConfig().collections);\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return (\n <FileContextProvider defaultType={type}>\n <EditPost type={type} id={id} />\n </FileContextProvider>\n );\n}\n"],"mappings":";AAWiB;AAXjB,SAAS,gBAAgB;AACzB,OAAO,aAAa;AACpB,SAAS,wBAAwB;AAGjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,MAAM,WAAW,QAAQ,MAAM,OAAO,oCAAoC,GAAG;AAAA,EAC3E,SAAS,MAAM,oBAAC,wBAAqB;AACvC,CAAC;AAWD,eAAsB,UAAU,EAAE,OAAO,GAAsD;AAC7F,QAAM,EAAE,MAAM,GAAG,IAAI,MAAM;AAE3B,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AAGA,MAAI,SAAS,SAAS;AACpB,aAAS,cAAc,EAAE,EAAE;AAAA,EAC7B;AAEA,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAIA,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AACvD,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SACE,oBAAC,uBAAoB,aAAa,MAChC,8BAAC,YAAS,MAAY,IAAQ,GAChC;AAEJ;","names":[]}