octocms 0.4.13 → 0.4.17
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.
- package/README.md +1 -1
- package/dist/admin/AdminApp.d.ts +1 -1
- package/dist/admin/AdminApp.js +2 -2
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/actions/agent.d.ts +3 -3
- package/dist/admin/actions/agent.js.map +1 -1
- package/dist/admin/actions/media.d.ts.map +1 -1
- package/dist/admin/actions/media.js +3 -1
- package/dist/admin/actions/media.js.map +1 -1
- package/dist/admin/pages/AdminErrorView.d.ts.map +1 -1
- package/dist/admin/pages/AdminErrorView.js +9 -9
- package/dist/admin/pages/AdminErrorView.js.map +1 -1
- package/dist/admin/pages/AdminLayout.d.ts +1 -1
- package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
- package/dist/admin/pages/AdminLayout.js +2 -2
- package/dist/admin/pages/AdminLayout.js.map +1 -1
- package/dist/admin/pages/ChatPage.d.ts +3 -3
- package/dist/admin/pages/ChatPage.d.ts.map +1 -1
- package/dist/admin/pages/ChatPage.js +8 -5
- package/dist/admin/pages/ChatPage.js.map +1 -1
- package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
- package/dist/admin/pages/CollectionPage.js +5 -1
- package/dist/admin/pages/CollectionPage.js.map +1 -1
- package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
- package/dist/admin/pages/ContentModelPage.js +5 -1
- package/dist/admin/pages/ContentModelPage.js.map +1 -1
- package/dist/admin/pages/ContentPage.d.ts.map +1 -1
- package/dist/admin/pages/ContentPage.js +5 -1
- package/dist/admin/pages/ContentPage.js.map +1 -1
- package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
- package/dist/admin/pages/ContentTypePage.js +6 -2
- package/dist/admin/pages/ContentTypePage.js.map +1 -1
- package/dist/admin/pages/EntryPage.d.ts.map +1 -1
- package/dist/admin/pages/EntryPage.js +5 -1
- package/dist/admin/pages/EntryPage.js.map +1 -1
- package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -1
- package/dist/admin/pages/MediaAssetPage.js +6 -2
- package/dist/admin/pages/MediaAssetPage.js.map +1 -1
- package/dist/admin/pages/MediaPage.d.ts.map +1 -1
- package/dist/admin/pages/MediaPage.js +6 -2
- package/dist/admin/pages/MediaPage.js.map +1 -1
- package/dist/admin/theme/toggle.d.ts.map +1 -1
- package/dist/admin/theme/toggle.js +27 -27
- package/dist/admin/theme/toggle.js.map +1 -1
- package/dist/agent/chatSetup.d.ts +19 -0
- package/dist/agent/chatSetup.d.ts.map +1 -0
- package/dist/agent/chatSetup.js +119 -0
- package/dist/agent/chatSetup.js.map +1 -0
- package/dist/agent/featureFlag.d.ts +3 -3
- package/dist/agent/featureFlag.js.map +1 -1
- package/dist/agent/index.cjs +75 -5309
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agentDocs-6LQD3JUN.js +54 -0
- package/dist/agentDocs-6LQD3JUN.js.map +1 -0
- package/dist/chunk-CIKOAIJP.js +7 -0
- package/dist/{chunk-NAHOP7TG.js.map → chunk-CIKOAIJP.js.map} +1 -1
- package/dist/{chunk-DCDFWNC6.js → chunk-FZROCUU3.js} +17 -13
- package/dist/{chunk-DCDFWNC6.js.map → chunk-FZROCUU3.js.map} +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/cli/lib/agentDocs.d.ts +5 -4
- package/dist/cli/lib/agentDocs.d.ts.map +1 -1
- package/dist/cli/lib/agentDocs.js +40 -105
- package/dist/cli/lib/agentDocs.js.map +1 -1
- package/dist/cli/lib/codegen.d.ts.map +1 -1
- package/dist/cli/lib/codegen.js +9 -5
- package/dist/cli/lib/codegen.js.map +1 -1
- package/dist/cli/lib/templates.js +16 -12
- package/dist/cli/lib/templates.js.map +1 -1
- package/dist/components/Chat/ChatAgentSetup.d.ts +7 -0
- package/dist/components/Chat/ChatAgentSetup.d.ts.map +1 -0
- package/dist/components/Chat/ChatAgentSetup.js +37 -0
- package/dist/components/Chat/ChatAgentSetup.js.map +1 -0
- package/dist/components/Chat/ChatPage.d.ts +6 -1
- package/dist/components/Chat/ChatPage.d.ts.map +1 -1
- package/dist/components/Chat/ChatPage.js +123 -128
- package/dist/components/Chat/ChatPage.js.map +1 -1
- package/dist/components/Chat/ChatSidebar.d.ts +10 -0
- package/dist/components/Chat/ChatSidebar.d.ts.map +1 -0
- package/dist/components/Chat/ChatSidebar.js +45 -0
- package/dist/components/Chat/ChatSidebar.js.map +1 -0
- package/dist/components/Chat/Composer.d.ts.map +1 -1
- package/dist/components/Chat/Composer.js +28 -45
- package/dist/components/Chat/Composer.js.map +1 -1
- package/dist/components/Chat/Message.d.ts.map +1 -1
- package/dist/components/Chat/Message.js +40 -39
- package/dist/components/Chat/Message.js.map +1 -1
- package/dist/components/Chat/ProposalCard.d.ts.map +1 -1
- package/dist/components/Chat/ProposalCard.js +56 -67
- package/dist/components/Chat/ProposalCard.js.map +1 -1
- package/dist/components/Chat/ToolCallCard.d.ts.map +1 -1
- package/dist/components/Chat/ToolCallCard.js +29 -38
- package/dist/components/Chat/ToolCallCard.js.map +1 -1
- package/dist/components/Chat/chatStorage.d.ts +64 -0
- package/dist/components/Chat/chatStorage.d.ts.map +1 -0
- package/dist/components/Chat/chatStorage.js +154 -0
- package/dist/components/Chat/chatStorage.js.map +1 -0
- package/dist/components/Chat/useChatHistory.d.ts +12 -0
- package/dist/components/Chat/useChatHistory.d.ts.map +1 -0
- package/dist/components/Chat/useChatHistory.js +196 -0
- package/dist/components/Chat/useChatHistory.js.map +1 -0
- package/dist/components/Chat/useChatStream.d.ts +6 -0
- package/dist/components/Chat/useChatStream.d.ts.map +1 -1
- package/dist/components/Chat/useChatStream.js +31 -2
- package/dist/components/Chat/useChatStream.js.map +1 -1
- package/dist/components/CommandK/CommandK.d.ts +1 -1
- package/dist/components/CommandK/CommandK.d.ts.map +1 -1
- package/dist/components/CommandK/CommandK.js +100 -116
- package/dist/components/CommandK/CommandK.js.map +1 -1
- package/dist/components/CommandK/parts.d.ts.map +1 -1
- package/dist/components/CommandK/parts.js +9 -11
- package/dist/components/CommandK/parts.js.map +1 -1
- package/dist/components/ContentModel/ConditionalBranchesEditor.d.ts.map +1 -1
- package/dist/components/ContentModel/ConditionalBranchesEditor.js +40 -45
- package/dist/components/ContentModel/ConditionalBranchesEditor.js.map +1 -1
- package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
- package/dist/components/ContentModel/ContentModelList.js +65 -80
- package/dist/components/ContentModel/ContentModelList.js.map +1 -1
- package/dist/components/ContentModel/ContentTypeDetail.d.ts.map +1 -1
- package/dist/components/ContentModel/ContentTypeDetail.js +253 -280
- package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
- package/dist/components/ContentModel/CreateContentTypeDialog.d.ts.map +1 -1
- package/dist/components/ContentModel/CreateContentTypeDialog.js +42 -30
- package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts.map +1 -1
- package/dist/components/ContentModel/DeleteContentTypeDialog.js +14 -15
- package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/DeleteFieldDialog.d.ts.map +1 -1
- package/dist/components/ContentModel/DeleteFieldDialog.js +27 -20
- package/dist/components/ContentModel/DeleteFieldDialog.js.map +1 -1
- package/dist/components/ContentModel/EditContentTypeDialog.d.ts.map +1 -1
- package/dist/components/ContentModel/EditContentTypeDialog.js +46 -34
- package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
- package/dist/components/ContentModel/FieldDialog.d.ts.map +1 -1
- package/dist/components/ContentModel/FieldDialog.js +95 -84
- package/dist/components/ContentModel/FieldDialog.js.map +1 -1
- package/dist/components/ContentModel/RichTextOptionsEditor.d.ts.map +1 -1
- package/dist/components/ContentModel/RichTextOptionsEditor.js +90 -81
- package/dist/components/ContentModel/RichTextOptionsEditor.js.map +1 -1
- package/dist/components/ContentModel/SchemaImpactList.d.ts.map +1 -1
- package/dist/components/ContentModel/SchemaImpactList.js +19 -36
- package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
- package/dist/components/ContentModel/SchemaOptionFieldInput.d.ts.map +1 -1
- package/dist/components/ContentModel/SchemaOptionFieldInput.js +63 -84
- package/dist/components/ContentModel/SchemaOptionFieldInput.js.map +1 -1
- package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts +3 -0
- package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js +15 -0
- package/dist/components/ContentModel/skeletons/ContentModelListPageSkeleton.js.map +1 -0
- package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts +3 -0
- package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js +11 -0
- package/dist/components/ContentModel/skeletons/ContentTypeDetailPageSkeleton.js.map +1 -0
- package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js +3 -3
- package/dist/components/ContentModel/skeletons/FieldTableSkeleton.js.map +1 -1
- package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.d.ts.map +1 -1
- package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js +4 -12
- package/dist/components/ContentModel/skeletons/SchemaTableSkeleton.js.map +1 -1
- package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
- package/dist/components/Dashboard/DashboardContent.js +87 -114
- package/dist/components/Dashboard/DashboardContent.js.map +1 -1
- package/dist/components/Dashboard/RecentPullRequests.d.ts.map +1 -1
- package/dist/components/Dashboard/RecentPullRequests.js +33 -45
- package/dist/components/Dashboard/RecentPullRequests.js.map +1 -1
- package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts +2 -7
- package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.d.ts.map +1 -1
- package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js +5 -20
- package/dist/components/Dashboard/skeletons/ContentPageChromeSkeleton.js.map +1 -1
- package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js +9 -9
- package/dist/components/Dashboard/skeletons/ContentTableSkeleton.js.map +1 -1
- package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts +3 -0
- package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js +10 -0
- package/dist/components/Dashboard/skeletons/DashboardCollectionPageSkeleton.js.map +1 -0
- package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts +9 -0
- package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js +16 -0
- package/dist/components/Dashboard/skeletons/DashboardPageSkeleton.js.map +1 -0
- package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.d.ts.map +1 -1
- package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js +7 -18
- package/dist/components/Dashboard/skeletons/LeftPanelSkeleton.js.map +1 -1
- package/dist/components/DiffView/DiffHunk.d.ts.map +1 -1
- package/dist/components/DiffView/DiffHunk.js +12 -40
- package/dist/components/DiffView/DiffHunk.js.map +1 -1
- package/dist/components/DiffView/DiffView.d.ts.map +1 -1
- package/dist/components/DiffView/DiffView.js +33 -52
- package/dist/components/DiffView/DiffView.js.map +1 -1
- package/dist/components/EditPost/EditPost.d.ts.map +1 -1
- package/dist/components/EditPost/EditPost.js +139 -200
- package/dist/components/EditPost/EditPost.js.map +1 -1
- package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts +3 -0
- package/dist/components/EditPost/skeletons/EditPostPageSkeleton.d.ts.map +1 -0
- package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js +21 -0
- package/dist/components/EditPost/skeletons/EditPostPageSkeleton.js.map +1 -0
- package/dist/components/EditPost/skeletons/EntryFormSkeleton.d.ts.map +1 -1
- package/dist/components/EditPost/skeletons/EntryFormSkeleton.js +1 -9
- package/dist/components/EditPost/skeletons/EntryFormSkeleton.js.map +1 -1
- package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.d.ts.map +1 -1
- package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js +12 -20
- package/dist/components/EditPost/skeletons/EntrySidebarSkeleton.js.map +1 -1
- package/dist/components/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/{ErrorBoundary.js → ErrorBoundary/ErrorBoundary.js} +15 -21
- package/dist/components/ErrorBoundary/ErrorBoundary.js.map +1 -0
- package/dist/components/HistorySection/HistorySection.d.ts.map +1 -1
- package/dist/components/HistorySection/HistorySection.js +23 -42
- package/dist/components/HistorySection/HistorySection.js.map +1 -1
- package/dist/components/InlineEntryEditor/InlineEntryEditor.d.ts.map +1 -1
- package/dist/components/InlineEntryEditor/InlineEntryEditor.js +120 -123
- package/dist/components/InlineEntryEditor/InlineEntryEditor.js.map +1 -1
- package/dist/components/Layout/BranchSelectorDialog.d.ts +9 -0
- package/dist/components/Layout/BranchSelectorDialog.d.ts.map +1 -0
- package/dist/components/Layout/BranchSelectorDialog.js +130 -0
- package/dist/components/Layout/BranchSelectorDialog.js.map +1 -0
- package/dist/components/Layout/CreateBranchDialog.d.ts.map +1 -0
- package/dist/components/{CreateBranchDialog.js → Layout/CreateBranchDialog.js} +16 -16
- package/dist/components/Layout/CreateBranchDialog.js.map +1 -0
- package/dist/components/Layout/Layout.d.ts.map +1 -1
- package/dist/components/Layout/Layout.js +18 -26
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/LeftNavItem.d.ts.map +1 -1
- package/dist/components/Layout/LeftNavItem.js +7 -7
- package/dist/components/Layout/LeftNavItem.js.map +1 -1
- package/dist/components/Layout/Page.d.ts +16 -0
- package/dist/components/Layout/Page.d.ts.map +1 -0
- package/dist/components/Layout/Page.js +47 -0
- package/dist/components/Layout/Page.js.map +1 -0
- package/dist/components/Layout/TopHeader.d.ts +1 -1
- package/dist/components/Layout/TopHeader.d.ts.map +1 -1
- package/dist/components/Layout/TopHeader.js +70 -165
- package/dist/components/Layout/TopHeader.js.map +1 -1
- package/dist/components/Layout/UserAccountDialog.d.ts +12 -0
- package/dist/components/Layout/UserAccountDialog.d.ts.map +1 -0
- package/dist/components/Layout/UserAccountDialog.js +48 -0
- package/dist/components/Layout/UserAccountDialog.js.map +1 -0
- package/dist/components/Layout/skeletons/AgentNavSkeleton.js +1 -1
- package/dist/components/Layout/skeletons/AgentNavSkeleton.js.map +1 -1
- package/dist/components/Layout/skeletons/BranchChipSkeleton.d.ts.map +1 -1
- package/dist/components/Layout/skeletons/BranchChipSkeleton.js +1 -8
- package/dist/components/Layout/skeletons/BranchChipSkeleton.js.map +1 -1
- package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts +3 -0
- package/dist/components/Layout/skeletons/NeutralPageSkeleton.d.ts.map +1 -0
- package/dist/components/Layout/skeletons/NeutralPageSkeleton.js +11 -0
- package/dist/components/Layout/skeletons/NeutralPageSkeleton.js.map +1 -0
- package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts +19 -0
- package/dist/components/Layout/skeletons/PageChromeSkeleton.d.ts.map +1 -0
- package/dist/components/Layout/skeletons/PageChromeSkeleton.js +31 -0
- package/dist/components/Layout/skeletons/PageChromeSkeleton.js.map +1 -0
- package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts +9 -0
- package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.d.ts.map +1 -0
- package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js +15 -0
- package/dist/components/Layout/skeletons/RouteMainSlotSkeleton.js.map +1 -0
- package/dist/components/Layout/skeletons/TopHeaderSkeleton.d.ts.map +1 -1
- package/dist/components/Layout/skeletons/TopHeaderSkeleton.js +10 -17
- package/dist/components/Layout/skeletons/TopHeaderSkeleton.js.map +1 -1
- package/dist/components/Layout/skeletons/routeSkeletons.d.ts +16 -0
- package/dist/components/Layout/skeletons/routeSkeletons.d.ts.map +1 -0
- package/dist/components/Layout/skeletons/routeSkeletons.js +48 -0
- package/dist/components/Layout/skeletons/routeSkeletons.js.map +1 -0
- package/dist/components/LinkedBySection/LinkedBySection.js +13 -13
- package/dist/components/LinkedBySection/LinkedBySection.js.map +1 -1
- package/dist/components/MediaAsset/MediaAsset.d.ts +1 -1
- package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -1
- package/dist/components/MediaAsset/MediaAsset.js +126 -136
- package/dist/components/MediaAsset/MediaAsset.js.map +1 -1
- package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts +3 -0
- package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.d.ts.map +1 -0
- package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js +21 -0
- package/dist/components/MediaAsset/skeletons/MediaAssetPageSkeleton.js.map +1 -0
- package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.d.ts.map +1 -1
- package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js +26 -22
- package/dist/components/MediaAsset/skeletons/MediaMetadataFormSkeleton.js.map +1 -1
- package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.d.ts.map +1 -1
- package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js +1 -9
- package/dist/components/MediaAsset/skeletons/MediaPreviewSkeleton.js.map +1 -1
- package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -1
- package/dist/components/MediaManager/CreateFolderDialog.js +15 -8
- package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -1
- package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -1
- package/dist/components/MediaManager/DeleteFolderDialog.js +1 -2
- package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -1
- package/dist/components/MediaManager/MarkdownImageEditToolbar.d.ts.map +1 -1
- package/dist/components/MediaManager/MarkdownImageEditToolbar.js +7 -9
- package/dist/components/MediaManager/MarkdownImageEditToolbar.js.map +1 -1
- package/dist/components/MediaManager/MarkdownInsertImageDialog.d.ts.map +1 -1
- package/dist/components/MediaManager/MarkdownInsertImageDialog.js +6 -9
- package/dist/components/MediaManager/MarkdownInsertImageDialog.js.map +1 -1
- package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaLeftPanel.js +21 -23
- package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -1
- package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaListTable.js +15 -21
- package/dist/components/MediaManager/MediaListTable.js.map +1 -1
- package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaManager.js +101 -151
- package/dist/components/MediaManager/MediaManager.js.map +1 -1
- package/dist/components/MediaManager/MediaSelectDialog.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaSelectDialog.js +24 -66
- package/dist/components/MediaManager/MediaSelectDialog.js.map +1 -1
- package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaUploadBar.js +9 -10
- package/dist/components/MediaManager/MediaUploadBar.js.map +1 -1
- package/dist/components/MediaManager/MediaUploadDialog.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaUploadDialog.js +18 -11
- package/dist/components/MediaManager/MediaUploadDialog.js.map +1 -1
- package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts +8 -0
- package/dist/components/MediaManager/MediaViewModeSwitcher.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaViewModeSwitcher.js +14 -0
- package/dist/components/MediaManager/MediaViewModeSwitcher.js.map +1 -0
- package/dist/components/MediaManager/skeletons/MediaGridSkeleton.d.ts.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js +4 -12
- package/dist/components/MediaManager/skeletons/MediaGridSkeleton.js.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.d.ts.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js +5 -13
- package/dist/components/MediaManager/skeletons/MediaLeftPanelSkeleton.js.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.d.ts.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js +7 -15
- package/dist/components/MediaManager/skeletons/MediaListTableSkeleton.js.map +1 -1
- package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts +3 -0
- package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.d.ts.map +1 -0
- package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js +15 -0
- package/dist/components/MediaManager/skeletons/MediaManagerMainSkeleton.js.map +1 -0
- package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts +3 -0
- package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.d.ts.map +1 -0
- package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js +21 -0
- package/dist/components/MediaManager/skeletons/MediaManagerPageSkeleton.js.map +1 -0
- package/dist/components/public/MarkdownContent.d.ts.map +1 -1
- package/dist/components/public/MarkdownContent.js +1 -2
- package/dist/components/public/MarkdownContent.js.map +1 -1
- package/dist/components/public/RichTextContent.d.ts.map +1 -1
- package/dist/components/public/RichTextContent.js +19 -8
- package/dist/components/public/RichTextContent.js.map +1 -1
- package/dist/components/public/SearchBox.d.ts.map +1 -1
- package/dist/components/public/SearchBox.js +32 -60
- package/dist/components/public/SearchBox.js.map +1 -1
- package/dist/components/public/index.cjs +6 -413
- package/dist/components/public/index.cjs.map +1 -1
- package/dist/components/skeletons/MainSlotSkeleton.d.ts +0 -7
- package/dist/components/skeletons/MainSlotSkeleton.d.ts.map +1 -1
- package/dist/components/skeletons/MainSlotSkeleton.js +4 -17
- package/dist/components/skeletons/MainSlotSkeleton.js.map +1 -1
- package/dist/components/skeletons/blocks.d.ts.map +1 -1
- package/dist/components/skeletons/blocks.js +15 -7
- package/dist/components/skeletons/blocks.js.map +1 -1
- package/dist/components/skeletons/index.d.ts +4 -4
- package/dist/components/skeletons/index.d.ts.map +1 -1
- package/dist/components/skeletons/index.js +1 -2
- package/dist/components/skeletons/index.js.map +1 -1
- package/dist/components/skeletons/primitives.d.ts +2 -2
- package/dist/components/skeletons/primitives.d.ts.map +1 -1
- package/dist/components/skeletons/primitives.js +3 -3
- package/dist/components/skeletons/primitives.js.map +1 -1
- package/dist/components/test/dndTestUtils.d.ts +7 -0
- package/dist/components/test/dndTestUtils.d.ts.map +1 -0
- package/dist/components/test/dndTestUtils.js +15 -0
- package/dist/components/test/dndTestUtils.js.map +1 -0
- package/dist/components/ui/Avatar/Avatar.d.ts +5 -0
- package/dist/components/ui/Avatar/Avatar.d.ts.map +1 -0
- package/dist/components/ui/Avatar/Avatar.js +63 -0
- package/dist/components/ui/Avatar/Avatar.js.map +1 -0
- package/dist/components/ui/{branch-chip.d.ts → BranchChip/BranchChip.d.ts} +2 -5
- package/dist/components/ui/BranchChip/BranchChip.d.ts.map +1 -0
- package/dist/components/ui/BranchChip/BranchChip.js +47 -0
- package/dist/components/ui/BranchChip/BranchChip.js.map +1 -0
- package/dist/components/ui/Button/Button.d.ts +15 -0
- package/dist/components/ui/Button/Button.d.ts.map +1 -0
- package/dist/components/ui/Button/Button.js +49 -0
- package/dist/components/ui/Button/Button.js.map +1 -0
- package/dist/components/ui/Card/Card.d.ts +6 -0
- package/dist/components/ui/Card/Card.d.ts.map +1 -0
- package/dist/components/ui/{card.js → Card/Card.js} +12 -22
- package/dist/components/ui/Card/Card.js.map +1 -0
- package/dist/components/ui/{chip.d.ts → Chip/Chip.d.ts} +1 -1
- package/dist/components/ui/Chip/Chip.d.ts.map +1 -0
- package/dist/components/ui/Chip/Chip.js +24 -0
- package/dist/components/ui/Chip/Chip.js.map +1 -0
- package/dist/components/ui/Dialog/Dialog.d.ts +32 -0
- package/dist/components/ui/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/ui/Dialog/Dialog.js +194 -0
- package/dist/components/ui/Dialog/Dialog.js.map +1 -0
- package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts +66 -0
- package/dist/components/ui/DropdownMenu/DropdownMenu.d.ts.map +1 -0
- package/dist/components/ui/DropdownMenu/DropdownMenu.js +308 -0
- package/dist/components/ui/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/ui/{field.d.ts → FormField/Field.d.ts} +1 -1
- package/dist/components/ui/FormField/Field.d.ts.map +1 -0
- package/dist/components/ui/FormField/Field.js +41 -0
- package/dist/components/ui/FormField/Field.js.map +1 -0
- package/dist/components/{FieldShell.d.ts → ui/FormField/FieldShell.d.ts} +2 -2
- package/dist/components/ui/FormField/FieldShell.d.ts.map +1 -0
- package/dist/components/ui/FormField/FieldShell.js +29 -0
- package/dist/components/ui/FormField/FieldShell.js.map +1 -0
- package/dist/components/ui/FormField/FormBooleanField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormBooleanField.js +56 -0
- package/dist/components/ui/FormField/FormBooleanField.js.map +1 -0
- package/dist/components/ui/FormField/FormColorField.d.ts.map +1 -0
- package/dist/components/{FormColorField.js → ui/FormField/FormColorField.js} +10 -13
- package/dist/components/ui/FormField/FormColorField.js.map +1 -0
- package/dist/components/{FormConditionalField.d.ts → ui/FormField/FormConditionalField.d.ts} +1 -1
- package/dist/components/ui/FormField/FormConditionalField.d.ts.map +1 -0
- package/dist/components/{FormConditionalField.js → ui/FormField/FormConditionalField.js} +61 -58
- package/dist/components/ui/FormField/FormConditionalField.js.map +1 -0
- package/dist/components/ui/FormField/FormDatetimeField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormDatetimeField.js +48 -0
- package/dist/components/ui/FormField/FormDatetimeField.js.map +1 -0
- package/dist/components/{FormFields.d.ts → ui/FormField/FormFields.d.ts} +1 -1
- package/dist/components/ui/FormField/FormFields.d.ts.map +1 -0
- package/dist/components/{FormFields.js → ui/FormField/FormFields.js} +6 -6
- package/dist/components/ui/FormField/FormFields.js.map +1 -0
- package/dist/components/{FormImageField.d.ts → ui/FormField/FormImageField.d.ts} +1 -1
- package/dist/components/ui/FormField/FormImageField.d.ts.map +1 -0
- package/dist/components/{FormImageField.js → ui/FormField/FormImageField.js} +25 -30
- package/dist/components/ui/FormField/FormImageField.js.map +1 -0
- package/dist/components/ui/FormField/FormJsonField.d.ts.map +1 -0
- package/dist/components/{FormJsonField.js → ui/FormField/FormJsonField.js} +7 -10
- package/dist/components/ui/FormField/FormJsonField.js.map +1 -0
- package/dist/components/ui/FormField/FormMarkdownField.d.ts.map +1 -0
- package/dist/components/{FormMarkdownField.js → ui/FormField/FormMarkdownField.js} +11 -20
- package/dist/components/ui/FormField/FormMarkdownField.js.map +1 -0
- package/dist/components/ui/FormField/FormNumberField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormNumberField.js +38 -0
- package/dist/components/ui/FormField/FormNumberField.js.map +1 -0
- package/dist/components/{FormReferenceField.d.ts → ui/FormField/FormReferenceField.d.ts} +1 -1
- package/dist/components/ui/FormField/FormReferenceField.d.ts.map +1 -0
- package/dist/components/{FormReferenceField.js → ui/FormField/FormReferenceField.js} +109 -118
- package/dist/components/ui/FormField/FormReferenceField.js.map +1 -0
- package/dist/components/{FormRichTextField.d.ts → ui/FormField/FormRichTextField.d.ts} +1 -1
- package/dist/components/ui/FormField/FormRichTextField.d.ts.map +1 -0
- package/dist/components/{FormRichTextField.js → ui/FormField/FormRichTextField.js} +28 -33
- package/dist/components/ui/FormField/FormRichTextField.js.map +1 -0
- package/dist/components/{FormSelectField.d.ts → ui/FormField/FormSelectField.d.ts} +1 -1
- package/dist/components/ui/FormField/FormSelectField.d.ts.map +1 -0
- package/dist/components/{FormSelectField.js → ui/FormField/FormSelectField.js} +11 -23
- package/dist/components/ui/FormField/FormSelectField.js.map +1 -0
- package/dist/components/ui/FormField/FormSlugField.d.ts.map +1 -0
- package/dist/components/{FormSlugField.js → ui/FormField/FormSlugField.js} +21 -26
- package/dist/components/ui/FormField/FormSlugField.js.map +1 -0
- package/dist/components/ui/FormField/FormStringField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormStringField.js +23 -0
- package/dist/components/ui/FormField/FormStringField.js.map +1 -0
- package/dist/components/ui/FormField/FormStringListField.d.ts.map +1 -0
- package/dist/components/{FormStringListField.js → ui/FormField/FormStringListField.js} +14 -25
- package/dist/components/ui/FormField/FormStringListField.js.map +1 -0
- package/dist/components/ui/FormField/FormTextField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormTextField.js +35 -0
- package/dist/components/ui/FormField/FormTextField.js.map +1 -0
- package/dist/components/ui/FormField/FormUrlField.d.ts.map +1 -0
- package/dist/components/ui/FormField/FormUrlField.js +26 -0
- package/dist/components/ui/FormField/FormUrlField.js.map +1 -0
- package/dist/components/{richtext → ui/FormField/richtext}/ComponentEmbedEditor.d.ts +1 -1
- package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.d.ts.map +1 -0
- package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js +165 -0
- package/dist/components/ui/FormField/richtext/ComponentEmbedEditor.js.map +1 -0
- package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.d.ts.map +1 -0
- package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.js +25 -39
- package/dist/components/ui/FormField/richtext/ConditionEmbedEditor.js.map +1 -0
- package/dist/components/ui/FormField/richtext/ImageEmbedEditor.d.ts.map +1 -0
- package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.js +77 -56
- package/dist/components/ui/FormField/richtext/ImageEmbedEditor.js.map +1 -0
- package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.d.ts.map +1 -0
- package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.js +55 -43
- package/dist/components/ui/FormField/richtext/ReferenceEmbedEditor.js.map +1 -0
- package/dist/components/ui/FormField/richtext/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.js +21 -33
- package/dist/components/ui/FormField/richtext/SlashCommandMenu.js.map +1 -0
- package/dist/components/ui/FormField/richtext/VariableEmbedEditor.d.ts.map +1 -0
- package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js +61 -0
- package/dist/components/ui/FormField/richtext/VariableEmbedEditor.js.map +1 -0
- package/dist/components/ui/Icon/Icon.d.ts +77 -0
- package/dist/components/ui/Icon/Icon.d.ts.map +1 -0
- package/dist/components/ui/Icon/Icon.js +618 -0
- package/dist/components/ui/Icon/Icon.js.map +1 -0
- package/dist/components/ui/{input.d.ts → Input/Input.d.ts} +1 -1
- package/dist/components/ui/Input/Input.d.ts.map +1 -0
- package/dist/components/ui/Input/Input.js +25 -0
- package/dist/components/ui/Input/Input.js.map +1 -0
- package/dist/components/ui/{kbd.d.ts → Kbd/Kbd.d.ts} +1 -1
- package/dist/components/ui/Kbd/Kbd.d.ts.map +1 -0
- package/dist/components/ui/Kbd/Kbd.js +19 -0
- package/dist/components/ui/Kbd/Kbd.js.map +1 -0
- package/dist/components/ui/Label/Label.d.ts +3 -0
- package/dist/components/ui/Label/Label.d.ts.map +1 -0
- package/dist/components/ui/Label/Label.js +20 -0
- package/dist/components/ui/Label/Label.js.map +1 -0
- package/dist/components/ui/Portal/Portal.d.ts +8 -0
- package/dist/components/ui/Portal/Portal.d.ts.map +1 -0
- package/dist/components/ui/Portal/Portal.js +14 -0
- package/dist/components/ui/Portal/Portal.js.map +1 -0
- package/dist/components/ui/Select/Select.d.ts +33 -0
- package/dist/components/ui/Select/Select.d.ts.map +1 -0
- package/dist/components/ui/Select/Select.js +280 -0
- package/dist/components/ui/Select/Select.js.map +1 -0
- package/dist/components/ui/Slot/Slot.d.ts +6 -0
- package/dist/components/ui/Slot/Slot.d.ts.map +1 -0
- package/dist/components/ui/Slot/Slot.js +39 -0
- package/dist/components/ui/Slot/Slot.js.map +1 -0
- package/dist/components/ui/{status-badge.d.ts → StatusBadge/StatusBadge.d.ts} +2 -2
- package/dist/components/ui/StatusBadge/StatusBadge.d.ts.map +1 -0
- package/dist/components/ui/{status-badge.js → StatusBadge/StatusBadge.js} +8 -9
- package/dist/components/ui/StatusBadge/StatusBadge.js.map +1 -0
- package/dist/components/ui/Switcher/Switcher.d.ts +9 -0
- package/dist/components/ui/Switcher/Switcher.d.ts.map +1 -0
- package/dist/components/ui/Switcher/Switcher.js +75 -0
- package/dist/components/ui/Switcher/Switcher.js.map +1 -0
- package/dist/components/ui/{table.d.ts → Table/Table.d.ts} +1 -1
- package/dist/components/ui/Table/Table.d.ts.map +1 -0
- package/dist/components/ui/{table.js → Table/Table.js} +11 -29
- package/dist/components/ui/Table/Table.js.map +1 -0
- package/dist/components/ui/Tabs/Tabs.d.ts +16 -0
- package/dist/components/ui/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/ui/Tabs/Tabs.js +96 -0
- package/dist/components/ui/Tabs/Tabs.js.map +1 -0
- package/dist/components/ui/{textarea.d.ts → Textarea/Textarea.d.ts} +1 -1
- package/dist/components/ui/Textarea/Textarea.d.ts.map +1 -0
- package/dist/components/ui/Textarea/Textarea.js +16 -0
- package/dist/components/ui/Textarea/Textarea.js.map +1 -0
- package/dist/components/ui/Toast/Toast.d.ts +21 -0
- package/dist/components/ui/Toast/Toast.d.ts.map +1 -0
- package/dist/components/ui/Toast/Toast.js +98 -0
- package/dist/components/ui/Toast/Toast.js.map +1 -0
- package/dist/components/ui/{toaster.d.ts → Toaster/Toaster.d.ts} +1 -1
- package/dist/components/ui/Toaster/Toaster.d.ts.map +1 -0
- package/dist/components/ui/Toaster/Toaster.js +27 -0
- package/dist/components/ui/Toaster/Toaster.js.map +1 -0
- package/dist/components/ui/index.d.ts +45 -31
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +76 -36
- package/dist/components/ui/index.js.map +1 -1
- package/dist/config.cjs +4 -99
- package/dist/config.cjs.map +1 -1
- package/dist/defineConfig.cjs +0 -2
- package/dist/defineConfig.cjs.map +1 -1
- package/dist/globals.css +9708 -430
- package/dist/hooks/useComposedRefs.d.ts +5 -0
- package/dist/hooks/useComposedRefs.d.ts.map +1 -0
- package/dist/hooks/useComposedRefs.js +23 -0
- package/dist/hooks/useComposedRefs.js.map +1 -0
- package/dist/hooks/useControllableState.d.ts +8 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -0
- package/dist/hooks/useControllableState.js +28 -0
- package/dist/hooks/useControllableState.js.map +1 -0
- package/dist/hooks/usePopoverContent.d.ts +26 -0
- package/dist/hooks/usePopoverContent.d.ts.map +1 -0
- package/dist/hooks/usePopoverContent.js +44 -0
- package/dist/hooks/usePopoverContent.js.map +1 -0
- package/dist/hooks/useToast.d.ts +4 -4
- package/dist/hooks/useToast.d.ts.map +1 -1
- package/dist/hooks/useToast.js +1 -3
- package/dist/hooks/useToast.js.map +1 -1
- package/dist/index.cjs +11 -9506
- package/dist/index.cjs.map +1 -1
- package/dist/{init-KWH66PKY.js → init-TZFZEP4O.js} +3 -18
- package/dist/init-TZFZEP4O.js.map +1 -0
- package/dist/lib/configStore.cjs +1 -3
- package/dist/lib/configStore.cjs.map +1 -1
- package/dist/lib/slugField.d.ts.map +1 -1
- package/dist/lib/slugField.js +3 -3
- package/dist/lib/slugField.js.map +1 -1
- package/dist/lib/slugify.d.ts +13 -0
- package/dist/lib/slugify.d.ts.map +1 -0
- package/dist/lib/slugify.js +8 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +29 -3
- package/dist/lib/utils.js.map +1 -1
- package/dist/query.cjs +58 -9011
- package/dist/query.cjs.map +1 -1
- package/dist/types.cjs +0 -2
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/{typesGen-MFAL3B4V.js → typesGen-QWWTC4SZ.js} +6 -2
- package/dist/typesGen-QWWTC4SZ.js.map +1 -0
- package/dist/{update-QNJRYPMC.js → update-7KYYD57J.js} +2 -2
- package/dist/withOctoCMS.cjs +2 -36
- package/dist/withOctoCMS.cjs.map +1 -1
- package/docs/editing-schema.md +10 -9
- package/docs/index.md +23 -16
- package/docs/overview.md +14 -35
- package/globals.css +9708 -430
- package/package.json +1 -16
- package/dist/agentDocs-M3R2CPUQ.js +0 -38
- package/dist/agentDocs-M3R2CPUQ.js.map +0 -1
- package/dist/chunk-NAHOP7TG.js +0 -7
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +0 -5
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +0 -1
- package/dist/components/ContentModel/ContentModelList.skeleton.js +0 -16
- package/dist/components/ContentModel/ContentModelList.skeleton.js.map +0 -1
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +0 -5
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +0 -1
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +0 -22
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +0 -1
- package/dist/components/ContentTypes.d.ts +0 -7
- package/dist/components/ContentTypes.d.ts.map +0 -1
- package/dist/components/ContentTypes.js +0 -132
- package/dist/components/ContentTypes.js.map +0 -1
- package/dist/components/CreateBranchDialog.d.ts.map +0 -1
- package/dist/components/CreateBranchDialog.js.map +0 -1
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +0 -3
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +0 -1
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +0 -10
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +0 -1
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +0 -7
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +0 -1
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js +0 -22
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +0 -1
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +0 -2
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +0 -1
- package/dist/components/Dashboard/DashboardContent.skeleton.js +0 -13
- package/dist/components/Dashboard/DashboardContent.skeleton.js.map +0 -1
- package/dist/components/EditPost/EditPost.skeleton.d.ts +0 -5
- package/dist/components/EditPost/EditPost.skeleton.d.ts.map +0 -1
- package/dist/components/EditPost/EditPost.skeleton.js +0 -34
- package/dist/components/EditPost/EditPost.skeleton.js.map +0 -1
- package/dist/components/ErrorBoundary.d.ts.map +0 -1
- package/dist/components/ErrorBoundary.js.map +0 -1
- package/dist/components/FieldHintAndError.d.ts +0 -8
- package/dist/components/FieldHintAndError.d.ts.map +0 -1
- package/dist/components/FieldHintAndError.js +0 -14
- package/dist/components/FieldHintAndError.js.map +0 -1
- package/dist/components/FieldLabel.d.ts +0 -11
- package/dist/components/FieldLabel.d.ts.map +0 -1
- package/dist/components/FieldLabel.js +0 -17
- package/dist/components/FieldLabel.js.map +0 -1
- package/dist/components/FieldShell.d.ts.map +0 -1
- package/dist/components/FieldShell.js +0 -29
- package/dist/components/FieldShell.js.map +0 -1
- package/dist/components/FileExplorer/FileExplorer.d.ts +0 -8
- package/dist/components/FileExplorer/FileExplorer.d.ts.map +0 -1
- package/dist/components/FileExplorer/FileExplorer.js +0 -68
- package/dist/components/FileExplorer/FileExplorer.js.map +0 -1
- package/dist/components/FormBooleanField.d.ts.map +0 -1
- package/dist/components/FormBooleanField.js +0 -52
- package/dist/components/FormBooleanField.js.map +0 -1
- package/dist/components/FormColorField.d.ts.map +0 -1
- package/dist/components/FormColorField.js.map +0 -1
- package/dist/components/FormConditionalField.d.ts.map +0 -1
- package/dist/components/FormConditionalField.js.map +0 -1
- package/dist/components/FormDatetimeField.d.ts.map +0 -1
- package/dist/components/FormDatetimeField.js +0 -42
- package/dist/components/FormDatetimeField.js.map +0 -1
- package/dist/components/FormFields.d.ts.map +0 -1
- package/dist/components/FormFields.js.map +0 -1
- package/dist/components/FormImageField.d.ts.map +0 -1
- package/dist/components/FormImageField.js.map +0 -1
- package/dist/components/FormJsonField.d.ts.map +0 -1
- package/dist/components/FormJsonField.js.map +0 -1
- package/dist/components/FormMarkdownField.d.ts.map +0 -1
- package/dist/components/FormMarkdownField.js.map +0 -1
- package/dist/components/FormNumberField.d.ts.map +0 -1
- package/dist/components/FormNumberField.js +0 -43
- package/dist/components/FormNumberField.js.map +0 -1
- package/dist/components/FormReferenceField.d.ts.map +0 -1
- package/dist/components/FormReferenceField.js.map +0 -1
- package/dist/components/FormRichTextField.d.ts.map +0 -1
- package/dist/components/FormRichTextField.js.map +0 -1
- package/dist/components/FormSelectField.d.ts.map +0 -1
- package/dist/components/FormSelectField.js.map +0 -1
- package/dist/components/FormSlugField.d.ts.map +0 -1
- package/dist/components/FormSlugField.js.map +0 -1
- package/dist/components/FormStringField.d.ts.map +0 -1
- package/dist/components/FormStringField.js +0 -28
- package/dist/components/FormStringField.js.map +0 -1
- package/dist/components/FormStringListField.d.ts.map +0 -1
- package/dist/components/FormStringListField.js.map +0 -1
- package/dist/components/FormTextField.d.ts.map +0 -1
- package/dist/components/FormTextField.js +0 -40
- package/dist/components/FormTextField.js.map +0 -1
- package/dist/components/FormUrlField.d.ts.map +0 -1
- package/dist/components/FormUrlField.js +0 -31
- package/dist/components/FormUrlField.js.map +0 -1
- package/dist/components/Layout/PageBar.d.ts +0 -10
- package/dist/components/Layout/PageBar.d.ts.map +0 -1
- package/dist/components/Layout/PageBar.js +0 -43
- package/dist/components/Layout/PageBar.js.map +0 -1
- package/dist/components/Layout/PageShell.d.ts +0 -30
- package/dist/components/Layout/PageShell.d.ts.map +0 -1
- package/dist/components/Layout/PageShell.js +0 -33
- package/dist/components/Layout/PageShell.js.map +0 -1
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +0 -3
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +0 -1
- package/dist/components/MediaAsset/MediaAsset.skeleton.js +0 -42
- package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +0 -1
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts +0 -3
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +0 -1
- package/dist/components/MediaManager/MediaManager.skeleton.js +0 -30
- package/dist/components/MediaManager/MediaManager.skeleton.js.map +0 -1
- package/dist/components/StatusBadge.d.ts +0 -2
- package/dist/components/StatusBadge.d.ts.map +0 -1
- package/dist/components/StatusBadge.js +0 -7
- package/dist/components/StatusBadge.js.map +0 -1
- package/dist/components/richtext/ComponentEmbedEditor.d.ts.map +0 -1
- package/dist/components/richtext/ComponentEmbedEditor.js +0 -153
- package/dist/components/richtext/ComponentEmbedEditor.js.map +0 -1
- package/dist/components/richtext/ConditionEmbedEditor.d.ts.map +0 -1
- package/dist/components/richtext/ConditionEmbedEditor.js.map +0 -1
- package/dist/components/richtext/ImageEmbedEditor.d.ts.map +0 -1
- package/dist/components/richtext/ImageEmbedEditor.js.map +0 -1
- package/dist/components/richtext/ReferenceEmbedEditor.d.ts.map +0 -1
- package/dist/components/richtext/ReferenceEmbedEditor.js.map +0 -1
- package/dist/components/richtext/SlashCommandMenu.d.ts.map +0 -1
- package/dist/components/richtext/SlashCommandMenu.js.map +0 -1
- package/dist/components/richtext/VariableEmbedEditor.d.ts.map +0 -1
- package/dist/components/richtext/VariableEmbedEditor.js +0 -58
- package/dist/components/richtext/VariableEmbedEditor.js.map +0 -1
- package/dist/components/ui/avatar-stack.d.ts +0 -13
- package/dist/components/ui/avatar-stack.d.ts.map +0 -1
- package/dist/components/ui/avatar-stack.js +0 -27
- package/dist/components/ui/avatar-stack.js.map +0 -1
- package/dist/components/ui/avatar.d.ts +0 -7
- package/dist/components/ui/avatar.d.ts.map +0 -1
- package/dist/components/ui/avatar.js +0 -45
- package/dist/components/ui/avatar.js.map +0 -1
- package/dist/components/ui/banner.d.ts +0 -13
- package/dist/components/ui/banner.d.ts.map +0 -1
- package/dist/components/ui/banner.js +0 -24
- package/dist/components/ui/banner.js.map +0 -1
- package/dist/components/ui/branch-chip.d.ts.map +0 -1
- package/dist/components/ui/branch-chip.js +0 -58
- package/dist/components/ui/branch-chip.js.map +0 -1
- package/dist/components/ui/button.d.ts +0 -14
- package/dist/components/ui/button.d.ts.map +0 -1
- package/dist/components/ui/button.js +0 -65
- package/dist/components/ui/button.js.map +0 -1
- package/dist/components/ui/card.d.ts +0 -7
- package/dist/components/ui/card.d.ts.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/chip.d.ts.map +0 -1
- package/dist/components/ui/chip.js +0 -44
- package/dist/components/ui/chip.js.map +0 -1
- package/dist/components/ui/dialog.d.ts +0 -20
- package/dist/components/ui/dialog.d.ts.map +0 -1
- package/dist/components/ui/dialog.js +0 -93
- package/dist/components/ui/dialog.js.map +0 -1
- package/dist/components/ui/dropdown-menu.d.ts +0 -28
- package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
- package/dist/components/ui/dropdown-menu.js +0 -165
- package/dist/components/ui/dropdown-menu.js.map +0 -1
- package/dist/components/ui/empty.d.ts +0 -11
- package/dist/components/ui/empty.d.ts.map +0 -1
- package/dist/components/ui/empty.js +0 -24
- package/dist/components/ui/empty.js.map +0 -1
- package/dist/components/ui/field.d.ts.map +0 -1
- package/dist/components/ui/field.js +0 -52
- package/dist/components/ui/field.js.map +0 -1
- package/dist/components/ui/input.d.ts.map +0 -1
- package/dist/components/ui/input.js +0 -51
- package/dist/components/ui/input.js.map +0 -1
- package/dist/components/ui/kbd.d.ts.map +0 -1
- package/dist/components/ui/kbd.js +0 -30
- package/dist/components/ui/kbd.js.map +0 -1
- package/dist/components/ui/label.d.ts +0 -6
- package/dist/components/ui/label.d.ts.map +0 -1
- package/dist/components/ui/label.js +0 -20
- package/dist/components/ui/label.js.map +0 -1
- package/dist/components/ui/publish-button.d.ts +0 -7
- package/dist/components/ui/publish-button.d.ts.map +0 -1
- package/dist/components/ui/publish-button.js +0 -50
- package/dist/components/ui/publish-button.js.map +0 -1
- package/dist/components/ui/select.d.ts +0 -14
- package/dist/components/ui/select.d.ts.map +0 -1
- package/dist/components/ui/select.js +0 -132
- package/dist/components/ui/select.js.map +0 -1
- package/dist/components/ui/sonner.d.ts +0 -6
- package/dist/components/ui/sonner.d.ts.map +0 -1
- package/dist/components/ui/sonner.js +0 -37
- package/dist/components/ui/sonner.js.map +0 -1
- package/dist/components/ui/status-badge.d.ts.map +0 -1
- package/dist/components/ui/status-badge.js.map +0 -1
- package/dist/components/ui/table.d.ts.map +0 -1
- package/dist/components/ui/table.js.map +0 -1
- package/dist/components/ui/tabs-pill.d.ts +0 -17
- package/dist/components/ui/tabs-pill.d.ts.map +0 -1
- package/dist/components/ui/tabs-pill.js +0 -67
- package/dist/components/ui/tabs-pill.js.map +0 -1
- package/dist/components/ui/tabs.d.ts +0 -8
- package/dist/components/ui/tabs.d.ts.map +0 -1
- package/dist/components/ui/tabs.js +0 -59
- package/dist/components/ui/tabs.js.map +0 -1
- package/dist/components/ui/textarea.d.ts.map +0 -1
- package/dist/components/ui/textarea.js +0 -25
- package/dist/components/ui/textarea.js.map +0 -1
- package/dist/components/ui/toast-card.d.ts +0 -15
- package/dist/components/ui/toast-card.d.ts.map +0 -1
- package/dist/components/ui/toast-card.js +0 -90
- package/dist/components/ui/toast-card.js.map +0 -1
- package/dist/components/ui/toast.d.ts +0 -16
- package/dist/components/ui/toast.d.ts.map +0 -1
- package/dist/components/ui/toast.js +0 -95
- package/dist/components/ui/toast.js.map +0 -1
- package/dist/components/ui/toaster.d.ts.map +0 -1
- package/dist/components/ui/toaster.js +0 -30
- package/dist/components/ui/toaster.js.map +0 -1
- package/dist/init-KWH66PKY.js.map +0 -1
- package/dist/typesGen-MFAL3B4V.js.map +0 -1
- package/docs/schema.md +0 -311
- /package/dist/components/{ErrorBoundary.d.ts → ErrorBoundary/ErrorBoundary.d.ts} +0 -0
- /package/dist/components/{CreateBranchDialog.d.ts → Layout/CreateBranchDialog.d.ts} +0 -0
- /package/dist/components/{FormBooleanField.d.ts → ui/FormField/FormBooleanField.d.ts} +0 -0
- /package/dist/components/{FormColorField.d.ts → ui/FormField/FormColorField.d.ts} +0 -0
- /package/dist/components/{FormDatetimeField.d.ts → ui/FormField/FormDatetimeField.d.ts} +0 -0
- /package/dist/components/{FormJsonField.d.ts → ui/FormField/FormJsonField.d.ts} +0 -0
- /package/dist/components/{FormMarkdownField.d.ts → ui/FormField/FormMarkdownField.d.ts} +0 -0
- /package/dist/components/{FormNumberField.d.ts → ui/FormField/FormNumberField.d.ts} +0 -0
- /package/dist/components/{FormSlugField.d.ts → ui/FormField/FormSlugField.d.ts} +0 -0
- /package/dist/components/{FormStringField.d.ts → ui/FormField/FormStringField.d.ts} +0 -0
- /package/dist/components/{FormStringListField.d.ts → ui/FormField/FormStringListField.d.ts} +0 -0
- /package/dist/components/{FormTextField.d.ts → ui/FormField/FormTextField.d.ts} +0 -0
- /package/dist/components/{FormUrlField.d.ts → ui/FormField/FormUrlField.d.ts} +0 -0
- /package/dist/components/{richtext → ui/FormField/richtext}/ConditionEmbedEditor.d.ts +0 -0
- /package/dist/components/{richtext → ui/FormField/richtext}/ImageEmbedEditor.d.ts +0 -0
- /package/dist/components/{richtext → ui/FormField/richtext}/ReferenceEmbedEditor.d.ts +0 -0
- /package/dist/components/{richtext → ui/FormField/richtext}/SlashCommandMenu.d.ts +0 -0
- /package/dist/components/{richtext → ui/FormField/richtext}/VariableEmbedEditor.d.ts +0 -0
- /package/dist/{update-QNJRYPMC.js.map → update-7KYYD57J.js.map} +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A file-based CMS for Next.js. Schema defined in TypeScript, content stored as JSON files, Git-backed, no database.
|
|
4
4
|
|
|
5
|
-
**[octocms.
|
|
5
|
+
**[octocms.gunkin.dev](https://octocms.gunkin.dev)** · [Docs](https://octocms.gunkin.dev/docs)
|
|
6
6
|
|
|
7
7
|
## Requirements
|
|
8
8
|
|
package/dist/admin/AdminApp.d.ts
CHANGED
|
@@ -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 (
|
|
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
|
package/dist/admin/AdminApp.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "../chunk-B5LE2OEC.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
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(
|
|
46
|
+
return /* @__PURE__ */ jsx(NeutralPageSkeleton, {});
|
|
47
47
|
}
|
|
48
48
|
export {
|
|
49
49
|
AdminApp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import {
|
|
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
|
|
14
|
-
*
|
|
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
|
|
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;
|
|
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,
|
|
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
|
|
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: "
|
|
23
|
-
/* @__PURE__ */ jsx("h2", { className: "
|
|
24
|
-
userMessage ? /* @__PURE__ */ jsx("p", { className: "
|
|
25
|
-
isAvailability ? /* @__PURE__ */ jsx("p", { className: "
|
|
26
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
27
|
-
/* @__PURE__ */ jsx(Button, { type: "button",
|
|
28
|
-
/* @__PURE__ */ jsx(Button, { type: "button",
|
|
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: "
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
|
|
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 '
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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":"
|
|
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
|
|
4
|
-
import { ChatPage as ChatPageClient } from "../../components/Chat/ChatPage";
|
|
3
|
+
import dynamic from "next/dynamic";
|
|
5
4
|
import { getAgentConfig } from "../../agent/configStore";
|
|
6
|
-
import {
|
|
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 (!
|
|
10
|
-
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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) {
|