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,20 +1,30 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
__spreadValues
|
|
4
|
+
} from "../../chunk-B5LE2OEC.js";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
6
|
import { useEffect, useMemo, useRef } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
7
|
+
import { Button, Icon } from "../ui";
|
|
8
|
+
import { ErrorBoundary } from "../ErrorBoundary/ErrorBoundary";
|
|
9
|
+
import { Page } from "../Layout/Page";
|
|
10
|
+
import { ChatAgentSetup } from "./ChatAgentSetup";
|
|
11
|
+
import { ChatSidebar } from "./ChatSidebar";
|
|
8
12
|
import { Composer } from "./Composer";
|
|
9
13
|
import { Message } from "./Message";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
16
|
-
|
|
14
|
+
import { useChatHistory } from "./useChatHistory";
|
|
15
|
+
function ChatPage(props) {
|
|
16
|
+
if (props.mode === "setup") {
|
|
17
|
+
return /* @__PURE__ */ jsx(ChatAgentSetup, { setup: props.setup });
|
|
18
|
+
}
|
|
19
|
+
return /* @__PURE__ */ jsx(ChatPageReady, __spreadValues({}, props));
|
|
20
|
+
}
|
|
21
|
+
function ChatPageReady({ initialMeta, attachmentLimits }) {
|
|
17
22
|
var _a, _b;
|
|
23
|
+
const PROVIDER_LABEL = {
|
|
24
|
+
anthropic: "Anthropic",
|
|
25
|
+
openai: "OpenAI",
|
|
26
|
+
local: "Local"
|
|
27
|
+
};
|
|
18
28
|
const {
|
|
19
29
|
entries,
|
|
20
30
|
meta,
|
|
@@ -25,12 +35,16 @@ function ChatPage({ initialMeta, attachmentLimits }) {
|
|
|
25
35
|
proposals,
|
|
26
36
|
attachmentDiagnostics,
|
|
27
37
|
send,
|
|
28
|
-
reset,
|
|
29
38
|
stop,
|
|
30
39
|
acceptProposal,
|
|
31
40
|
rejectProposal,
|
|
32
|
-
acceptAllPending
|
|
33
|
-
|
|
41
|
+
acceptAllPending,
|
|
42
|
+
sessions,
|
|
43
|
+
activeId,
|
|
44
|
+
newConversation,
|
|
45
|
+
selectSession,
|
|
46
|
+
deleteSession
|
|
47
|
+
} = useChatHistory();
|
|
34
48
|
const scrollerRef = useRef(null);
|
|
35
49
|
useEffect(() => {
|
|
36
50
|
const el = scrollerRef.current;
|
|
@@ -51,19 +65,13 @@ function ChatPage({ initialMeta, attachmentLimits }) {
|
|
|
51
65
|
(p) => p.assistantEntryId === latestAssistantId && p.status.kind === "pending"
|
|
52
66
|
);
|
|
53
67
|
}, [proposals, latestAssistantId]);
|
|
54
|
-
return /* @__PURE__ */
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
PROVIDER_LABEL[provider],
|
|
62
|
-
" \xB7 ",
|
|
63
|
-
/* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: model })
|
|
64
|
-
] })
|
|
65
|
-
] }),
|
|
66
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
Page,
|
|
70
|
+
{
|
|
71
|
+
className: "octo-chat-page",
|
|
72
|
+
title: "Chat",
|
|
73
|
+
breadcrumbs: [{ label: `${PROVIDER_LABEL[provider]} \xB7 ${model}` }],
|
|
74
|
+
actions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
67
75
|
/* @__PURE__ */ jsx(
|
|
68
76
|
UsageBadge,
|
|
69
77
|
{
|
|
@@ -76,106 +84,100 @@ function ChatPage({ initialMeta, attachmentLimits }) {
|
|
|
76
84
|
Button,
|
|
77
85
|
{
|
|
78
86
|
variant: "destructive",
|
|
79
|
-
size: "sm",
|
|
80
87
|
onClick: stop,
|
|
81
|
-
className: "gap-1
|
|
88
|
+
className: "octo-u-gap-1-5",
|
|
82
89
|
"data-testid": "chat-stop-button",
|
|
83
90
|
"aria-label": "Stop generating",
|
|
84
91
|
title: "Stop the assistant \u2014 keeps whatever it has streamed so far",
|
|
85
92
|
children: [
|
|
86
|
-
/* @__PURE__ */ jsx(StopCircle, { className: "
|
|
93
|
+
/* @__PURE__ */ jsx(Icon.StopCircle, { className: "octo-icon-sm" }),
|
|
87
94
|
"Stop"
|
|
88
95
|
]
|
|
89
96
|
}
|
|
90
|
-
) : /* @__PURE__ */ jsxs(Button, { variant: "
|
|
91
|
-
/* @__PURE__ */ jsx(
|
|
97
|
+
) : /* @__PURE__ */ jsxs(Button, { variant: "primary", onClick: newConversation, children: [
|
|
98
|
+
/* @__PURE__ */ jsx(Icon.Plus, { className: "octo-icon-sm" }),
|
|
92
99
|
"New conversation"
|
|
93
100
|
] })
|
|
94
|
-
] })
|
|
95
|
-
] }),
|
|
96
|
-
/* @__PURE__ */ jsx("div", { ref: scrollerRef, className: "flex-1 overflow-y-auto px-4", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl py-4", children: [
|
|
97
|
-
entries.length === 0 && /* @__PURE__ */ jsxs("div", { className: "mt-12 text-center text-sm text-muted-foreground", children: [
|
|
98
|
-
/* @__PURE__ */ jsx(Bot, { className: "mx-auto mb-3 h-8 w-8 opacity-50" }),
|
|
99
|
-
/* @__PURE__ */ jsx("div", { className: "font-medium", children: "Ask your CMS anything." }),
|
|
100
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-1", children: [
|
|
101
|
-
"Try: ",
|
|
102
|
-
/* @__PURE__ */ jsx("em", { children: '"show me posts about caching"' }),
|
|
103
|
-
" or ",
|
|
104
|
-
/* @__PURE__ */ jsx("em", { children: `"fix the typo 'recieve' in any post"` }),
|
|
105
|
-
"."
|
|
106
|
-
] })
|
|
107
101
|
] }),
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
102
|
+
leftBar: /* @__PURE__ */ jsx(ChatSidebar, { sessions, activeId, onSelect: selectSession, onDelete: deleteSession }),
|
|
103
|
+
children: /* @__PURE__ */ jsxs("div", { className: "octo-chat", children: [
|
|
104
|
+
/* @__PURE__ */ jsx("div", { ref: scrollerRef, className: "octo-chat__scroller", children: /* @__PURE__ */ jsxs("div", { className: "octo-chat__transcript", children: [
|
|
105
|
+
entries.length === 0 && /* @__PURE__ */ jsxs("div", { className: "octo-chat__empty", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(Icon.Bot, { className: "octo-chat__empty-icon octo-icon-xl" }),
|
|
107
|
+
/* @__PURE__ */ jsx("div", { className: "octo-chat__empty-title", children: "Ask your CMS anything." }),
|
|
108
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-chat__empty-hint", children: [
|
|
109
|
+
"Try: ",
|
|
110
|
+
/* @__PURE__ */ jsx("em", { children: '"show me posts about caching"' }),
|
|
111
|
+
" or ",
|
|
112
|
+
/* @__PURE__ */ jsx("em", { children: `"fix the typo 'recieve' in any post"` }),
|
|
113
|
+
"."
|
|
114
|
+
] })
|
|
115
|
+
] }),
|
|
116
|
+
entries.map((e) => /* @__PURE__ */ jsx(ErrorBoundary, { label: "message", resetKeys: [e.id], children: /* @__PURE__ */ jsx(
|
|
117
|
+
Message,
|
|
118
|
+
{
|
|
119
|
+
entry: e,
|
|
120
|
+
proposals,
|
|
121
|
+
onAcceptProposal: acceptProposal,
|
|
122
|
+
onRejectProposal: rejectProposal
|
|
123
|
+
}
|
|
124
|
+
) }, e.id)),
|
|
125
|
+
pendingForLatest.length >= 2 && status !== "streaming" && /* @__PURE__ */ jsxs("div", { className: "octo-chat__accept-all-bar", children: [
|
|
126
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
127
|
+
/* @__PURE__ */ jsx("strong", { children: pendingForLatest.length }),
|
|
128
|
+
" proposals pending in this turn."
|
|
129
|
+
] }),
|
|
130
|
+
/* @__PURE__ */ jsxs(
|
|
131
|
+
Button,
|
|
132
|
+
{
|
|
133
|
+
onClick: () => latestAssistantId && acceptAllPending(latestAssistantId),
|
|
134
|
+
className: "octo-u-gap-1-5",
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsx(Icon.CheckCheck, { className: "octo-icon-sm" }),
|
|
137
|
+
"Accept all pending"
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
] }),
|
|
142
|
+
attachmentDiagnostics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "octo-chat__attachment-diag", children: [
|
|
143
|
+
/* @__PURE__ */ jsx("div", { className: "octo-chat__attachment-diag-title", children: "Attachments" }),
|
|
144
|
+
/* @__PURE__ */ jsx("ul", { className: "octo-chat__attachment-diag-list", children: attachmentDiagnostics.map((d, i) => /* @__PURE__ */ jsx("li", { children: d.status === "ok" ? /* @__PURE__ */ jsxs("span", { children: [
|
|
145
|
+
"\u2713 ",
|
|
146
|
+
/* @__PURE__ */ jsx("span", { className: "octo-u-mono", children: d.filename }),
|
|
147
|
+
" (",
|
|
148
|
+
d.kind,
|
|
149
|
+
")"
|
|
150
|
+
] }) : /* @__PURE__ */ jsxs("span", { className: "octo-chat__attachment-diag-error", children: [
|
|
151
|
+
"\u2717 ",
|
|
152
|
+
/* @__PURE__ */ jsx("span", { className: "octo-u-mono", children: d.filename }),
|
|
153
|
+
" \u2014 ",
|
|
154
|
+
d.reason
|
|
155
|
+
] }) }, i)) })
|
|
156
|
+
] }),
|
|
157
|
+
status === "stopped" && /* @__PURE__ */ jsx("div", { className: "octo-chat__status-bar", role: "status", children: "Stopped \u2014 the assistant was interrupted. Send another message to continue." }),
|
|
158
|
+
status === "error" && error && /* @__PURE__ */ jsx("div", { className: "octo-chat__error-bar", children: error }),
|
|
159
|
+
status === "budget_exceeded" && /* @__PURE__ */ jsxs("div", { className: "octo-chat__budget-bar", children: [
|
|
160
|
+
"Budget reached (",
|
|
161
|
+
budgetReason != null ? budgetReason : "unknown",
|
|
162
|
+
"). Click ",
|
|
163
|
+
/* @__PURE__ */ jsx("strong", { children: "New conversation" }),
|
|
164
|
+
" to start over, or raise the caps in ",
|
|
165
|
+
/* @__PURE__ */ jsx("code", { children: "cms/octocms.config.ts" }),
|
|
166
|
+
"."
|
|
167
|
+
] })
|
|
168
|
+
] }) }),
|
|
169
|
+
/* @__PURE__ */ jsx(ErrorBoundary, { label: "composer", children: /* @__PURE__ */ jsx(
|
|
170
|
+
Composer,
|
|
124
171
|
{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
/* @__PURE__ */ jsx(CheckCheck, { className: "h-3.5 w-3.5" }),
|
|
130
|
-
"Accept all pending"
|
|
131
|
-
]
|
|
172
|
+
disabled: status === "streaming" || status === "budget_exceeded",
|
|
173
|
+
maxAttachmentBytes: attachmentLimits.maxAttachmentBytes,
|
|
174
|
+
maxAttachmentsPerTurn: attachmentLimits.maxAttachmentsPerTurn,
|
|
175
|
+
onSubmit: send
|
|
132
176
|
}
|
|
133
|
-
)
|
|
134
|
-
] }),
|
|
135
|
-
attachmentDiagnostics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs", children: [
|
|
136
|
-
/* @__PURE__ */ jsx("div", { className: "font-medium mb-1", children: "Attachments" }),
|
|
137
|
-
/* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: attachmentDiagnostics.map((d, i) => /* @__PURE__ */ jsx("li", { children: d.status === "ok" ? /* @__PURE__ */ jsxs("span", { children: [
|
|
138
|
-
"\u2713 ",
|
|
139
|
-
/* @__PURE__ */ jsx("span", { className: "font-mono", children: d.filename }),
|
|
140
|
-
" (",
|
|
141
|
-
d.kind,
|
|
142
|
-
")"
|
|
143
|
-
] }) : /* @__PURE__ */ jsxs("span", { className: "text-destructive", children: [
|
|
144
|
-
"\u2717 ",
|
|
145
|
-
/* @__PURE__ */ jsx("span", { className: "font-mono", children: d.filename }),
|
|
146
|
-
" \u2014 ",
|
|
147
|
-
d.reason
|
|
148
|
-
] }) }, i)) })
|
|
149
|
-
] }),
|
|
150
|
-
status === "stopped" && /* @__PURE__ */ jsx(
|
|
151
|
-
"div",
|
|
152
|
-
{
|
|
153
|
-
className: "my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground",
|
|
154
|
-
role: "status",
|
|
155
|
-
children: "Stopped \u2014 the assistant was interrupted. Send another message to continue."
|
|
156
|
-
}
|
|
157
|
-
),
|
|
158
|
-
status === "error" && error && /* @__PURE__ */ jsx("div", { className: "my-3 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive", children: error }),
|
|
159
|
-
status === "budget_exceeded" && /* @__PURE__ */ jsxs("div", { className: "my-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900", children: [
|
|
160
|
-
"Budget reached (",
|
|
161
|
-
budgetReason != null ? budgetReason : "unknown",
|
|
162
|
-
"). Click ",
|
|
163
|
-
/* @__PURE__ */ jsx("strong", { children: "New conversation" }),
|
|
164
|
-
" to start over, or raise the caps in ",
|
|
165
|
-
/* @__PURE__ */ jsx("code", { children: "cms/octocms.config.ts" }),
|
|
166
|
-
"."
|
|
177
|
+
) })
|
|
167
178
|
] })
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
Composer,
|
|
171
|
-
{
|
|
172
|
-
disabled: status === "streaming" || status === "budget_exceeded",
|
|
173
|
-
maxAttachmentBytes: attachmentLimits.maxAttachmentBytes,
|
|
174
|
-
maxAttachmentsPerTurn: attachmentLimits.maxAttachmentsPerTurn,
|
|
175
|
-
onSubmit: send
|
|
176
|
-
}
|
|
177
|
-
) })
|
|
178
|
-
] });
|
|
179
|
+
}
|
|
180
|
+
);
|
|
179
181
|
}
|
|
180
182
|
function UsageBadge({
|
|
181
183
|
totalCostUSD,
|
|
@@ -183,21 +185,14 @@ function UsageBadge({
|
|
|
183
185
|
outputTokens
|
|
184
186
|
}) {
|
|
185
187
|
const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : "free";
|
|
186
|
-
return /* @__PURE__ */ jsxs(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
cost,
|
|
193
|
-
" \xB7 ",
|
|
194
|
-
inputTokens + outputTokens,
|
|
195
|
-
" tok"
|
|
196
|
-
]
|
|
197
|
-
}
|
|
198
|
-
);
|
|
188
|
+
return /* @__PURE__ */ jsxs("span", { className: "octo-chat__usage-badge", title: `Input: ${inputTokens} tokens \xB7 Output: ${outputTokens} tokens`, children: [
|
|
189
|
+
cost,
|
|
190
|
+
" \xB7 ",
|
|
191
|
+
inputTokens + outputTokens,
|
|
192
|
+
" tok"
|
|
193
|
+
] });
|
|
199
194
|
}
|
|
200
195
|
export {
|
|
201
|
-
ChatPage
|
|
196
|
+
ChatPage as default
|
|
202
197
|
};
|
|
203
198
|
//# sourceMappingURL=ChatPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../components/Chat/ChatPage.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Bot, CheckCheck, RefreshCw, StopCircle } from 'lucide-react';\n\nimport { Button } from '../ui/button';\nimport { ErrorBoundary } from '../ErrorBoundary';\n\nimport { Composer } from './Composer';\nimport { Message } from './Message';\nimport { useChatStream } from './useChatStream';\n\ntype Props = {\n /** Initial provider info — used until the SSE `meta` event arrives. */\n initialMeta: { provider: 'anthropic' | 'openai' | 'local'; model: string };\n /** Attachment caps from `agentConfig` — drive Composer UI validation. */\n attachmentLimits: { maxAttachmentBytes: number; maxAttachmentsPerTurn: number };\n};\n\nconst PROVIDER_LABEL: Record<'anthropic' | 'openai' | 'local', string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n local: 'Local',\n};\n\nexport function ChatPage({ initialMeta, attachmentLimits }: Props) {\n const {\n entries,\n meta,\n usage,\n status,\n error,\n budgetReason,\n proposals,\n attachmentDiagnostics,\n send,\n reset,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n } = useChatStream();\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, [entries, status]);\n\n const provider = meta?.provider ?? initialMeta.provider;\n const model = meta?.model ?? initialMeta.model;\n\n // Identify the latest assistant turn so we can show \"Accept all pending\"\n // when ≥2 proposals are outstanding for it.\n const latestAssistantId = useMemo(() => {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].kind === 'assistant') return entries[i].id;\n }\n return null;\n }, [entries]);\n const pendingForLatest = useMemo(() => {\n if (!latestAssistantId) return [];\n return Object.values(proposals).filter(\n (p) => p.assistantEntryId === latestAssistantId && p.status.kind === 'pending',\n );\n }, [proposals, latestAssistantId]);\n\n return (\n <div className=\"flex h-[calc(100dvh-3.5rem)] flex-1 flex-col\">\n {/* Top bar */}\n <div className=\"flex items-center justify-between border-b border-border px-4 py-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Bot className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium\">Chat</span>\n <span className=\"text-muted-foreground\">\n · {PROVIDER_LABEL[provider]} · <span className=\"font-mono text-xs\">{model}</span>\n </span>\n </div>\n <div className=\"flex items-center gap-3\">\n <UsageBadge\n totalCostUSD={usage.totalCostUSD}\n inputTokens={usage.inputTokens}\n outputTokens={usage.outputTokens}\n />\n {status === 'streaming' ? (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={stop}\n className=\"gap-1.5\"\n data-testid=\"chat-stop-button\"\n aria-label=\"Stop generating\"\n title=\"Stop the assistant — keeps whatever it has streamed so far\"\n >\n <StopCircle className=\"h-3.5 w-3.5\" />\n Stop\n </Button>\n ) : (\n <Button variant=\"outline\" size=\"sm\" onClick={reset} disabled={entries.length === 0} className=\"gap-1.5\">\n <RefreshCw className=\"h-3.5 w-3.5\" />\n New conversation\n </Button>\n )}\n </div>\n </div>\n\n {/* Transcript */}\n <div ref={scrollerRef} className=\"flex-1 overflow-y-auto px-4\">\n <div className=\"mx-auto max-w-3xl py-4\">\n {entries.length === 0 && (\n <div className=\"mt-12 text-center text-sm text-muted-foreground\">\n <Bot className=\"mx-auto mb-3 h-8 w-8 opacity-50\" />\n <div className=\"font-medium\">Ask your CMS anything.</div>\n <div className=\"mt-1\">\n Try: <em>\"show me posts about caching\"</em> or <em>\"fix the typo 'recieve' in any post\"</em>.\n </div>\n </div>\n )}\n {entries.map((e) => (\n <ErrorBoundary key={e.id} label=\"message\" resetKeys={[e.id]}>\n <Message\n entry={e}\n proposals={proposals}\n onAcceptProposal={acceptProposal}\n onRejectProposal={rejectProposal}\n />\n </ErrorBoundary>\n ))}\n\n {pendingForLatest.length >= 2 && status !== 'streaming' && (\n <div className=\"my-3 flex items-center justify-between rounded-md border border-border bg-muted/40 px-3 py-2 text-xs\">\n <span>\n <strong>{pendingForLatest.length}</strong> proposals pending in this turn.\n </span>\n <Button\n size=\"sm\"\n onClick={() => latestAssistantId && acceptAllPending(latestAssistantId)}\n className=\"gap-1.5\"\n >\n <CheckCheck className=\"h-3.5 w-3.5\" />\n Accept all pending\n </Button>\n </div>\n )}\n\n {attachmentDiagnostics.length > 0 && (\n <div className=\"my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs\">\n <div className=\"font-medium mb-1\">Attachments</div>\n <ul className=\"space-y-0.5\">\n {attachmentDiagnostics.map((d, i) => (\n <li key={i}>\n {d.status === 'ok' ? (\n <span>\n ✓ <span className=\"font-mono\">{d.filename}</span> ({d.kind})\n </span>\n ) : (\n <span className=\"text-destructive\">\n ✗ <span className=\"font-mono\">{d.filename}</span> — {d.reason}\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {status === 'stopped' && (\n <div\n className=\"my-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n role=\"status\"\n >\n Stopped — the assistant was interrupted. Send another message to continue.\n </div>\n )}\n\n {status === 'error' && error && (\n <div className=\"my-3 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n {error}\n </div>\n )}\n {status === 'budget_exceeded' && (\n <div className=\"my-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900\">\n Budget reached ({budgetReason ?? 'unknown'}). Click <strong>New conversation</strong> to start over, or\n raise the caps in <code>cms/octocms.config.ts</code>.\n </div>\n )}\n </div>\n </div>\n\n {/* Composer — disabled while streaming or after budget hit, but enabled\n after a Stop click so the user can immediately follow up. */}\n <ErrorBoundary label=\"composer\">\n <Composer\n disabled={status === 'streaming' || status === 'budget_exceeded'}\n maxAttachmentBytes={attachmentLimits.maxAttachmentBytes}\n maxAttachmentsPerTurn={attachmentLimits.maxAttachmentsPerTurn}\n onSubmit={send}\n />\n </ErrorBoundary>\n </div>\n );\n}\n\nfunction UsageBadge({\n totalCostUSD,\n inputTokens,\n outputTokens,\n}: {\n totalCostUSD: number;\n inputTokens: number;\n outputTokens: number;\n}) {\n const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : 'free';\n return (\n <span\n className=\"rounded-full border border-border bg-muted/50 px-2.5 py-0.5 font-mono text-[11px] text-muted-foreground\"\n title={`Input: ${inputTokens} tokens · Output: ${outputTokens} tokens`}\n >\n {cost} · {inputTokens + outputTokens} tok\n </span>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../components/Chat/ChatPage.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Button, Icon } from '../ui';\n\nimport type { ChatSetupInfo } from '../../agent/chatSetup';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Page } from '../Layout/Page';\n\nimport { ChatAgentSetup } from './ChatAgentSetup';\nimport { ChatSidebar } from './ChatSidebar';\nimport { Composer } from './Composer';\nimport { Message } from './Message';\nimport { useChatHistory } from './useChatHistory';\n\ntype Props =\n | {\n mode: 'setup';\n setup: ChatSetupInfo;\n }\n | {\n mode: 'ready';\n /** Initial provider info — used until the SSE `meta` event arrives. */\n initialMeta: { provider: 'anthropic' | 'openai' | 'local'; model: string };\n /** Attachment caps from `agentConfig` — drive Composer UI validation. */\n attachmentLimits: { maxAttachmentBytes: number; maxAttachmentsPerTurn: number };\n };\n\nexport default function ChatPage(props: Props) {\n if (props.mode === 'setup') {\n return <ChatAgentSetup setup={props.setup} />;\n }\n return <ChatPageReady {...props} />;\n}\n\ntype ReadyProps = Extract<Props, { mode: 'ready' }>;\n\nfunction ChatPageReady({ initialMeta, attachmentLimits }: ReadyProps) {\n const PROVIDER_LABEL: Record<'anthropic' | 'openai' | 'local', string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n local: 'Local',\n };\n\n const {\n entries,\n meta,\n usage,\n status,\n error,\n budgetReason,\n proposals,\n attachmentDiagnostics,\n send,\n stop,\n acceptProposal,\n rejectProposal,\n acceptAllPending,\n sessions,\n activeId,\n newConversation,\n selectSession,\n deleteSession,\n } = useChatHistory();\n const scrollerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }, [entries, status]);\n\n const provider = meta?.provider ?? initialMeta.provider;\n const model = meta?.model ?? initialMeta.model;\n\n // Identify the latest assistant turn so we can show \"Accept all pending\"\n // when ≥2 proposals are outstanding for it.\n const latestAssistantId = useMemo(() => {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].kind === 'assistant') return entries[i].id;\n }\n return null;\n }, [entries]);\n const pendingForLatest = useMemo(() => {\n if (!latestAssistantId) return [];\n return Object.values(proposals).filter(\n (p) => p.assistantEntryId === latestAssistantId && p.status.kind === 'pending',\n );\n }, [proposals, latestAssistantId]);\n\n return (\n <Page\n className=\"octo-chat-page\"\n title=\"Chat\"\n breadcrumbs={[{ label: `${PROVIDER_LABEL[provider]} · ${model}` }]}\n actions={\n <>\n <UsageBadge\n totalCostUSD={usage.totalCostUSD}\n inputTokens={usage.inputTokens}\n outputTokens={usage.outputTokens}\n />\n {status === 'streaming' ? (\n <Button\n variant=\"destructive\"\n onClick={stop}\n className=\"octo-u-gap-1-5\"\n data-testid=\"chat-stop-button\"\n aria-label=\"Stop generating\"\n title=\"Stop the assistant — keeps whatever it has streamed so far\"\n >\n <Icon.StopCircle className=\"octo-icon-sm\" />\n Stop\n </Button>\n ) : (\n <Button variant=\"primary\" onClick={newConversation}>\n <Icon.Plus className=\"octo-icon-sm\" />\n New conversation\n </Button>\n )}\n </>\n }\n leftBar={\n <ChatSidebar sessions={sessions} activeId={activeId} onSelect={selectSession} onDelete={deleteSession} />\n }\n >\n <div className=\"octo-chat\">\n <div ref={scrollerRef} className=\"octo-chat__scroller\">\n <div className=\"octo-chat__transcript\">\n {entries.length === 0 && (\n <div className=\"octo-chat__empty\">\n <Icon.Bot className=\"octo-chat__empty-icon octo-icon-xl\" />\n <div className=\"octo-chat__empty-title\">Ask your CMS anything.</div>\n <div className=\"octo-chat__empty-hint\">\n Try: <em>\"show me posts about caching\"</em> or <em>\"fix the typo 'recieve' in any post\"</em>.\n </div>\n </div>\n )}\n {entries.map((e) => (\n <ErrorBoundary key={e.id} label=\"message\" resetKeys={[e.id]}>\n <Message\n entry={e}\n proposals={proposals}\n onAcceptProposal={acceptProposal}\n onRejectProposal={rejectProposal}\n />\n </ErrorBoundary>\n ))}\n\n {pendingForLatest.length >= 2 && status !== 'streaming' && (\n <div className=\"octo-chat__accept-all-bar\">\n <span>\n <strong>{pendingForLatest.length}</strong> proposals pending in this turn.\n </span>\n <Button\n onClick={() => latestAssistantId && acceptAllPending(latestAssistantId)}\n className=\"octo-u-gap-1-5\"\n >\n <Icon.CheckCheck className=\"octo-icon-sm\" />\n Accept all pending\n </Button>\n </div>\n )}\n\n {attachmentDiagnostics.length > 0 && (\n <div className=\"octo-chat__attachment-diag\">\n <div className=\"octo-chat__attachment-diag-title\">Attachments</div>\n <ul className=\"octo-chat__attachment-diag-list\">\n {attachmentDiagnostics.map((d, i) => (\n <li key={i}>\n {d.status === 'ok' ? (\n <span>\n ✓ <span className=\"octo-u-mono\">{d.filename}</span> ({d.kind})\n </span>\n ) : (\n <span className=\"octo-chat__attachment-diag-error\">\n ✗ <span className=\"octo-u-mono\">{d.filename}</span> — {d.reason}\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {status === 'stopped' && (\n <div className=\"octo-chat__status-bar\" role=\"status\">\n Stopped — the assistant was interrupted. Send another message to continue.\n </div>\n )}\n\n {status === 'error' && error && <div className=\"octo-chat__error-bar\">{error}</div>}\n {status === 'budget_exceeded' && (\n <div className=\"octo-chat__budget-bar\">\n Budget reached ({budgetReason ?? 'unknown'}). Click <strong>New conversation</strong> to start over, or\n raise the caps in <code>cms/octocms.config.ts</code>.\n </div>\n )}\n </div>\n </div>\n\n <ErrorBoundary label=\"composer\">\n <Composer\n disabled={status === 'streaming' || status === 'budget_exceeded'}\n maxAttachmentBytes={attachmentLimits.maxAttachmentBytes}\n maxAttachmentsPerTurn={attachmentLimits.maxAttachmentsPerTurn}\n onSubmit={send}\n />\n </ErrorBoundary>\n </div>\n </Page>\n );\n}\n\nfunction UsageBadge({\n totalCostUSD,\n inputTokens,\n outputTokens,\n}: {\n totalCostUSD: number;\n inputTokens: number;\n outputTokens: number;\n}) {\n const cost = totalCostUSD > 0 ? `$${totalCostUSD.toFixed(4)}` : 'free';\n return (\n <span className=\"octo-chat__usage-badge\" title={`Input: ${inputTokens} tokens · Output: ${outputTokens} tokens`}>\n {cost} · {inputTokens + outputTokens} tok\n </span>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChatSessionListItem } from './chatStorage';
|
|
2
|
+
type Props = {
|
|
3
|
+
sessions: ChatSessionListItem[];
|
|
4
|
+
activeId: string | null;
|
|
5
|
+
onSelect: (id: string) => void;
|
|
6
|
+
onDelete: (id: string) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function ChatSidebar({ sessions, activeId, onSelect, onDelete }: Props): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=ChatSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatSidebar.d.ts","sourceRoot":"","sources":["../../../components/Chat/ChatSidebar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAyC5E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { relativeTime } from "../../lib/relativeTime";
|
|
5
|
+
import { Icon } from "../ui";
|
|
6
|
+
function ChatSidebar({ sessions, activeId, onSelect, onDelete }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "octo-page-sidebar__section", children: [
|
|
8
|
+
/* @__PURE__ */ jsx("span", { className: "octo-page-sidebar__section-label", children: "Conversations" }),
|
|
9
|
+
/* @__PURE__ */ jsx("nav", { className: "octo-page-sidebar__nav", "aria-label": "Saved conversations", children: sessions.length === 0 ? /* @__PURE__ */ jsx("p", { className: "octo-chat-session__empty", children: "No saved chats yet. Send a message to save one here." }) : sessions.map((session) => {
|
|
10
|
+
const active = session.id === activeId;
|
|
11
|
+
return /* @__PURE__ */ jsxs("div", { className: "octo-chat-session", children: [
|
|
12
|
+
/* @__PURE__ */ jsxs(
|
|
13
|
+
"button",
|
|
14
|
+
{
|
|
15
|
+
type: "button",
|
|
16
|
+
className: "octo-chat-session__button",
|
|
17
|
+
onClick: () => onSelect(session.id),
|
|
18
|
+
"aria-current": active ? "true" : void 0,
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx("span", { className: "octo-chat-session__title", children: session.title }),
|
|
21
|
+
/* @__PURE__ */ jsx("span", { className: "octo-chat-session__time", children: relativeTime(new Date(session.updatedAt).toISOString()) })
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
),
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
"button",
|
|
27
|
+
{
|
|
28
|
+
type: "button",
|
|
29
|
+
className: "octo-chat-session__delete",
|
|
30
|
+
onClick: (e) => {
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
if (window.confirm(`Delete "${session.title}"?`)) onDelete(session.id);
|
|
33
|
+
},
|
|
34
|
+
"aria-label": `Delete ${session.title}`,
|
|
35
|
+
children: /* @__PURE__ */ jsx(Icon.Trash2, { className: "octo-icon-xs" })
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
] }, session.id);
|
|
39
|
+
}) })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
ChatSidebar
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=ChatSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../components/Chat/ChatSidebar.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { relativeTime } from '../../lib/relativeTime';\nimport { Icon } from '../ui';\n\nimport type { ChatSessionListItem } from './chatStorage';\n\ntype Props = {\n sessions: ChatSessionListItem[];\n activeId: string | null;\n onSelect: (id: string) => void;\n onDelete: (id: string) => void;\n};\n\nexport function ChatSidebar({ sessions, activeId, onSelect, onDelete }: Props) {\n return (\n <div className=\"octo-page-sidebar__section\">\n <span className=\"octo-page-sidebar__section-label\">Conversations</span>\n <nav className=\"octo-page-sidebar__nav\" aria-label=\"Saved conversations\">\n {sessions.length === 0 ? (\n <p className=\"octo-chat-session__empty\">No saved chats yet. Send a message to save one here.</p>\n ) : (\n sessions.map((session) => {\n const active = session.id === activeId;\n return (\n <div key={session.id} className=\"octo-chat-session\">\n <button\n type=\"button\"\n className=\"octo-chat-session__button\"\n onClick={() => onSelect(session.id)}\n aria-current={active ? 'true' : undefined}\n >\n <span className=\"octo-chat-session__title\">{session.title}</span>\n <span className=\"octo-chat-session__time\">\n {relativeTime(new Date(session.updatedAt).toISOString())}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"octo-chat-session__delete\"\n onClick={(e) => {\n e.stopPropagation();\n if (window.confirm(`Delete \"${session.title}\"?`)) onDelete(session.id);\n }}\n aria-label={`Delete ${session.title}`}\n >\n <Icon.Trash2 className=\"octo-icon-xs\" />\n </button>\n </div>\n );\n })\n )}\n </nav>\n </div>\n );\n}\n"],"mappings":";;AAmBM,cASU,YATV;AAfN,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AAWd,SAAS,YAAY,EAAE,UAAU,UAAU,UAAU,SAAS,GAAU;AAC7E,SACE,qBAAC,SAAI,WAAU,8BACb;AAAA,wBAAC,UAAK,WAAU,oCAAmC,2BAAa;AAAA,IAChE,oBAAC,SAAI,WAAU,0BAAyB,cAAW,uBAChD,mBAAS,WAAW,IACnB,oBAAC,OAAE,WAAU,4BAA2B,kEAAoD,IAE5F,SAAS,IAAI,CAAC,YAAY;AACxB,YAAM,SAAS,QAAQ,OAAO;AAC9B,aACE,qBAAC,SAAqB,WAAU,qBAC9B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,SAAS,QAAQ,EAAE;AAAA,YAClC,gBAAc,SAAS,SAAS;AAAA,YAEhC;AAAA,kCAAC,UAAK,WAAU,4BAA4B,kBAAQ,OAAM;AAAA,cAC1D,oBAAC,UAAK,WAAU,2BACb,uBAAa,IAAI,KAAK,QAAQ,SAAS,EAAE,YAAY,CAAC,GACzD;AAAA;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,kBAAI,OAAO,QAAQ,WAAW,QAAQ,KAAK,IAAI,EAAG,UAAS,QAAQ,EAAE;AAAA,YACvE;AAAA,YACA,cAAY,UAAU,QAAQ,KAAK;AAAA,YAEnC,8BAAC,KAAK,QAAL,EAAY,WAAU,gBAAe;AAAA;AAAA,QACxC;AAAA,WAtBQ,QAAQ,EAuBlB;AAAA,IAEJ,CAAC,GAEL;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../components/Chat/Composer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../components/Chat/Composer.tsx"],"names":[],"mappings":"AAUA,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,QAAgB,EAChB,kBAAqC,EACrC,qBAAyB,EACzB,QAAQ,GACT,EAAE,KAAK,2CAoJP"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import "../../chunk-B5LE2OEC.js";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { useRef, useState } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import { Button } from "../ui
|
|
5
|
+
import { cn } from "../../lib/utils";
|
|
6
|
+
import { Button, Icon } from "../ui";
|
|
7
7
|
const ACCEPTED_TYPES = ".pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown";
|
|
8
8
|
function Composer({
|
|
9
9
|
disabled = false,
|
|
@@ -67,7 +67,7 @@ function Composer({
|
|
|
67
67
|
return /* @__PURE__ */ jsxs(
|
|
68
68
|
"div",
|
|
69
69
|
{
|
|
70
|
-
className:
|
|
70
|
+
className: cn("octo-chat-composer", dragOver && "octo-chat-composer--dragover"),
|
|
71
71
|
onDragOver: (e) => {
|
|
72
72
|
e.preventDefault();
|
|
73
73
|
if (!disabled) setDragOver(true);
|
|
@@ -76,33 +76,25 @@ function Composer({
|
|
|
76
76
|
onDrop,
|
|
77
77
|
"data-testid": "chat-composer",
|
|
78
78
|
children: [
|
|
79
|
-
(files.length > 0 || error) && /* @__PURE__ */ jsxs("div", { className: "
|
|
80
|
-
files.map((f, i) => /* @__PURE__ */ jsxs(
|
|
81
|
-
"
|
|
82
|
-
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
|
|
97
|
-
}
|
|
98
|
-
)
|
|
99
|
-
]
|
|
100
|
-
},
|
|
101
|
-
`${f.name}-${i}`
|
|
102
|
-
)),
|
|
103
|
-
error && /* @__PURE__ */ jsx("span", { className: "text-xs text-destructive", role: "alert", children: error })
|
|
79
|
+
(files.length > 0 || error) && /* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__attachments", children: [
|
|
80
|
+
files.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__chip", "data-testid": "chat-attachment-chip", children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Icon.Paperclip, { className: "octo-icon-xs" }),
|
|
82
|
+
/* @__PURE__ */ jsx("span", { className: "octo-chat-composer__chip-name", children: f.name }),
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: "octo-chat-composer__chip-size", children: formatSize(f.size) }),
|
|
84
|
+
/* @__PURE__ */ jsx(
|
|
85
|
+
"button",
|
|
86
|
+
{
|
|
87
|
+
type: "button",
|
|
88
|
+
onClick: () => removeFile(i),
|
|
89
|
+
"aria-label": `Remove ${f.name}`,
|
|
90
|
+
className: "octo-chat-composer__chip-remove",
|
|
91
|
+
children: /* @__PURE__ */ jsx(Icon.X, { className: "octo-icon-xs" })
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
] }, `${f.name}-${i}`)),
|
|
95
|
+
error && /* @__PURE__ */ jsx("span", { className: "octo-chat-composer__attach-error", role: "alert", children: error })
|
|
104
96
|
] }),
|
|
105
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
97
|
+
/* @__PURE__ */ jsxs("div", { className: "octo-chat-composer__row", children: [
|
|
106
98
|
/* @__PURE__ */ jsx(
|
|
107
99
|
"input",
|
|
108
100
|
{
|
|
@@ -110,7 +102,7 @@ function Composer({
|
|
|
110
102
|
type: "file",
|
|
111
103
|
multiple: true,
|
|
112
104
|
accept: ACCEPTED_TYPES,
|
|
113
|
-
className: "
|
|
105
|
+
className: "octo-chat-composer__file-input",
|
|
114
106
|
onChange: (e) => e.target.files && addFiles(e.target.files),
|
|
115
107
|
"data-testid": "chat-file-input"
|
|
116
108
|
}
|
|
@@ -128,7 +120,7 @@ function Composer({
|
|
|
128
120
|
var _a;
|
|
129
121
|
return (_a = fileRef.current) == null ? void 0 : _a.click();
|
|
130
122
|
},
|
|
131
|
-
children: /* @__PURE__ */ jsx(Paperclip, { className: "
|
|
123
|
+
children: /* @__PURE__ */ jsx(Icon.Paperclip, { className: "octo-icon-md" })
|
|
132
124
|
}
|
|
133
125
|
),
|
|
134
126
|
/* @__PURE__ */ jsx(
|
|
@@ -142,7 +134,7 @@ function Composer({
|
|
|
142
134
|
disabled,
|
|
143
135
|
placeholder: files.length > 0 ? "Describe what to do with the attachment(s) \u2014 or press Send." : "Ask about your content \u2014 e.g. 'show me posts about caching'",
|
|
144
136
|
"aria-label": "Chat message",
|
|
145
|
-
className: "
|
|
137
|
+
className: "octo-chat-composer__textarea",
|
|
146
138
|
onInput: (e) => {
|
|
147
139
|
const el = e.currentTarget;
|
|
148
140
|
el.style.height = "auto";
|
|
@@ -150,19 +142,10 @@ function Composer({
|
|
|
150
142
|
}
|
|
151
143
|
}
|
|
152
144
|
),
|
|
153
|
-
/* @__PURE__ */ jsxs(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
disabled: disabled || !value.trim() && files.length === 0,
|
|
158
|
-
size: "sm",
|
|
159
|
-
className: "gap-1.5",
|
|
160
|
-
children: [
|
|
161
|
-
/* @__PURE__ */ jsx(Send, { className: "h-4 w-4" }),
|
|
162
|
-
"Send"
|
|
163
|
-
]
|
|
164
|
-
}
|
|
165
|
-
)
|
|
145
|
+
/* @__PURE__ */ jsxs(Button, { onClick: send, disabled: disabled || !value.trim() && files.length === 0, className: "octo-u-gap-1-5", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(Icon.Send, { className: "octo-icon-md" }),
|
|
147
|
+
"Send"
|
|
148
|
+
] })
|
|
166
149
|
] })
|
|
167
150
|
]
|
|
168
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../components/Chat/Composer.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState } from 'react';\nimport { Paperclip, Send, X } from 'lucide-react';\n\nimport { Button } from '../ui/button';\n\n/** Allowed file types for chat attachments — kept in sync with `classifyAttachment`. */\nconst ACCEPTED_TYPES =\n '.pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown';\n\ntype Props = {\n disabled?: boolean;\n /** Per-attachment size limit in bytes — used to reject oversized files in the picker. */\n maxAttachmentBytes?: number;\n /** Per-turn attachment cap — used to disable the picker once full. */\n maxAttachmentsPerTurn?: number;\n /**\n * Called with the trimmed text and the user's selected attachments. The hook\n * decides whether to send JSON or multipart based on whether `files` is empty.\n */\n onSubmit(text: string, files: File[]): void;\n};\n\nexport function Composer({\n disabled = false,\n maxAttachmentBytes = 25 * 1024 * 1024,\n maxAttachmentsPerTurn = 3,\n onSubmit,\n}: Props) {\n const [value, setValue] = useState('');\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const send = () => {\n const text = value.trim();\n // Allow empty text when files are attached — the model can still reason\n // over the document with a default prompt set on the client side later.\n if ((!text && files.length === 0) || disabled) return;\n onSubmit(text, files);\n setValue('');\n setFiles([]);\n setError(null);\n requestAnimationFrame(() => taRef.current?.focus());\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const addFiles = (incoming: FileList | File[]) => {\n setError(null);\n const list = Array.from(incoming);\n const next: File[] = [...files];\n for (const f of list) {\n if (next.length >= maxAttachmentsPerTurn) {\n setError(`Attachment limit reached (${maxAttachmentsPerTurn} per turn).`);\n break;\n }\n if (f.size > maxAttachmentBytes) {\n setError(`\"${f.name}\" exceeds the ${(maxAttachmentBytes / (1024 * 1024)).toFixed(0)} MB per-file limit.`);\n continue;\n }\n next.push(f);\n }\n setFiles(next);\n if (fileRef.current) fileRef.current.value = '';\n };\n\n const removeFile = (idx: number) => {\n setFiles(files.filter((_, i) => i !== idx));\n setError(null);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files);\n };\n\n const atCapacity = files.length >= maxAttachmentsPerTurn;\n\n return (\n <div\n className={`border-t border-border bg-background ${dragOver ? 'ring-2 ring-ring' : ''}`}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n data-testid=\"chat-composer\"\n >\n {(files.length > 0 || error) && (\n <div className=\"px-4 pt-3 flex flex-wrap gap-2 items-center\">\n {files.map((f, i) => (\n <div\n key={`${f.name}-${i}`}\n className=\"inline-flex items-center gap-2 rounded-full border border-input bg-muted px-3 py-1 text-xs\"\n data-testid=\"chat-attachment-chip\"\n >\n <Paperclip className=\"h-3 w-3\" />\n <span className=\"max-w-[180px] truncate\">{f.name}</span>\n <span className=\"text-muted-foreground\">{formatSize(f.size)}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n aria-label={`Remove ${f.name}`}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n {error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {error}\n </span>\n )}\n </div>\n )}\n\n <div className=\"flex items-end gap-2 px-4 py-3\">\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n accept={ACCEPTED_TYPES}\n className=\"hidden\"\n onChange={(e) => e.target.files && addFiles(e.target.files)}\n data-testid=\"chat-file-input\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled || atCapacity}\n aria-label=\"Attach files\"\n title={\n atCapacity\n ? `Attachment limit reached (${maxAttachmentsPerTurn})`\n : 'Attach files (PDF / DOCX / .txt / .md)'\n }\n onClick={() => fileRef.current?.click()}\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n <textarea\n ref={taRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={disabled}\n placeholder={\n files.length > 0\n ? 'Describe what to do with the attachment(s) — or press Send.'\n : \"Ask about your content — e.g. 'show me posts about caching'\"\n }\n aria-label=\"Chat message\"\n className=\"flex-1 resize-none rounded-lg border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 max-h-40\"\n onInput={(e) => {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }}\n />\n <Button\n onClick={send}\n disabled={disabled || (!value.trim() && files.length === 0)}\n size=\"sm\"\n className=\"gap-1.5\"\n >\n <Send className=\"h-4 w-4\" />\n Send\n </Button>\n </div>\n </div>\n );\n}\n\nfunction formatSize(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${n} B`;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../components/Chat/Composer.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, Icon } from '../ui';\n\n/** Allowed file types for chat attachments — kept in sync with `classifyAttachment`. */\nconst ACCEPTED_TYPES =\n '.pdf,.docx,.txt,.md,.markdown,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain,text/markdown';\n\ntype Props = {\n disabled?: boolean;\n /** Per-attachment size limit in bytes — used to reject oversized files in the picker. */\n maxAttachmentBytes?: number;\n /** Per-turn attachment cap — used to disable the picker once full. */\n maxAttachmentsPerTurn?: number;\n /**\n * Called with the trimmed text and the user's selected attachments. The hook\n * decides whether to send JSON or multipart based on whether `files` is empty.\n */\n onSubmit(text: string, files: File[]): void;\n};\n\nexport function Composer({\n disabled = false,\n maxAttachmentBytes = 25 * 1024 * 1024,\n maxAttachmentsPerTurn = 3,\n onSubmit,\n}: Props) {\n const [value, setValue] = useState('');\n const [files, setFiles] = useState<File[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const send = () => {\n const text = value.trim();\n // Allow empty text when files are attached — the model can still reason\n // over the document with a default prompt set on the client side later.\n if ((!text && files.length === 0) || disabled) return;\n onSubmit(text, files);\n setValue('');\n setFiles([]);\n setError(null);\n requestAnimationFrame(() => taRef.current?.focus());\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const addFiles = (incoming: FileList | File[]) => {\n setError(null);\n const list = Array.from(incoming);\n const next: File[] = [...files];\n for (const f of list) {\n if (next.length >= maxAttachmentsPerTurn) {\n setError(`Attachment limit reached (${maxAttachmentsPerTurn} per turn).`);\n break;\n }\n if (f.size > maxAttachmentBytes) {\n setError(`\"${f.name}\" exceeds the ${(maxAttachmentBytes / (1024 * 1024)).toFixed(0)} MB per-file limit.`);\n continue;\n }\n next.push(f);\n }\n setFiles(next);\n if (fileRef.current) fileRef.current.value = '';\n };\n\n const removeFile = (idx: number) => {\n setFiles(files.filter((_, i) => i !== idx));\n setError(null);\n };\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragOver(false);\n if (disabled) return;\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) addFiles(e.dataTransfer.files);\n };\n\n const atCapacity = files.length >= maxAttachmentsPerTurn;\n\n return (\n <div\n className={cn('octo-chat-composer', dragOver && 'octo-chat-composer--dragover')}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n data-testid=\"chat-composer\"\n >\n {(files.length > 0 || error) && (\n <div className=\"octo-chat-composer__attachments\">\n {files.map((f, i) => (\n <div key={`${f.name}-${i}`} className=\"octo-chat-composer__chip\" data-testid=\"chat-attachment-chip\">\n <Icon.Paperclip className=\"octo-icon-xs\" />\n <span className=\"octo-chat-composer__chip-name\">{f.name}</span>\n <span className=\"octo-chat-composer__chip-size\">{formatSize(f.size)}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(i)}\n aria-label={`Remove ${f.name}`}\n className=\"octo-chat-composer__chip-remove\"\n >\n <Icon.X className=\"octo-icon-xs\" />\n </button>\n </div>\n ))}\n {error && (\n <span className=\"octo-chat-composer__attach-error\" role=\"alert\">\n {error}\n </span>\n )}\n </div>\n )}\n\n <div className=\"octo-chat-composer__row\">\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n accept={ACCEPTED_TYPES}\n className=\"octo-chat-composer__file-input\"\n onChange={(e) => e.target.files && addFiles(e.target.files)}\n data-testid=\"chat-file-input\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled || atCapacity}\n aria-label=\"Attach files\"\n title={\n atCapacity\n ? `Attachment limit reached (${maxAttachmentsPerTurn})`\n : 'Attach files (PDF / DOCX / .txt / .md)'\n }\n onClick={() => fileRef.current?.click()}\n >\n <Icon.Paperclip className=\"octo-icon-md\" />\n </Button>\n <textarea\n ref={taRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={disabled}\n placeholder={\n files.length > 0\n ? 'Describe what to do with the attachment(s) — or press Send.'\n : \"Ask about your content — e.g. 'show me posts about caching'\"\n }\n aria-label=\"Chat message\"\n className=\"octo-chat-composer__textarea\"\n onInput={(e) => {\n const el = e.currentTarget;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`;\n }}\n />\n <Button onClick={send} disabled={disabled || (!value.trim() && files.length === 0)} className=\"octo-u-gap-1-5\">\n <Icon.Send className=\"octo-icon-md\" />\n Send\n </Button>\n </div>\n </div>\n );\n}\n\nfunction formatSize(n: number): string {\n if (n >= 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n if (n >= 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${n} B`;\n}\n"],"mappings":"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","names":[]}
|