octocms 0.4.13 → 0.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-M3R2CPUQ.js → agentDocs-QZ4NOQVH.js} +2 -2
- package/dist/{chunk-DCDFWNC6.js → chunk-I7VNI2IG.js} +4 -7
- package/dist/{chunk-DCDFWNC6.js.map → chunk-I7VNI2IG.js.map} +1 -1
- package/dist/chunk-TOUAHFDW.js +7 -0
- package/dist/{chunk-NAHOP7TG.js.map → chunk-TOUAHFDW.js.map} +1 -1
- package/dist/cli/index.js +4 -4
- package/dist/cli/lib/templates.js +3 -6
- 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.js +22 -64
- 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 +9648 -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-KNIWQGJL.js} +3 -18
- package/dist/init-KNIWQGJL.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/{update-QNJRYPMC.js → update-QALIQG76.js} +2 -2
- package/dist/withOctoCMS.cjs +2 -36
- package/dist/withOctoCMS.cjs.map +1 -1
- package/globals.css +9648 -430
- package/package.json +1 -16
- 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/{agentDocs-M3R2CPUQ.js.map → agentDocs-QZ4NOQVH.js.map} +0 -0
- /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-QALIQG76.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../components/Chat/useChatStream.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport { acceptProposalAction, rejectProposalAction } from '../../admin/actions/agent';\nimport { invalidateAfterMutationAsync } from '../../admin/query/invalidate';\n\nimport type { AttachmentDiagnostic } from '../../agent/attachments';\nimport type { ChatEvent } from '../../agent/chat';\nimport type { NormalizedMessage } from '../../agent/providers/types';\nimport type { Proposal } from '../../agent/proposals';\n\nimport type { ChatEntry, ChatMeta, ChatToolCall, ProposalStatus, ProposalUiState, UsageSummary } from './types';\n\ntype State = {\n entries: ChatEntry[];\n /** Wire history — what we send back to the server on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: 'idle' | 'streaming' | 'error' | 'budget_exceeded' | 'stopped';\n error: string | null;\n /** Reason for budget_exceeded if any. */\n budgetReason: 'input_tokens' | 'output_tokens' | 'spend' | 'max_turns' | 'proposal_cap' | null;\n /** All proposals seen this conversation, keyed by `proposal.id`. */\n proposals: Record<string, ProposalUiState>;\n /** Latest attachment outcomes — replaced (not accumulated) on each turn. */\n attachmentDiagnostics: AttachmentDiagnostic[];\n};\n\ntype Action =\n | { type: 'reset' }\n | {\n type: 'submit';\n userText: string;\n entryId: string;\n assistantId: string;\n /** Filenames of attachments shown inline on the user bubble. */\n attachmentNames?: string[];\n }\n | { type: 'submit_system'; text: string; entryId: string; assistantId: string; wireText: string }\n | { type: 'meta'; meta: ChatMeta }\n | { type: 'attachments'; diagnostics: AttachmentDiagnostic[] }\n | { type: 'event'; assistantId: string; event: ChatEvent }\n | { type: 'finish'; assistantId: string; appendedHistory: NormalizedMessage[] }\n | { type: 'errored'; message: string }\n | { type: 'stopped'; assistantId: string }\n | { type: 'proposal_status'; proposalId: string; status: ProposalStatus };\n\nconst ZERO_USAGE: UsageSummary = { inputTokens: 0, outputTokens: 0, cachedInputTokens: 0, totalCostUSD: 0 };\n\nconst initial: State = {\n entries: [],\n history: [],\n meta: null,\n usage: ZERO_USAGE,\n status: 'idle',\n error: null,\n budgetReason: null,\n proposals: {},\n attachmentDiagnostics: [],\n};\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'reset':\n return { ...initial, meta: state.meta };\n case 'submit': {\n const userEntry: ChatEntry = {\n id: action.entryId,\n kind: 'user',\n text: action.userText,\n ...(action.attachmentNames && action.attachmentNames.length > 0\n ? { attachmentNames: action.attachmentNames }\n : {}),\n };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n attachmentDiagnostics: [],\n entries: [...state.entries, userEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.userText }],\n };\n }\n case 'attachments':\n return { ...state, attachmentDiagnostics: action.diagnostics };\n case 'submit_system': {\n const systemEntry: ChatEntry = { id: action.entryId, kind: 'system', text: action.text };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n entries: [...state.entries, systemEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.wireText }],\n };\n }\n case 'meta':\n return { ...state, meta: action.meta };\n case 'event':\n return applyEvent(state, action.assistantId, action.event);\n case 'finish':\n return {\n ...state,\n status: state.status === 'streaming' ? 'idle' : state.status,\n history: [...state.history, ...action.appendedHistory],\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'errored':\n return { ...state, status: 'error', error: action.message };\n case 'stopped':\n return {\n ...state,\n status: 'stopped',\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'proposal_status': {\n const existing = state.proposals[action.proposalId];\n if (!existing) return state;\n return {\n ...state,\n proposals: {\n ...state.proposals,\n [action.proposalId]: { ...existing, status: action.status },\n },\n };\n }\n }\n}\n\nfunction applyEvent(state: State, assistantId: string, event: ChatEvent): State {\n const entries = [...state.entries];\n const idx = entries.findIndex((e) => e.id === assistantId && e.kind === 'assistant');\n if (idx === -1) return state;\n const current = entries[idx] as Extract<ChatEntry, { kind: 'assistant' }>;\n let next = current;\n\n switch (event.type) {\n case 'text_delta':\n next = { ...current, text: current.text + event.text };\n break;\n case 'tool_use_start': {\n const tc: ChatToolCall = { id: event.id, name: event.name, inputJson: '' };\n next = { ...current, toolCalls: [...current.toolCalls, tc] };\n break;\n }\n case 'tool_use_input_delta': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.id ? { ...tc, inputJson: tc.inputJson + event.partialJson } : tc,\n ),\n };\n break;\n }\n case 'tool_use_complete': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) => (tc.id === event.id ? { ...tc, parsedInput: event.input } : tc)),\n };\n break;\n }\n case 'tool_result': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.toolUseId\n ? { ...tc, result: { content: event.result, isError: Boolean(event.isError) } }\n : tc,\n ),\n };\n break;\n }\n case 'proposal': {\n next = { ...current, proposalIds: [...current.proposalIds, event.proposal.id] };\n entries[idx] = next;\n const proposalState: ProposalUiState = {\n proposal: event.proposal,\n assistantEntryId: assistantId,\n status: { kind: 'pending' },\n };\n return {\n ...state,\n entries,\n proposals: { ...state.proposals, [event.proposal.id]: proposalState },\n };\n }\n case 'usage': {\n const usage: UsageSummary = {\n inputTokens: state.usage.inputTokens + event.inputTokens,\n outputTokens: state.usage.outputTokens + event.outputTokens,\n cachedInputTokens: state.usage.cachedInputTokens + (event.cachedInputTokens ?? 0),\n totalCostUSD: event.totalCostUSD,\n };\n entries[idx] = current;\n return { ...state, entries, usage };\n }\n case 'budget_exceeded':\n return { ...state, status: 'budget_exceeded', budgetReason: event.reason };\n case 'error':\n return { ...state, status: 'error', error: event.message };\n case 'turn_stop':\n case 'done':\n // Note: full assistant content (text + tool calls + tool results) is folded\n // back into history when the SSE stream completes — see `finalizeHistory`.\n break;\n }\n\n entries[idx] = next;\n return { ...state, entries };\n}\n\n/** Build the new history slice (assistant + tool messages) from the assistant entry. */\nfunction buildAppendedHistory(state: State, assistantId: string): NormalizedMessage[] {\n const entry = state.entries.find((e) => e.id === assistantId && e.kind === 'assistant');\n if (!entry || entry.kind !== 'assistant') return [];\n const blocks: import('../../agent/providers/types').NormalizedContentBlock[] = [];\n if (entry.text) blocks.push({ type: 'text', text: entry.text });\n for (const tc of entry.toolCalls) {\n blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.parsedInput ?? {} });\n }\n const out: NormalizedMessage[] = [{ role: 'assistant', content: blocks }];\n for (const tc of entry.toolCalls) {\n if (tc.result) {\n out.push({\n role: 'tool',\n toolUseId: tc.id,\n content: tc.result.content,\n ...(tc.result.isError ? { isError: true } : {}),\n });\n }\n }\n return out;\n}\n\nexport type UseChatStreamReturn = {\n entries: ChatEntry[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: State['status'];\n error: string | null;\n budgetReason: State['budgetReason'];\n proposals: Record<string, ProposalUiState>;\n attachmentDiagnostics: AttachmentDiagnostic[];\n send(text: string, files?: File[]): Promise<void>;\n reset(): void;\n /**\n * Abort the in-flight chat request. The streamed-so-far assistant content\n * is kept in the transcript and folded into history (so the next turn sees\n * a coherent conversation); status flips to `'stopped'` until the next\n * `send`. No-op when nothing is streaming.\n */\n stop(): void;\n acceptProposal(proposalId: string): Promise<void>;\n rejectProposal(proposalId: string, reason?: string): Promise<void>;\n acceptAllPending(assistantEntryId: string): Promise<void>;\n};\n\nexport function useChatStream(endpoint: string = '/api/agent'): UseChatStreamReturn {\n const queryClient = useQueryClient();\n const [state, dispatch] = useReducer(reducer, initial);\n const stateRef = useRef(state);\n stateRef.current = state;\n /**\n * Holds the in-flight request controller + the assistant-entry id it\n * belongs to. `stop()` aborts the controller and finalises that entry.\n * Set on submit, cleared on completion or abort.\n */\n const inFlightRef = useRef<{ controller: AbortController; assistantId: string } | null>(null);\n\n const reset = useCallback(() => {\n // Cancel any in-flight stream so a \"New conversation\" click really starts fresh.\n if (inFlightRef.current) {\n inFlightRef.current.controller.abort();\n inFlightRef.current = null;\n }\n dispatch({ type: 'reset' });\n }, []);\n\n // Abort any pending stream when the hook unmounts (page navigation, etc.)\n // so we don't leak the connection.\n useEffect(() => {\n return () => {\n inFlightRef.current?.controller.abort();\n inFlightRef.current = null;\n };\n }, []);\n\n const stop = useCallback(() => {\n const inFlight = inFlightRef.current;\n if (!inFlight) return;\n inFlight.controller.abort();\n inFlightRef.current = null;\n // Persist whatever assistant content we've already streamed back into history\n // so the next turn sees a coherent transcript, then mark the entry stopped.\n const appendedHistory = buildAppendedHistory(stateRef.current, inFlight.assistantId);\n if (appendedHistory.length > 0) {\n dispatch({ type: 'finish', assistantId: inFlight.assistantId, appendedHistory });\n }\n dispatch({ type: 'stopped', assistantId: inFlight.assistantId });\n }, []);\n\n /**\n * Run the streaming chat request. Used by `send` (user messages) and\n * `submitSystemMessage` (auto-followup after accept/reject).\n *\n * When `files` is non-empty, sends the request as multipart/form-data so the\n * server can parse uploads. Otherwise sends JSON. Either way, history is\n * always serialised in the `messages` field.\n */\n const runRequest = useCallback(\n async (assistantId: string, historyToSend: NormalizedMessage[], files?: File[]) => {\n const controller = new AbortController();\n inFlightRef.current = { controller, assistantId };\n try {\n const init: RequestInit =\n files && files.length > 0\n ? {\n method: 'POST',\n body: buildMultipartBody(historyToSend, files),\n signal: controller.signal,\n }\n : {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyToSend }),\n signal: controller.signal,\n };\n const res = await fetch(endpoint, init);\n if (!res.ok) {\n const message = res.status === 404 ? 'Chat is not enabled in this deploy.' : `HTTP ${res.status}`;\n dispatch({ type: 'errored', message });\n return;\n }\n if (!res.body) {\n dispatch({ type: 'errored', message: 'Server returned an empty body.' });\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE blocks separated by \\n\\n. Each may be `event: meta` or `data:`.\n let sepIdx;\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n handleSseBlock(block, assistantId, dispatch);\n }\n }\n } catch (err) {\n // AbortError (from `stop()` / `reset()` / unmount) is expected — `stop`\n // already dispatched its own state transition, so swallow it here.\n const aborted =\n (err instanceof DOMException && err.name === 'AbortError') ||\n (err instanceof Error && err.name === 'AbortError') ||\n controller.signal.aborted;\n if (aborted) return;\n dispatch({ type: 'errored', message: err instanceof Error ? err.message : 'Network error' });\n return;\n } finally {\n // Clear in-flight only if it's still pointing at *this* request.\n if (inFlightRef.current?.controller === controller) {\n inFlightRef.current = null;\n }\n }\n\n const appendedHistory = buildAppendedHistory(stateRef.current, assistantId);\n dispatch({ type: 'finish', assistantId, appendedHistory });\n },\n [endpoint],\n );\n\n const send = useCallback(\n async (text: string, files: File[] = []) => {\n const trimmed = text.trim();\n // Allow empty text when there are attachments — the model can still\n // reason about the document. Default the wire prompt so the model has\n // something to anchor on.\n const wireText = trimmed || (files.length > 0 ? 'Please review the attached document.' : '');\n if (!wireText || stateRef.current.status === 'streaming') return;\n const entryId = `e_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n dispatch({\n type: 'submit',\n userText: trimmed,\n entryId,\n assistantId,\n ...(files.length > 0 ? { attachmentNames: files.map((f) => f.name) } : {}),\n });\n\n // Build the request body from the SAME state we're dispatching into,\n // so the server sees the full history including the new user message.\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n\n await runRequest(assistantId, historyToSend, files);\n },\n [runRequest],\n );\n\n /**\n * Internal: post a synthetic system-style message to continue the conversation\n * after the user accepts or rejects a proposal. The entry shows in the\n * transcript as a `system` bubble (no avatar); on the wire it's a `user`\n * message tagged `[System notification]` so the model picks it up.\n */\n const submitSystemMessage = useCallback(\n async (visibleText: string, wireText: string) => {\n if (stateRef.current.status === 'streaming') return;\n const entryId = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n dispatch({ type: 'submit_system', text: visibleText, entryId, assistantId, wireText });\n\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n await runRequest(assistantId, historyToSend);\n },\n [runRequest],\n );\n\n const acceptProposal = useCallback(\n async (proposalId: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'accepting' } });\n\n let result: Awaited<ReturnType<typeof acceptProposalAction>>;\n try {\n result = await acceptProposalAction(ps.proposal);\n } catch (err) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'error', message: err instanceof Error ? err.message : 'Accept failed' },\n });\n return;\n }\n\n if (!result.ok) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: {\n kind: 'error',\n message: result.error,\n ...(result.fieldErrors ? { fieldErrors: result.fieldErrors } : {}),\n },\n });\n return;\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'accepted', entryPath: result.entryPath },\n });\n\n await invalidateAfterMutationAsync(queryClient, ['entries']);\n\n // Auto-followup so the model sees the result and can continue naturally.\n await submitSystemMessage(\n `Accepted: ${ps.proposal.summary} → saved at ${result.entryPath}.`,\n `[System notification] The user ACCEPTED proposal ${ps.proposal.id} (${ps.proposal.summary}). The entry was saved at ${result.entryPath}. Continue the conversation — do NOT propose the same change again.`,\n );\n },\n [queryClient, submitSystemMessage],\n );\n\n const rejectProposal = useCallback(\n async (proposalId: string, reason?: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'rejecting' } });\n try {\n await rejectProposalAction(reason ?? null);\n } catch {\n /* reject is informational; still mark rejected even if the action throws */\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'rejected', ...(reason ? { reason } : {}) },\n });\n\n const reasonClause = reason ? ` Reason: ${reason}` : '';\n await submitSystemMessage(\n `Rejected: ${ps.proposal.summary}.${reasonClause}`,\n `[System notification] The user REJECTED proposal ${ps.proposal.id} (${ps.proposal.summary}).${reasonClause} Acknowledge briefly and ask if they want a different change — do NOT re-propose the same thing.`,\n );\n },\n [submitSystemMessage],\n );\n\n const acceptAllPending = useCallback(\n async (assistantEntryId: string) => {\n // Snapshot the pending proposals on this assistant turn at click time.\n const all = Object.values(stateRef.current.proposals).filter(\n (p) => p.assistantEntryId === assistantEntryId && p.status.kind === 'pending',\n );\n for (const p of all) {\n // After each accept, the auto-followup triggers a fresh assistant turn.\n // We wait for it to finish before accepting the next so we don't race.\n await acceptProposal(p.proposal.id);\n // Halt on first failure — matches the Phase 4 plan's \"halt on first failure\".\n const updated = stateRef.current.proposals[p.proposal.id];\n if (!updated || updated.status.kind !== 'accepted') break;\n }\n },\n [acceptProposal],\n );\n\n return {\n entries: state.entries,\n meta: state.meta,\n usage: state.usage,\n status: state.status,\n error: state.error,\n budgetReason: state.budgetReason,\n proposals: state.proposals,\n attachmentDiagnostics: state.attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n };\n}\n\n/**\n * Build a multipart FormData body. The chat history is JSON-serialised into\n * a `messages` field; uploads go in repeated `files` fields. The server-side\n * route handler (`src/app/api/agent/route.ts`) parses the same shape.\n */\nfunction buildMultipartBody(messages: NormalizedMessage[], files: File[]): FormData {\n const fd = new FormData();\n fd.append('messages', JSON.stringify(messages));\n for (const f of files) fd.append('files', f, f.name);\n return fd;\n}\n\nfunction handleSseBlock(block: string, assistantId: string, dispatch: (a: Action) => void): void {\n // SSE block: lines starting with `event:` or `data:`.\n const lines = block.split('\\n');\n let eventName: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventName = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (dataLines.length === 0) return;\n const payload = dataLines.join('\\n');\n try {\n const json = JSON.parse(payload);\n if (eventName === 'meta') {\n dispatch({ type: 'meta', meta: json as ChatMeta });\n return;\n }\n if (eventName === 'attachments') {\n const diagnostics = (json as { diagnostics?: AttachmentDiagnostic[] }).diagnostics ?? [];\n dispatch({ type: 'attachments', diagnostics });\n return;\n }\n dispatch({ type: 'event', assistantId, event: json as ChatEvent });\n } catch {\n // Ignore malformed chunks — stream continues.\n }\n}\n\n// Re-export so consumers don't need to also reach into ./types\nexport type { Proposal };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../components/Chat/useChatStream.ts"],"sourcesContent":["'use client';\n\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport { acceptProposalAction, rejectProposalAction } from '../../admin/actions/agent';\nimport { invalidateAfterMutationAsync } from '../../admin/query/invalidate';\n\nimport type { AttachmentDiagnostic } from '../../agent/attachments';\nimport type { ChatEvent } from '../../agent/chat';\nimport type { NormalizedMessage } from '../../agent/providers/types';\nimport type { Proposal } from '../../agent/proposals';\n\nimport type { PersistedChatState } from './chatStorage';\nimport { toPersistedState } from './chatStorage';\nimport type { ChatEntry, ChatMeta, ChatToolCall, ProposalStatus, ProposalUiState, UsageSummary } from './types';\n\ntype State = {\n entries: ChatEntry[];\n /** Wire history — what we send back to the server on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: 'idle' | 'streaming' | 'error' | 'budget_exceeded' | 'stopped';\n error: string | null;\n /** Reason for budget_exceeded if any. */\n budgetReason: 'input_tokens' | 'output_tokens' | 'spend' | 'max_turns' | 'proposal_cap' | null;\n /** All proposals seen this conversation, keyed by `proposal.id`. */\n proposals: Record<string, ProposalUiState>;\n /** Latest attachment outcomes — replaced (not accumulated) on each turn. */\n attachmentDiagnostics: AttachmentDiagnostic[];\n};\n\ntype Action =\n | { type: 'reset' }\n | {\n type: 'submit';\n userText: string;\n entryId: string;\n assistantId: string;\n /** Filenames of attachments shown inline on the user bubble. */\n attachmentNames?: string[];\n }\n | { type: 'submit_system'; text: string; entryId: string; assistantId: string; wireText: string }\n | { type: 'meta'; meta: ChatMeta }\n | { type: 'attachments'; diagnostics: AttachmentDiagnostic[] }\n | { type: 'event'; assistantId: string; event: ChatEvent }\n | { type: 'finish'; assistantId: string; appendedHistory: NormalizedMessage[] }\n | { type: 'errored'; message: string }\n | { type: 'stopped'; assistantId: string }\n | { type: 'proposal_status'; proposalId: string; status: ProposalStatus }\n | { type: 'hydrate'; snapshot: PersistedChatState };\n\nconst ZERO_USAGE: UsageSummary = { inputTokens: 0, outputTokens: 0, cachedInputTokens: 0, totalCostUSD: 0 };\n\nconst initial: State = {\n entries: [],\n history: [],\n meta: null,\n usage: ZERO_USAGE,\n status: 'idle',\n error: null,\n budgetReason: null,\n proposals: {},\n attachmentDiagnostics: [],\n};\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'reset':\n return { ...initial, meta: state.meta };\n case 'hydrate':\n return {\n ...initial,\n entries: action.snapshot.entries,\n history: action.snapshot.history,\n meta: action.snapshot.meta,\n usage: action.snapshot.usage,\n status: action.snapshot.status,\n error: action.snapshot.error,\n budgetReason: action.snapshot.budgetReason,\n proposals: action.snapshot.proposals,\n attachmentDiagnostics: [],\n };\n case 'submit': {\n const userEntry: ChatEntry = {\n id: action.entryId,\n kind: 'user',\n text: action.userText,\n ...(action.attachmentNames && action.attachmentNames.length > 0\n ? { attachmentNames: action.attachmentNames }\n : {}),\n };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n attachmentDiagnostics: [],\n entries: [...state.entries, userEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.userText }],\n };\n }\n case 'attachments':\n return { ...state, attachmentDiagnostics: action.diagnostics };\n case 'submit_system': {\n const systemEntry: ChatEntry = { id: action.entryId, kind: 'system', text: action.text };\n const assistantEntry: ChatEntry = {\n id: action.assistantId,\n kind: 'assistant',\n text: '',\n toolCalls: [],\n proposalIds: [],\n streaming: true,\n };\n return {\n ...state,\n status: 'streaming',\n error: null,\n budgetReason: null,\n entries: [...state.entries, systemEntry, assistantEntry],\n history: [...state.history, { role: 'user', content: action.wireText }],\n };\n }\n case 'meta':\n return { ...state, meta: action.meta };\n case 'event':\n return applyEvent(state, action.assistantId, action.event);\n case 'finish':\n return {\n ...state,\n status: state.status === 'streaming' ? 'idle' : state.status,\n history: [...state.history, ...action.appendedHistory],\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'errored':\n return { ...state, status: 'error', error: action.message };\n case 'stopped':\n return {\n ...state,\n status: 'stopped',\n entries: state.entries.map((e) =>\n e.id === action.assistantId && e.kind === 'assistant' ? { ...e, streaming: false } : e,\n ),\n };\n case 'proposal_status': {\n const existing = state.proposals[action.proposalId];\n if (!existing) return state;\n return {\n ...state,\n proposals: {\n ...state.proposals,\n [action.proposalId]: { ...existing, status: action.status },\n },\n };\n }\n }\n}\n\nfunction applyEvent(state: State, assistantId: string, event: ChatEvent): State {\n const entries = [...state.entries];\n const idx = entries.findIndex((e) => e.id === assistantId && e.kind === 'assistant');\n if (idx === -1) return state;\n const current = entries[idx] as Extract<ChatEntry, { kind: 'assistant' }>;\n let next = current;\n\n switch (event.type) {\n case 'text_delta':\n next = { ...current, text: current.text + event.text };\n break;\n case 'tool_use_start': {\n const tc: ChatToolCall = { id: event.id, name: event.name, inputJson: '' };\n next = { ...current, toolCalls: [...current.toolCalls, tc] };\n break;\n }\n case 'tool_use_input_delta': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.id ? { ...tc, inputJson: tc.inputJson + event.partialJson } : tc,\n ),\n };\n break;\n }\n case 'tool_use_complete': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) => (tc.id === event.id ? { ...tc, parsedInput: event.input } : tc)),\n };\n break;\n }\n case 'tool_result': {\n next = {\n ...current,\n toolCalls: current.toolCalls.map((tc) =>\n tc.id === event.toolUseId\n ? { ...tc, result: { content: event.result, isError: Boolean(event.isError) } }\n : tc,\n ),\n };\n break;\n }\n case 'proposal': {\n next = { ...current, proposalIds: [...current.proposalIds, event.proposal.id] };\n entries[idx] = next;\n const proposalState: ProposalUiState = {\n proposal: event.proposal,\n assistantEntryId: assistantId,\n status: { kind: 'pending' },\n };\n return {\n ...state,\n entries,\n proposals: { ...state.proposals, [event.proposal.id]: proposalState },\n };\n }\n case 'usage': {\n const usage: UsageSummary = {\n inputTokens: state.usage.inputTokens + event.inputTokens,\n outputTokens: state.usage.outputTokens + event.outputTokens,\n cachedInputTokens: state.usage.cachedInputTokens + (event.cachedInputTokens ?? 0),\n totalCostUSD: event.totalCostUSD,\n };\n entries[idx] = current;\n return { ...state, entries, usage };\n }\n case 'budget_exceeded':\n return { ...state, status: 'budget_exceeded', budgetReason: event.reason };\n case 'error':\n return { ...state, status: 'error', error: event.message };\n case 'turn_stop':\n case 'done':\n // Note: full assistant content (text + tool calls + tool results) is folded\n // back into history when the SSE stream completes — see `finalizeHistory`.\n break;\n }\n\n entries[idx] = next;\n return { ...state, entries };\n}\n\n/** Build the new history slice (assistant + tool messages) from the assistant entry. */\nfunction buildAppendedHistory(state: State, assistantId: string): NormalizedMessage[] {\n const entry = state.entries.find((e) => e.id === assistantId && e.kind === 'assistant');\n if (!entry || entry.kind !== 'assistant') return [];\n const blocks: import('../../agent/providers/types').NormalizedContentBlock[] = [];\n if (entry.text) blocks.push({ type: 'text', text: entry.text });\n for (const tc of entry.toolCalls) {\n blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.parsedInput ?? {} });\n }\n const out: NormalizedMessage[] = [{ role: 'assistant', content: blocks }];\n for (const tc of entry.toolCalls) {\n if (tc.result) {\n out.push({\n role: 'tool',\n toolUseId: tc.id,\n content: tc.result.content,\n ...(tc.result.isError ? { isError: true } : {}),\n });\n }\n }\n return out;\n}\n\nexport type UseChatStreamReturn = {\n entries: ChatEntry[];\n /** Wire history sent to the chat API on the next request. */\n history: NormalizedMessage[];\n meta: ChatMeta | null;\n usage: UsageSummary;\n status: State['status'];\n error: string | null;\n budgetReason: State['budgetReason'];\n proposals: Record<string, ProposalUiState>;\n attachmentDiagnostics: AttachmentDiagnostic[];\n send(text: string, files?: File[]): Promise<void>;\n reset(): void;\n /**\n * Abort the in-flight chat request. The streamed-so-far assistant content\n * is kept in the transcript and folded into history (so the next turn sees\n * a coherent conversation); status flips to `'stopped'` until the next\n * `send`. No-op when nothing is streaming.\n */\n stop(): void;\n acceptProposal(proposalId: string): Promise<void>;\n rejectProposal(proposalId: string, reason?: string): Promise<void>;\n acceptAllPending(assistantEntryId: string): Promise<void>;\n hydrate(snapshot: PersistedChatState): void;\n getSnapshot(): PersistedChatState | null;\n};\n\nexport function useChatStream(endpoint: string = '/api/agent'): UseChatStreamReturn {\n const queryClient = useQueryClient();\n const [state, dispatch] = useReducer(reducer, initial);\n const stateRef = useRef(state);\n stateRef.current = state;\n /**\n * Holds the in-flight request controller + the assistant-entry id it\n * belongs to. `stop()` aborts the controller and finalises that entry.\n * Set on submit, cleared on completion or abort.\n */\n const inFlightRef = useRef<{ controller: AbortController; assistantId: string } | null>(null);\n\n const abortInFlight = useCallback(() => {\n if (inFlightRef.current) {\n inFlightRef.current.controller.abort();\n inFlightRef.current = null;\n }\n }, []);\n\n const reset = useCallback(() => {\n abortInFlight();\n dispatch({ type: 'reset' });\n }, [abortInFlight]);\n\n const hydrate = useCallback(\n (snapshot: PersistedChatState) => {\n abortInFlight();\n dispatch({ type: 'hydrate', snapshot });\n },\n [abortInFlight],\n );\n\n const getSnapshot = useCallback((): PersistedChatState | null => {\n return toPersistedState(stateRef.current);\n }, []);\n\n // Abort any pending stream when the hook unmounts (page navigation, etc.)\n // so we don't leak the connection.\n useEffect(() => {\n return () => {\n inFlightRef.current?.controller.abort();\n inFlightRef.current = null;\n };\n }, []);\n\n const stop = useCallback(() => {\n const inFlight = inFlightRef.current;\n if (!inFlight) return;\n inFlight.controller.abort();\n inFlightRef.current = null;\n // Persist whatever assistant content we've already streamed back into history\n // so the next turn sees a coherent transcript, then mark the entry stopped.\n const appendedHistory = buildAppendedHistory(stateRef.current, inFlight.assistantId);\n if (appendedHistory.length > 0) {\n dispatch({ type: 'finish', assistantId: inFlight.assistantId, appendedHistory });\n }\n dispatch({ type: 'stopped', assistantId: inFlight.assistantId });\n }, []);\n\n /**\n * Run the streaming chat request. Used by `send` (user messages) and\n * `submitSystemMessage` (auto-followup after accept/reject).\n *\n * When `files` is non-empty, sends the request as multipart/form-data so the\n * server can parse uploads. Otherwise sends JSON. Either way, history is\n * always serialised in the `messages` field.\n */\n const runRequest = useCallback(\n async (assistantId: string, historyToSend: NormalizedMessage[], files?: File[]) => {\n const controller = new AbortController();\n inFlightRef.current = { controller, assistantId };\n try {\n const init: RequestInit =\n files && files.length > 0\n ? {\n method: 'POST',\n body: buildMultipartBody(historyToSend, files),\n signal: controller.signal,\n }\n : {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages: historyToSend }),\n signal: controller.signal,\n };\n const res = await fetch(endpoint, init);\n if (!res.ok) {\n const message = res.status === 404 ? 'Chat is not enabled in this deploy.' : `HTTP ${res.status}`;\n dispatch({ type: 'errored', message });\n return;\n }\n if (!res.body) {\n dispatch({ type: 'errored', message: 'Server returned an empty body.' });\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE blocks separated by \\n\\n. Each may be `event: meta` or `data:`.\n let sepIdx;\n while ((sepIdx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + 2);\n handleSseBlock(block, assistantId, dispatch);\n }\n }\n } catch (err) {\n // AbortError (from `stop()` / `reset()` / unmount) is expected — `stop`\n // already dispatched its own state transition, so swallow it here.\n const aborted =\n (err instanceof DOMException && err.name === 'AbortError') ||\n (err instanceof Error && err.name === 'AbortError') ||\n controller.signal.aborted;\n if (aborted) return;\n dispatch({ type: 'errored', message: err instanceof Error ? err.message : 'Network error' });\n return;\n } finally {\n // Clear in-flight only if it's still pointing at *this* request.\n if (inFlightRef.current?.controller === controller) {\n inFlightRef.current = null;\n }\n }\n\n const appendedHistory = buildAppendedHistory(stateRef.current, assistantId);\n dispatch({ type: 'finish', assistantId, appendedHistory });\n },\n [endpoint],\n );\n\n const send = useCallback(\n async (text: string, files: File[] = []) => {\n const trimmed = text.trim();\n // Allow empty text when there are attachments — the model can still\n // reason about the document. Default the wire prompt so the model has\n // something to anchor on.\n const wireText = trimmed || (files.length > 0 ? 'Please review the attached document.' : '');\n if (!wireText || stateRef.current.status === 'streaming') return;\n const entryId = `e_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n dispatch({\n type: 'submit',\n userText: trimmed,\n entryId,\n assistantId,\n ...(files.length > 0 ? { attachmentNames: files.map((f) => f.name) } : {}),\n });\n\n // Build the request body from the SAME state we're dispatching into,\n // so the server sees the full history including the new user message.\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n\n await runRequest(assistantId, historyToSend, files);\n },\n [runRequest],\n );\n\n /**\n * Internal: post a synthetic system-style message to continue the conversation\n * after the user accepts or rejects a proposal. The entry shows in the\n * transcript as a `system` bubble (no avatar); on the wire it's a `user`\n * message tagged `[System notification]` so the model picks it up.\n */\n const submitSystemMessage = useCallback(\n async (visibleText: string, wireText: string) => {\n if (stateRef.current.status === 'streaming') return;\n const entryId = `s_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const assistantId = `a_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n dispatch({ type: 'submit_system', text: visibleText, entryId, assistantId, wireText });\n\n const historyToSend: NormalizedMessage[] = [...stateRef.current.history, { role: 'user', content: wireText }];\n await runRequest(assistantId, historyToSend);\n },\n [runRequest],\n );\n\n const acceptProposal = useCallback(\n async (proposalId: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'accepting' } });\n\n let result: Awaited<ReturnType<typeof acceptProposalAction>>;\n try {\n result = await acceptProposalAction(ps.proposal);\n } catch (err) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'error', message: err instanceof Error ? err.message : 'Accept failed' },\n });\n return;\n }\n\n if (!result.ok) {\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: {\n kind: 'error',\n message: result.error,\n ...(result.fieldErrors ? { fieldErrors: result.fieldErrors } : {}),\n },\n });\n return;\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'accepted', entryPath: result.entryPath },\n });\n\n await invalidateAfterMutationAsync(queryClient, ['entries']);\n\n // Auto-followup so the model sees the result and can continue naturally.\n await submitSystemMessage(\n `Accepted: ${ps.proposal.summary} → saved at ${result.entryPath}.`,\n `[System notification] The user ACCEPTED proposal ${ps.proposal.id} (${ps.proposal.summary}). The entry was saved at ${result.entryPath}. Continue the conversation — do NOT propose the same change again.`,\n );\n },\n [queryClient, submitSystemMessage],\n );\n\n const rejectProposal = useCallback(\n async (proposalId: string, reason?: string) => {\n const ps = stateRef.current.proposals[proposalId];\n if (!ps || ps.status.kind !== 'pending') return;\n\n dispatch({ type: 'proposal_status', proposalId, status: { kind: 'rejecting' } });\n try {\n await rejectProposalAction(reason ?? null);\n } catch {\n /* reject is informational; still mark rejected even if the action throws */\n }\n dispatch({\n type: 'proposal_status',\n proposalId,\n status: { kind: 'rejected', ...(reason ? { reason } : {}) },\n });\n\n const reasonClause = reason ? ` Reason: ${reason}` : '';\n await submitSystemMessage(\n `Rejected: ${ps.proposal.summary}.${reasonClause}`,\n `[System notification] The user REJECTED proposal ${ps.proposal.id} (${ps.proposal.summary}).${reasonClause} Acknowledge briefly and ask if they want a different change — do NOT re-propose the same thing.`,\n );\n },\n [submitSystemMessage],\n );\n\n const acceptAllPending = useCallback(\n async (assistantEntryId: string) => {\n // Snapshot the pending proposals on this assistant turn at click time.\n const all = Object.values(stateRef.current.proposals).filter(\n (p) => p.assistantEntryId === assistantEntryId && p.status.kind === 'pending',\n );\n for (const p of all) {\n // After each accept, the auto-followup triggers a fresh assistant turn.\n // We wait for it to finish before accepting the next so we don't race.\n await acceptProposal(p.proposal.id);\n // Halt on first failure — matches the Phase 4 plan's \"halt on first failure\".\n const updated = stateRef.current.proposals[p.proposal.id];\n if (!updated || updated.status.kind !== 'accepted') break;\n }\n },\n [acceptProposal],\n );\n\n return {\n entries: state.entries,\n history: state.history,\n meta: state.meta,\n usage: state.usage,\n status: state.status,\n error: state.error,\n budgetReason: state.budgetReason,\n proposals: state.proposals,\n attachmentDiagnostics: state.attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n hydrate,\n getSnapshot,\n };\n}\n\nexport type { PersistedChatState };\n\n/**\n * Build a multipart FormData body. The chat history is JSON-serialised into\n * a `messages` field; uploads go in repeated `files` fields. The server-side\n * route handler (`src/app/api/agent/route.ts`) parses the same shape.\n */\nfunction buildMultipartBody(messages: NormalizedMessage[], files: File[]): FormData {\n const fd = new FormData();\n fd.append('messages', JSON.stringify(messages));\n for (const f of files) fd.append('files', f, f.name);\n return fd;\n}\n\nfunction handleSseBlock(block: string, assistantId: string, dispatch: (a: Action) => void): void {\n // SSE block: lines starting with `event:` or `data:`.\n const lines = block.split('\\n');\n let eventName: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventName = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (dataLines.length === 0) return;\n const payload = dataLines.join('\\n');\n try {\n const json = JSON.parse(payload);\n if (eventName === 'meta') {\n dispatch({ type: 'meta', meta: json as ChatMeta });\n return;\n }\n if (eventName === 'attachments') {\n const diagnostics = (json as { diagnostics?: AttachmentDiagnostic[] }).diagnostics ?? [];\n dispatch({ type: 'attachments', diagnostics });\n return;\n }\n dispatch({ type: 'event', assistantId, event: json as ChatEvent });\n } catch {\n // Ignore malformed chunks — stream continues.\n }\n}\n\n// Re-export so consumers don't need to also reach into ./types\nexport type { Proposal };\n"],"mappings":"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","names":[]}
|
|
@@ -7,6 +7,6 @@ export declare function useCommandK(): {
|
|
|
7
7
|
open: boolean;
|
|
8
8
|
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
9
9
|
};
|
|
10
|
-
export declare function CommandK({ open, onOpenChange }: CommandKProps): import("react/jsx-runtime").JSX.Element
|
|
10
|
+
export declare function CommandK({ open, onOpenChange }: CommandKProps): import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
export {};
|
|
12
12
|
//# sourceMappingURL=CommandK.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandK.d.ts","sourceRoot":"","sources":["../../../components/CommandK/CommandK.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandK.d.ts","sourceRoot":"","sources":["../../../components/CommandK/CommandK.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,WAAW;;;EAe1B;AAoBD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,aAAa,2CAuO7D"}
|
|
@@ -4,14 +4,13 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { useQueryClient } from "@tanstack/react-query";
|
|
6
6
|
import { useRouter } from "next/navigation";
|
|
7
|
-
import {
|
|
7
|
+
import { Dialog, DialogContent, Icon, Kbd } from "../ui";
|
|
8
8
|
import { getEntryList } from "../../admin/actions/entries";
|
|
9
9
|
import { getFile } from "../../admin/actions/files";
|
|
10
10
|
import { listCMSBranches, searchEntries } from "../../admin/actions";
|
|
11
11
|
import { queryKeys } from "../../admin/query/keys";
|
|
12
12
|
import { useConfig } from "../../hooks/useConfig";
|
|
13
13
|
import { entryAdminHref } from "../../lib/searchIndex";
|
|
14
|
-
import { Kbd } from "../ui";
|
|
15
14
|
import { RowItem, Section } from "./parts";
|
|
16
15
|
function useCommandK() {
|
|
17
16
|
const [open, setOpen] = React.useState(false);
|
|
@@ -30,8 +29,8 @@ function useCommandK() {
|
|
|
30
29
|
return { open, setOpen };
|
|
31
30
|
}
|
|
32
31
|
const ACTIONS = [
|
|
33
|
-
{ id: "new-entry", label: "New entry", icon: /* @__PURE__ */ jsx(Plus, { size: 14 }), href: "/cms/content", kbd: ["\u2318", "N"] },
|
|
34
|
-
{ id: "agent", label: "Ask the agent", icon: /* @__PURE__ */ jsx(Bot, { size: 14 }), href: "/cms/chat", kbd: ["\u2318", "J"] }
|
|
32
|
+
{ id: "new-entry", label: "New entry", icon: /* @__PURE__ */ jsx(Icon.Plus, { size: 14 }), href: "/cms/content", kbd: ["\u2318", "N"] },
|
|
33
|
+
{ id: "agent", label: "Ask the agent", icon: /* @__PURE__ */ jsx(Icon.Bot, { size: 14 }), href: "/cms/chat", kbd: ["\u2318", "J"] }
|
|
35
34
|
];
|
|
36
35
|
function CommandK({ open, onOpenChange }) {
|
|
37
36
|
const router = useRouter();
|
|
@@ -137,121 +136,106 @@ function CommandK({ open, onOpenChange }) {
|
|
|
137
136
|
if (row) runRow(row, e.metaKey || e.ctrlKey);
|
|
138
137
|
}
|
|
139
138
|
};
|
|
140
|
-
if (!open) return null;
|
|
141
139
|
let runningIndex = -1;
|
|
142
|
-
return /* @__PURE__ */ jsx(
|
|
143
|
-
|
|
140
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(
|
|
141
|
+
DialogContent,
|
|
144
142
|
{
|
|
145
|
-
className: "
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
/* @__PURE__ */
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
] }),
|
|
240
|
-
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
241
|
-
/* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
|
|
242
|
-
" open"
|
|
243
|
-
] }),
|
|
244
|
-
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
245
|
-
/* @__PURE__ */ jsx(Kbd, { children: "\u2318" }),
|
|
246
|
-
/* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
|
|
247
|
-
" open in new tab"
|
|
248
|
-
] })
|
|
249
|
-
] })
|
|
250
|
-
]
|
|
251
|
-
}
|
|
252
|
-
)
|
|
143
|
+
className: "octo-cmdk__dialog octo-dialog-content octo-dialog-content--3xl octo-dialog-content--no-padding octo-dialog-content--overflow-hidden",
|
|
144
|
+
"aria-label": "Command palette",
|
|
145
|
+
children: [
|
|
146
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-cmdk__input-row", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(Icon.Search, { size: 18, className: "octo-cmdk__input-icon" }),
|
|
148
|
+
/* @__PURE__ */ jsx(
|
|
149
|
+
"input",
|
|
150
|
+
{
|
|
151
|
+
ref: inputRef,
|
|
152
|
+
value: query,
|
|
153
|
+
onChange: (e) => setQuery(e.target.value),
|
|
154
|
+
onKeyDown,
|
|
155
|
+
placeholder: "Search entries, branches\u2026",
|
|
156
|
+
className: "octo-cmdk__input"
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
/* @__PURE__ */ jsx(Kbd, { children: "Esc" })
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-cmdk__results", children: [
|
|
162
|
+
entries.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Entries \xB7 ${entries.length}`, children: entries.map((r) => {
|
|
163
|
+
runningIndex += 1;
|
|
164
|
+
const idx = runningIndex;
|
|
165
|
+
const adminHref = entryAdminHref(r);
|
|
166
|
+
return /* @__PURE__ */ jsx(
|
|
167
|
+
RowItem,
|
|
168
|
+
{
|
|
169
|
+
icon: /* @__PURE__ */ jsx(Icon.FileText, { size: 14 }),
|
|
170
|
+
title: r.title,
|
|
171
|
+
sub: adminHref,
|
|
172
|
+
badge: r.typeLabel,
|
|
173
|
+
active: idx === activeIndex,
|
|
174
|
+
href: adminHref,
|
|
175
|
+
onMouseEnter: () => {
|
|
176
|
+
setActiveIndex(idx);
|
|
177
|
+
prefetchEntryHit(r);
|
|
178
|
+
},
|
|
179
|
+
onClick: () => onOpenChange(false)
|
|
180
|
+
},
|
|
181
|
+
`e-${r.id}`
|
|
182
|
+
);
|
|
183
|
+
}) }),
|
|
184
|
+
matchingBranches.length > 0 && /* @__PURE__ */ jsx(Section, { label: `Branches \xB7 ${matchingBranches.length}`, children: matchingBranches.map((b) => {
|
|
185
|
+
runningIndex += 1;
|
|
186
|
+
const idx = runningIndex;
|
|
187
|
+
return /* @__PURE__ */ jsx(
|
|
188
|
+
RowItem,
|
|
189
|
+
{
|
|
190
|
+
icon: /* @__PURE__ */ jsx(Icon.GitBranch, { size: 14 }),
|
|
191
|
+
title: b.branch,
|
|
192
|
+
sub: b.isPublished ? "Published \xB7 live" : b.prUrl ? "Open PR" : "Branch",
|
|
193
|
+
mono: true,
|
|
194
|
+
active: idx === activeIndex,
|
|
195
|
+
onMouseEnter: () => setActiveIndex(idx),
|
|
196
|
+
onClick: (e) => runRow({ kind: "branch", branch: b }, e.metaKey || e.ctrlKey)
|
|
197
|
+
},
|
|
198
|
+
`b-${b.branch}`
|
|
199
|
+
);
|
|
200
|
+
}) }),
|
|
201
|
+
matchingActions.length > 0 && /* @__PURE__ */ jsx(Section, { label: "Actions", children: matchingActions.map((a) => {
|
|
202
|
+
runningIndex += 1;
|
|
203
|
+
const idx = runningIndex;
|
|
204
|
+
return /* @__PURE__ */ jsx(
|
|
205
|
+
RowItem,
|
|
206
|
+
{
|
|
207
|
+
icon: a.icon,
|
|
208
|
+
title: a.label,
|
|
209
|
+
kbd: a.kbd,
|
|
210
|
+
active: idx === activeIndex,
|
|
211
|
+
href: a.href,
|
|
212
|
+
onMouseEnter: () => setActiveIndex(idx),
|
|
213
|
+
onClick: () => onOpenChange(false)
|
|
214
|
+
},
|
|
215
|
+
`a-${a.id}`
|
|
216
|
+
);
|
|
217
|
+
}) }),
|
|
218
|
+
rows.length === 0 && /* @__PURE__ */ jsx("div", { className: "octo-cmdk__empty", children: query.trim() ? "No results" : "Start typing to search\u2026" })
|
|
219
|
+
] }),
|
|
220
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-cmdk__footer", children: [
|
|
221
|
+
/* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
|
|
222
|
+
/* @__PURE__ */ jsx(Kbd, { children: "\u2191" }),
|
|
223
|
+
/* @__PURE__ */ jsx(Kbd, { children: "\u2193" }),
|
|
224
|
+
" navigate"
|
|
225
|
+
] }),
|
|
226
|
+
/* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
|
|
227
|
+
/* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
|
|
228
|
+
" open"
|
|
229
|
+
] }),
|
|
230
|
+
/* @__PURE__ */ jsxs("span", { className: "octo-cmdk__footer-hint", children: [
|
|
231
|
+
/* @__PURE__ */ jsx(Kbd, { children: "\u2318" }),
|
|
232
|
+
/* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
|
|
233
|
+
" open in new tab"
|
|
234
|
+
] })
|
|
235
|
+
] })
|
|
236
|
+
]
|
|
253
237
|
}
|
|
254
|
-
);
|
|
238
|
+
) });
|
|
255
239
|
}
|
|
256
240
|
export {
|
|
257
241
|
CommandK,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../components/CommandK/CommandK.tsx"],"sourcesContent":["// CommandK — global ⌘K palette overlay.\n// Result sections: entries (`searchEntries`) + branches (`listCMSBranches`)\n// + a static Actions list. Media + Content Model search are out of scope.\n'use client';\n\nimport * as React from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useRouter } from 'next/navigation';\nimport { Bot, FileText, GitBranch, Plus, Search } from 'lucide-react';\n\nimport { getEntryList } from '../../admin/actions/entries';\nimport { getFile } from '../../admin/actions/files';\nimport { listCMSBranches, searchEntries, type CMSBranch, type SearchResult } from '../../admin/actions';\nimport { queryKeys } from '../../admin/query/keys';\nimport { useConfig } from '../../hooks/useConfig';\nimport { entryAdminHref } from '../../lib/searchIndex';\nimport { Kbd } from '../ui';\nimport { RowItem, Section } from './parts';\n\ntype CommandKProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n};\n\nexport function useCommandK() {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const mod = isMac ? e.metaKey : e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n setOpen((v) => !v);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n return { open, setOpen };\n}\n\ntype Action = {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n kbd?: string[];\n};\n\nconst ACTIONS: Action[] = [\n { id: 'new-entry', label: 'New entry', icon: <Plus size={14} />, href: '/cms/content', kbd: ['⌘', 'N'] },\n { id: 'agent', label: 'Ask the agent', icon: <Bot size={14} />, href: '/cms/chat', kbd: ['⌘', 'J'] },\n];\n\ntype Row =\n | { kind: 'entry'; result: SearchResult }\n | { kind: 'branch'; branch: CMSBranch }\n | { kind: 'action'; action: Action };\n\nexport function CommandK({ open, onOpenChange }: CommandKProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const config = useConfig();\n const [query, setQuery] = React.useState('');\n const [entries, setEntries] = React.useState<SearchResult[]>([]);\n const [branches, setBranches] = React.useState<CMSBranch[]>([]);\n const [activeIndex, setActiveIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Reset state when palette opens; focus input.\n React.useEffect(() => {\n if (!open) return;\n setQuery('');\n setEntries([]);\n setActiveIndex(0);\n listCMSBranches()\n .then(setBranches)\n .catch(() => setBranches([]));\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n // Debounced entry search.\n React.useEffect(() => {\n if (!open) return;\n const q = query.trim();\n if (!q) {\n setEntries([]);\n return;\n }\n const timer = setTimeout(() => {\n searchEntries(q)\n .then(setEntries)\n .catch(() => setEntries([]));\n }, 120);\n return () => clearTimeout(timer);\n }, [query, open]);\n\n // Build flat row list for keyboard navigation.\n const matchingBranches = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return branches.slice(0, 5);\n return branches.filter((b) => b.branch.toLowerCase().includes(q)).slice(0, 5);\n }, [branches, query]);\n\n const matchingActions = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return ACTIONS;\n return ACTIONS.filter((a) => a.label.toLowerCase().includes(q));\n }, [query]);\n\n const rows: Row[] = React.useMemo(\n () => [\n ...entries.map((r): Row => ({ kind: 'entry', result: r })),\n ...matchingBranches.map((b): Row => ({ kind: 'branch', branch: b })),\n ...matchingActions.map((a): Row => ({ kind: 'action', action: a })),\n ],\n [entries, matchingBranches, matchingActions],\n );\n\n const prefetchEntryHit = React.useCallback(\n (r: SearchResult) => {\n const [type, ...rest] = r.id.split('/');\n const stem = rest.join('/');\n if (!type || !stem) return;\n const filePath = `${config.contentFolder}/${type}/${stem}.json`;\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.detail(filePath),\n queryFn: () => getFile(filePath),\n });\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.list(type),\n queryFn: () => getEntryList(type),\n });\n },\n [config.contentFolder, queryClient],\n );\n\n React.useEffect(() => {\n if (activeIndex >= rows.length) setActiveIndex(0);\n }, [rows.length, activeIndex]);\n\n React.useEffect(() => {\n const row = rows[activeIndex];\n if (row?.kind === 'entry') prefetchEntryHit(row.result);\n }, [activeIndex, rows, prefetchEntryHit]);\n\n const runRow = React.useCallback(\n (row: Row, modifier?: boolean) => {\n onOpenChange(false);\n if (row.kind === 'entry') {\n // Always open the entry editor — never the public URL.\n router.push(entryAdminHref(row.result));\n } else if (row.kind === 'branch') {\n if (row.branch.prUrl && modifier) window.open(row.branch.prUrl, '_blank');\n } else if (row.action.href) {\n router.push(row.action.href);\n }\n },\n [onOpenChange, router],\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n onOpenChange(false);\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, rows.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const row = rows[activeIndex];\n if (row) runRow(row, e.metaKey || e.ctrlKey);\n }\n };\n\n if (!open) return null;\n\n let runningIndex = -1;\n\n return (\n <div\n className=\"fixed inset-0 z-[200] flex items-start justify-center bg-black/40 px-4 pt-[12vh] backdrop-blur-sm\"\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={() => onOpenChange(false)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onOpenChange(false);\n }}\n >\n <div\n className=\"w-full max-w-[720px] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--surface-1)]\"\n style={{ boxShadow: 'var(--shadow-3)' }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center gap-3 border-b border-[var(--border)] px-4 py-3.5\">\n <Search size={18} className=\"text-[var(--muted)]\" />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Search entries, branches…\"\n className=\"flex-1 border-0 bg-transparent text-base text-[var(--text)] outline-none\"\n />\n <Kbd>Esc</Kbd>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-2\">\n {entries.length > 0 && (\n <Section label={`Entries · ${entries.length}`}>\n {entries.map((r) => {\n runningIndex += 1;\n const idx = runningIndex;\n const adminHref = entryAdminHref(r);\n return (\n <RowItem\n key={`e-${r.id}`}\n icon={<FileText size={14} />}\n title={r.title}\n sub={adminHref}\n badge={r.typeLabel}\n active={idx === activeIndex}\n href={adminHref}\n onMouseEnter={() => {\n setActiveIndex(idx);\n prefetchEntryHit(r);\n }}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingBranches.length > 0 && (\n <Section label={`Branches · ${matchingBranches.length}`}>\n {matchingBranches.map((b) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`b-${b.branch}`}\n icon={<GitBranch size={14} />}\n title={b.branch}\n sub={b.isPublished ? 'Published · live' : b.prUrl ? 'Open PR' : 'Branch'}\n mono\n active={idx === activeIndex}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={(e) => runRow({ kind: 'branch', branch: b }, e.metaKey || e.ctrlKey)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingActions.length > 0 && (\n <Section label=\"Actions\">\n {matchingActions.map((a) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`a-${a.id}`}\n icon={a.icon}\n title={a.label}\n kbd={a.kbd}\n active={idx === activeIndex}\n href={a.href}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {rows.length === 0 && (\n <div className=\"px-4 py-8 text-center text-sm text-[var(--muted)]\">\n {query.trim() ? 'No results' : 'Start typing to search…'}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center gap-4 border-t border-[var(--border)] bg-[var(--surface-2)] px-4 py-2.5 text-xs text-[var(--muted)]\">\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd> navigate\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>↵</Kbd> open\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Kbd>⌘</Kbd>\n <Kbd>↵</Kbd> open in new tab\n </span>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../components/CommandK/CommandK.tsx"],"sourcesContent":["// CommandK — global ⌘K palette overlay.\n// Result sections: entries (`searchEntries`) + branches (`listCMSBranches`)\n// + a static Actions list. Media + Content Model search are out of scope.\n'use client';\n\nimport * as React from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useRouter } from 'next/navigation';\nimport { Dialog, DialogContent, Icon, Kbd } from '../ui';\n\nimport { getEntryList } from '../../admin/actions/entries';\nimport { getFile } from '../../admin/actions/files';\nimport { listCMSBranches, searchEntries, type CMSBranch, type SearchResult } from '../../admin/actions';\nimport { queryKeys } from '../../admin/query/keys';\nimport { useConfig } from '../../hooks/useConfig';\nimport { entryAdminHref } from '../../lib/searchIndex';\nimport { RowItem, Section } from './parts';\n\ntype CommandKProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n};\n\nexport function useCommandK() {\n const [open, setOpen] = React.useState(false);\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const mod = isMac ? e.metaKey : e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n setOpen((v) => !v);\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n return { open, setOpen };\n}\n\ntype Action = {\n id: string;\n label: string;\n icon: React.ReactNode;\n href?: string;\n kbd?: string[];\n};\n\nconst ACTIONS: Action[] = [\n { id: 'new-entry', label: 'New entry', icon: <Icon.Plus size={14} />, href: '/cms/content', kbd: ['⌘', 'N'] },\n { id: 'agent', label: 'Ask the agent', icon: <Icon.Bot size={14} />, href: '/cms/chat', kbd: ['⌘', 'J'] },\n];\n\ntype Row =\n | { kind: 'entry'; result: SearchResult }\n | { kind: 'branch'; branch: CMSBranch }\n | { kind: 'action'; action: Action };\n\nexport function CommandK({ open, onOpenChange }: CommandKProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const config = useConfig();\n const [query, setQuery] = React.useState('');\n const [entries, setEntries] = React.useState<SearchResult[]>([]);\n const [branches, setBranches] = React.useState<CMSBranch[]>([]);\n const [activeIndex, setActiveIndex] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Reset state when palette opens; focus input.\n React.useEffect(() => {\n if (!open) return;\n setQuery('');\n setEntries([]);\n setActiveIndex(0);\n listCMSBranches()\n .then(setBranches)\n .catch(() => setBranches([]));\n requestAnimationFrame(() => inputRef.current?.focus());\n }, [open]);\n\n // Debounced entry search.\n React.useEffect(() => {\n if (!open) return;\n const q = query.trim();\n if (!q) {\n setEntries([]);\n return;\n }\n const timer = setTimeout(() => {\n searchEntries(q)\n .then(setEntries)\n .catch(() => setEntries([]));\n }, 120);\n return () => clearTimeout(timer);\n }, [query, open]);\n\n // Build flat row list for keyboard navigation.\n const matchingBranches = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return branches.slice(0, 5);\n return branches.filter((b) => b.branch.toLowerCase().includes(q)).slice(0, 5);\n }, [branches, query]);\n\n const matchingActions = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return ACTIONS;\n return ACTIONS.filter((a) => a.label.toLowerCase().includes(q));\n }, [query]);\n\n const rows: Row[] = React.useMemo(\n () => [\n ...entries.map((r): Row => ({ kind: 'entry', result: r })),\n ...matchingBranches.map((b): Row => ({ kind: 'branch', branch: b })),\n ...matchingActions.map((a): Row => ({ kind: 'action', action: a })),\n ],\n [entries, matchingBranches, matchingActions],\n );\n\n const prefetchEntryHit = React.useCallback(\n (r: SearchResult) => {\n const [type, ...rest] = r.id.split('/');\n const stem = rest.join('/');\n if (!type || !stem) return;\n const filePath = `${config.contentFolder}/${type}/${stem}.json`;\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.detail(filePath),\n queryFn: () => getFile(filePath),\n });\n void queryClient.prefetchQuery({\n queryKey: queryKeys.entries.list(type),\n queryFn: () => getEntryList(type),\n });\n },\n [config.contentFolder, queryClient],\n );\n\n React.useEffect(() => {\n if (activeIndex >= rows.length) setActiveIndex(0);\n }, [rows.length, activeIndex]);\n\n React.useEffect(() => {\n const row = rows[activeIndex];\n if (row?.kind === 'entry') prefetchEntryHit(row.result);\n }, [activeIndex, rows, prefetchEntryHit]);\n\n const runRow = React.useCallback(\n (row: Row, modifier?: boolean) => {\n onOpenChange(false);\n if (row.kind === 'entry') {\n // Always open the entry editor — never the public URL.\n router.push(entryAdminHref(row.result));\n } else if (row.kind === 'branch') {\n if (row.branch.prUrl && modifier) window.open(row.branch.prUrl, '_blank');\n } else if (row.action.href) {\n router.push(row.action.href);\n }\n },\n [onOpenChange, router],\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n onOpenChange(false);\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, rows.length - 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const row = rows[activeIndex];\n if (row) runRow(row, e.metaKey || e.ctrlKey);\n }\n };\n\n let runningIndex = -1;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"octo-cmdk__dialog octo-dialog-content octo-dialog-content--3xl octo-dialog-content--no-padding octo-dialog-content--overflow-hidden\"\n aria-label=\"Command palette\"\n >\n <div className=\"octo-cmdk__input-row\">\n <Icon.Search size={18} className=\"octo-cmdk__input-icon\" />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Search entries, branches…\"\n className=\"octo-cmdk__input\"\n />\n <Kbd>Esc</Kbd>\n </div>\n\n <div className=\"octo-cmdk__results\">\n {entries.length > 0 && (\n <Section label={`Entries · ${entries.length}`}>\n {entries.map((r) => {\n runningIndex += 1;\n const idx = runningIndex;\n const adminHref = entryAdminHref(r);\n return (\n <RowItem\n key={`e-${r.id}`}\n icon={<Icon.FileText size={14} />}\n title={r.title}\n sub={adminHref}\n badge={r.typeLabel}\n active={idx === activeIndex}\n href={adminHref}\n onMouseEnter={() => {\n setActiveIndex(idx);\n prefetchEntryHit(r);\n }}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingBranches.length > 0 && (\n <Section label={`Branches · ${matchingBranches.length}`}>\n {matchingBranches.map((b) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`b-${b.branch}`}\n icon={<Icon.GitBranch size={14} />}\n title={b.branch}\n sub={b.isPublished ? 'Published · live' : b.prUrl ? 'Open PR' : 'Branch'}\n mono\n active={idx === activeIndex}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={(e) => runRow({ kind: 'branch', branch: b }, e.metaKey || e.ctrlKey)}\n />\n );\n })}\n </Section>\n )}\n\n {matchingActions.length > 0 && (\n <Section label=\"Actions\">\n {matchingActions.map((a) => {\n runningIndex += 1;\n const idx = runningIndex;\n return (\n <RowItem\n key={`a-${a.id}`}\n icon={a.icon}\n title={a.label}\n kbd={a.kbd}\n active={idx === activeIndex}\n href={a.href}\n onMouseEnter={() => setActiveIndex(idx)}\n onClick={() => onOpenChange(false)}\n />\n );\n })}\n </Section>\n )}\n\n {rows.length === 0 && (\n <div className=\"octo-cmdk__empty\">{query.trim() ? 'No results' : 'Start typing to search…'}</div>\n )}\n </div>\n\n <div className=\"octo-cmdk__footer\">\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd> navigate\n </span>\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>↵</Kbd> open\n </span>\n <span className=\"octo-cmdk__footer-hint\">\n <Kbd>⌘</Kbd>\n <Kbd>↵</Kbd> open in new tab\n </span>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../components/CommandK/parts.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../components/CommandK/parts.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAOxF;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,YAAY,2CAoChH"}
|
|
@@ -2,26 +2,24 @@
|
|
|
2
2
|
import "../../chunk-B5LE2OEC.js";
|
|
3
3
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import Link from "next/link";
|
|
5
|
-
import { cn } from "../../lib/utils";
|
|
6
5
|
import { Kbd } from "../ui";
|
|
7
6
|
function Section({ label, children }) {
|
|
8
|
-
return /* @__PURE__ */ jsxs("div", { className: "
|
|
9
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "octo-cmdk__section", children: [
|
|
8
|
+
/* @__PURE__ */ jsx("div", { className: "octo-cmdk__section-label", children: label }),
|
|
10
9
|
children
|
|
11
10
|
] });
|
|
12
11
|
}
|
|
13
|
-
const ROW_CLASSES = "flex w-full cursor-pointer items-center gap-3 border-0 bg-transparent px-4 py-2.5 text-left no-underline";
|
|
14
12
|
function RowItem({ icon, title, sub, badge, kbd, mono, active, href, onMouseEnter, onClick }) {
|
|
13
|
+
const className = `octo-cmdk__item${active ? " octo-cmdk__item octo-cmdk__item--active" : ""}`;
|
|
15
14
|
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
16
|
-
/* @__PURE__ */ jsx("span", { className: "
|
|
17
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
18
|
-
/* @__PURE__ */ jsx("div", { className:
|
|
19
|
-
sub && /* @__PURE__ */ jsx("div", { className: "
|
|
15
|
+
/* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-icon", children: icon }),
|
|
16
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-cmdk__item-body", children: [
|
|
17
|
+
/* @__PURE__ */ jsx("div", { className: `octo-cmdk__item-label${mono ? " octo-cmdk__item-label octo-cmdk__item-label--mono" : ""}`, children: title }),
|
|
18
|
+
sub && /* @__PURE__ */ jsx("div", { className: "octo-cmdk__item-meta", children: sub })
|
|
20
19
|
] }),
|
|
21
|
-
badge && /* @__PURE__ */ jsx("span", { className: "
|
|
22
|
-
kbd && /* @__PURE__ */ jsx("span", { className: "
|
|
20
|
+
badge && /* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-badge", children: badge }),
|
|
21
|
+
kbd && /* @__PURE__ */ jsx("span", { className: "octo-cmdk__item-kbd", children: kbd.map((k, i) => /* @__PURE__ */ jsx(Kbd, { children: k }, i)) })
|
|
23
22
|
] });
|
|
24
|
-
const className = cn(ROW_CLASSES, active && "bg-[var(--surface-2)]");
|
|
25
23
|
if (href) {
|
|
26
24
|
return /* @__PURE__ */ jsx(Link, { href, className, onMouseEnter, onClick, children: inner });
|
|
27
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../components/CommandK/parts.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport Link from 'next/link';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../components/CommandK/parts.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport Link from 'next/link';\n\nimport { Kbd } from '../ui';\n\nexport function Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"octo-cmdk__section\">\n <div className=\"octo-cmdk__section-label\">{label}</div>\n {children}\n </div>\n );\n}\n\nexport type RowItemProps = {\n icon: React.ReactNode;\n title: string;\n sub?: string;\n badge?: string;\n kbd?: string[];\n mono?: boolean;\n active?: boolean;\n /** When provided, the row renders as a `<Link>` so the browser owns navigation. */\n href?: string;\n onMouseEnter?: () => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nexport function RowItem({ icon, title, sub, badge, kbd, mono, active, href, onMouseEnter, onClick }: RowItemProps) {\n const className = `octo-cmdk__item${active ? ' octo-cmdk__item octo-cmdk__item--active' : ''}`;\n\n const inner = (\n <>\n <span className=\"octo-cmdk__item-icon\">{icon}</span>\n <div className=\"octo-cmdk__item-body\">\n <div className={`octo-cmdk__item-label${mono ? ' octo-cmdk__item-label octo-cmdk__item-label--mono' : ''}`}>\n {title}\n </div>\n {sub && <div className=\"octo-cmdk__item-meta\">{sub}</div>}\n </div>\n {badge && <span className=\"octo-cmdk__item-badge\">{badge}</span>}\n {kbd && (\n <span className=\"octo-cmdk__item-kbd\">\n {kbd.map((k, i) => (\n <Kbd key={i}>{k}</Kbd>\n ))}\n </span>\n )}\n </>\n );\n\n if (href) {\n return (\n <Link href={href} className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </Link>\n );\n }\n\n return (\n <button type=\"button\" className={className} onMouseEnter={onMouseEnter} onClick={onClick}>\n {inner}\n </button>\n );\n}\n"],"mappings":";;AASI,SAyBA,UAxBE,KADF;AANJ,OAAO,UAAU;AAEjB,SAAS,WAAW;AAEb,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAiD;AACzF,SACE,qBAAC,SAAI,WAAU,sBACb;AAAA,wBAAC,SAAI,WAAU,4BAA4B,iBAAM;AAAA,IAChD;AAAA,KACH;AAEJ;AAgBO,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM,QAAQ,MAAM,cAAc,QAAQ,GAAiB;AACjH,QAAM,YAAY,kBAAkB,SAAS,6CAA6C,EAAE;AAE5F,QAAM,QACJ,iCACE;AAAA,wBAAC,UAAK,WAAU,wBAAwB,gBAAK;AAAA,IAC7C,qBAAC,SAAI,WAAU,wBACb;AAAA,0BAAC,SAAI,WAAW,wBAAwB,OAAO,uDAAuD,EAAE,IACrG,iBACH;AAAA,MACC,OAAO,oBAAC,SAAI,WAAU,wBAAwB,eAAI;AAAA,OACrD;AAAA,IACC,SAAS,oBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,IACxD,OACC,oBAAC,UAAK,WAAU,uBACb,cAAI,IAAI,CAAC,GAAG,MACX,oBAAC,OAAa,eAAJ,CAAM,CACjB,GACH;AAAA,KAEJ;AAGF,MAAI,MAAM;AACR,WACE,oBAAC,QAAK,MAAY,WAAsB,cAA4B,SACjE,iBACH;AAAA,EAEJ;AAEA,SACE,oBAAC,YAAO,MAAK,UAAS,WAAsB,cAA4B,SACrE,iBACH;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionalBranchesEditor.d.ts","sourceRoot":"","sources":["../../../components/ContentModel/ConditionalBranchesEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ConditionalBranchesEditor.d.ts","sourceRoot":"","sources":["../../../components/ContentModel/ConditionalBranchesEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAK5E,UAAU,KAAK;IACb,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,IAAI,CAAC;IACpD,iEAAiE;IACjE,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;+CAC2C;IAC3C,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,eAAe,GAAG,IAAI,EAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,KAChD,IAAI,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,QAAQ,GACT,EAAE,KAAK,2CA6LP;AAiGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|