@flanksource/clicky-ui 0.3.46 → 0.3.48
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/NOTICE.md +11 -0
- package/README.md +49 -0
- package/dist/ai.cjs +13 -8
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +7 -2
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +10 -4
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +2 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +10 -4
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +2 -0
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +2 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +2 -0
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +3 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +3 -1
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +3 -0
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +2 -3
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +3 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/Clicky.cjs +3 -0
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +3 -0
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeLine.cjs +4 -2
- package/dist/data/CodeLine.cjs.map +1 -1
- package/dist/data/CodeLine.d.ts.map +1 -1
- package/dist/data/CodeLine.js +4 -2
- package/dist/data/CodeLine.js.map +1 -1
- package/dist/data/FilterPill.cjs +15 -2
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +15 -2
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/LogViewer.cjs +27 -8
- package/dist/data/LogViewer.cjs.map +1 -1
- package/dist/data/LogViewer.d.ts +11 -3
- package/dist/data/LogViewer.d.ts.map +1 -1
- package/dist/data/LogViewer.js +27 -8
- package/dist/data/LogViewer.js.map +1 -1
- package/dist/data/Properties.cjs +2 -15
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +4 -0
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +2 -15
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/PropertyValue.cjs +37 -0
- package/dist/data/PropertyValue.cjs.map +1 -0
- package/dist/data/PropertyValue.d.ts +6 -0
- package/dist/data/PropertyValue.d.ts.map +1 -0
- package/dist/data/PropertyValue.js +37 -0
- package/dist/data/PropertyValue.js.map +1 -0
- package/dist/data/SymbolBadge.cjs +61 -0
- package/dist/data/SymbolBadge.cjs.map +1 -0
- package/dist/data/SymbolBadge.d.ts +21 -0
- package/dist/data/SymbolBadge.d.ts.map +1 -0
- package/dist/data/SymbolBadge.js +61 -0
- package/dist/data/SymbolBadge.js.map +1 -0
- package/dist/data/Tree.cjs +4 -3
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +4 -3
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +1 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.js +1 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +106 -171
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +6 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.header.cjs +104 -0
- package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.header.d.ts +29 -0
- package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.header.js +104 -0
- package/dist/data/ai/ChatWindow.header.js.map +1 -0
- package/dist/data/ai/ChatWindow.js +107 -172
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +95 -0
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.placement.js +95 -0
- package/dist/data/ai/ChatWindow.placement.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +3 -1
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +4 -1
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
- package/dist/data/ai/SessionChatComposer.js +3 -1
- package/dist/data/ai/SessionChatComposer.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +68 -72
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +6 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +69 -73
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.js +41 -42
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.js +14 -9
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote.cjs +84 -16
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote.js +86 -18
- package/dist/data/ai/SessionInspector.remote.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +5 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionTail.cjs +63 -0
- package/dist/data/ai/SessionTail.cjs.map +1 -0
- package/dist/data/ai/SessionTail.d.ts +14 -0
- package/dist/data/ai/SessionTail.d.ts.map +1 -0
- package/dist/data/ai/SessionTail.js +63 -0
- package/dist/data/ai/SessionTail.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +10 -3
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +7 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.js +10 -3
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +4 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +30 -6
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +7 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +30 -6
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.cjs +1 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.js +1 -1
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +4 -2
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +5 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +4 -2
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +14 -3
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
- package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.js +6 -1
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +3 -1
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +4 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +3 -1
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/test-runner/Expectation.cjs +57 -0
- package/dist/data/test-runner/Expectation.cjs.map +1 -0
- package/dist/data/test-runner/Expectation.d.ts +19 -0
- package/dist/data/test-runner/Expectation.d.ts.map +1 -0
- package/dist/data/test-runner/Expectation.js +57 -0
- package/dist/data/test-runner/Expectation.js.map +1 -0
- package/dist/data/test-runner/MarkIcons.cjs +38 -0
- package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
- package/dist/data/test-runner/MarkIcons.d.ts +15 -0
- package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
- package/dist/data/test-runner/MarkIcons.js +38 -0
- package/dist/data/test-runner/MarkIcons.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +101 -55
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +23 -27
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +87 -93
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +89 -95
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +35 -21
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +35 -21
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +58 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +6 -3
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +58 -30
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +5 -2
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.d.ts +5 -2
- package/dist/data/test-runner/TestTree.d.ts.map +1 -1
- package/dist/data/test-runner/TestTree.js +5 -2
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +28 -19
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +29 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +15 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +27 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +15 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +2 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/copy.cjs +114 -0
- package/dist/data/test-runner/copy.cjs.map +1 -0
- package/dist/data/test-runner/copy.d.ts +47 -0
- package/dist/data/test-runner/copy.d.ts.map +1 -0
- package/dist/data/test-runner/copy.js +114 -0
- package/dist/data/test-runner/copy.js.map +1 -0
- package/dist/data/test-runner/index.d.ts +6 -3
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +184 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +40 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +184 -0
- package/dist/data/test-runner/marks.js.map +1 -0
- package/dist/data/test-runner/status.cjs +27 -44
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +12 -3
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +27 -44
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
- package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
- package/dist/data/traces/TraceHarView.d.ts +13 -0
- package/dist/data/traces/TraceHarView.d.ts.map +1 -0
- package/dist/data/traces/cast.d.ts +9 -0
- package/dist/data/traces/cast.d.ts.map +1 -0
- package/dist/data/traces/fixtures.d.ts +8 -0
- package/dist/data/traces/fixtures.d.ts.map +1 -0
- package/dist/data/traces/har-adapter.d.ts +13 -0
- package/dist/data/traces/har-adapter.d.ts.map +1 -0
- package/dist/data/traces/terminal-screen.d.ts +45 -0
- package/dist/data/traces/terminal-screen.d.ts.map +1 -0
- package/dist/data/traces/terminal-timeline.d.ts +26 -0
- package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
- package/dist/data/traces/types.d.ts +141 -0
- package/dist/data/traces/types.d.ts.map +1 -0
- package/dist/data/verification/VerificationResults.cjs +4 -0
- package/dist/data/verification/VerificationResults.cjs.map +1 -1
- package/dist/data/verification/VerificationResults.d.ts +3 -1
- package/dist/data/verification/VerificationResults.d.ts.map +1 -1
- package/dist/data/verification/VerificationResults.js +4 -0
- package/dist/data/verification/VerificationResults.js.map +1 -1
- package/dist/data/verification/adapterViews.cjs +28 -44
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +4 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +28 -44
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +163 -8
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +163 -8
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/index.d.ts +4 -2
- package/dist/data/verification/index.d.ts.map +1 -1
- package/dist/data/verification/stepKind.cjs +217 -0
- package/dist/data/verification/stepKind.cjs.map +1 -0
- package/dist/data/verification/stepKind.d.ts +87 -0
- package/dist/data/verification/stepKind.d.ts.map +1 -0
- package/dist/data/verification/stepKind.js +217 -0
- package/dist/data/verification/stepKind.js.map +1 -0
- package/dist/data/verification/stepKindViews.cjs +111 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -0
- package/dist/data/verification/stepKindViews.d.ts +18 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -0
- package/dist/data/verification/stepKindViews.js +111 -0
- package/dist/data/verification/stepKindViews.js.map +1 -0
- package/dist/data/verification/verifyReportTests.cjs +1 -0
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- package/dist/data/verification/verifyReportTests.d.ts +2 -1
- package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
- package/dist/data/verification/verifyReportTests.js +1 -0
- package/dist/data/verification/verifyReportTests.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +58 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +60 -5
- package/dist/data.js.map +1 -1
- package/dist/icons/components/UiLogoEslint.cjs +10 -0
- package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
- package/dist/icons/components/UiLogoEslint.d.ts +9 -0
- package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
- package/dist/icons/components/UiLogoEslint.js +10 -0
- package/dist/icons/components/UiLogoEslint.js.map +1 -0
- package/dist/icons/components/UiLogoGo.cjs +10 -0
- package/dist/icons/components/UiLogoGo.cjs.map +1 -0
- package/dist/icons/components/UiLogoGo.d.ts +9 -0
- package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
- package/dist/icons/components/UiLogoGo.js +10 -0
- package/dist/icons/components/UiLogoGo.js.map +1 -0
- package/dist/icons/components/UiLogoJest.cjs +10 -0
- package/dist/icons/components/UiLogoJest.cjs.map +1 -0
- package/dist/icons/components/UiLogoJest.d.ts +9 -0
- package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoJest.js +10 -0
- package/dist/icons/components/UiLogoJest.js.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
- package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.js +10 -0
- package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
- package/dist/icons/components/UiLogoOxc.cjs +10 -0
- package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
- package/dist/icons/components/UiLogoOxc.d.ts +9 -0
- package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
- package/dist/icons/components/UiLogoOxc.js +10 -0
- package/dist/icons/components/UiLogoOxc.js.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
- package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.js +10 -0
- package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
- package/dist/icons/components/UiLogoPython.cjs +10 -0
- package/dist/icons/components/UiLogoPython.cjs.map +1 -0
- package/dist/icons/components/UiLogoPython.d.ts +9 -0
- package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPython.js +10 -0
- package/dist/icons/components/UiLogoPython.js.map +1 -0
- package/dist/icons/components/UiLogoReact.cjs +10 -0
- package/dist/icons/components/UiLogoReact.cjs.map +1 -0
- package/dist/icons/components/UiLogoReact.d.ts +9 -0
- package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
- package/dist/icons/components/UiLogoReact.js +10 -0
- package/dist/icons/components/UiLogoReact.js.map +1 -0
- package/dist/icons/components/UiLogoRuff.cjs +10 -0
- package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
- package/dist/icons/components/UiLogoRuff.d.ts +9 -0
- package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
- package/dist/icons/components/UiLogoRuff.js +10 -0
- package/dist/icons/components/UiLogoRuff.js.map +1 -0
- package/dist/icons/components/UiLogoTypescript.cjs +10 -0
- package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
- package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
- package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
- package/dist/icons/components/UiLogoTypescript.js +10 -0
- package/dist/icons/components/UiLogoTypescript.js.map +1 -0
- package/dist/icons/components/UiLogoVitest.cjs +10 -0
- package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
- package/dist/icons/components/UiLogoVitest.d.ts +9 -0
- package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoVitest.js +10 -0
- package/dist/icons/components/UiLogoVitest.js.map +1 -0
- package/dist/icons/index.d.ts +11 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +22 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +22 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +22 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +22 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +60 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +62 -5
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +4 -4
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +9 -0
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +5 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +9 -0
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/InlineError.cjs +12 -43
- package/dist/rpc/InlineError.cjs.map +1 -1
- package/dist/rpc/InlineError.d.ts.map +1 -1
- package/dist/rpc/InlineError.js +13 -44
- package/dist/rpc/InlineError.js.map +1 -1
- package/dist/rpc/OperationArgsForm.cjs +153 -0
- package/dist/rpc/OperationArgsForm.cjs.map +1 -0
- package/dist/rpc/OperationArgsForm.d.ts +16 -0
- package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
- package/dist/rpc/OperationArgsForm.js +153 -0
- package/dist/rpc/OperationArgsForm.js.map +1 -0
- package/dist/rpc/OperationScheduleDialog.cjs +119 -22
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +120 -23
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +17 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +17 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -7
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts +0 -2
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -7
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +12 -1
- package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/test-runner/frameworkIcon.cjs +0 -27
- package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
- package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
- package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
- package/dist/data/test-runner/frameworkIcon.js +0 -27
- package/dist/data/test-runner/frameworkIcon.js.map +0 -1
|
@@ -25,14 +25,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
25
25
|
const jsxRuntime = require("react/jsx-runtime");
|
|
26
26
|
const react = require("react");
|
|
27
27
|
const utils = require("../../lib/utils.cjs");
|
|
28
|
-
const
|
|
29
|
-
const Icon = require("../Icon.cjs");
|
|
28
|
+
const useMediaQuery = require("../../hooks/use-media-query.cjs");
|
|
30
29
|
const Chat = require("../chat/Chat.cjs");
|
|
31
30
|
const approval = require("../chat/approval.cjs");
|
|
32
31
|
const chatWindowContext = require("./chat-window-context.cjs");
|
|
33
|
-
const
|
|
32
|
+
const ChatWindow_header = require("./ChatWindow.header.cjs");
|
|
34
33
|
const ContextBadges = require("./ContextBadges.cjs");
|
|
35
|
-
const ToolPreferences = require("./ToolPreferences.cjs");
|
|
36
34
|
const ChatWindowRequestBody = require("./ChatWindowRequestBody.cjs");
|
|
37
35
|
const ChatWindow_preferences = require("./ChatWindow.preferences.cjs");
|
|
38
36
|
const ChatWindow_runtime = require("./ChatWindow.runtime.cjs");
|
|
@@ -41,19 +39,8 @@ const ChatWindow_toolCatalog = require("./ChatWindow.tool-catalog.cjs");
|
|
|
41
39
|
const ToolPreferences_model = require("./ToolPreferences.model.cjs");
|
|
42
40
|
const ChatWindow_thread = require("./ChatWindow.thread.cjs");
|
|
43
41
|
const ChatWindow_threadStatus = require("./ChatWindow.thread-status.cjs");
|
|
44
|
-
const
|
|
45
|
-
const UiAdd = require("../../icons/components/UiAdd.cjs");
|
|
46
|
-
const UiFullscreen = require("../../icons/components/UiFullscreen.cjs");
|
|
47
|
-
const UiClose = require("../../icons/components/UiClose.cjs");
|
|
42
|
+
const ChatWindow_placement = require("./ChatWindow.placement.cjs");
|
|
48
43
|
const EMPTY_TOOLS = [];
|
|
49
|
-
const MAXIMIZE_CSS = `
|
|
50
|
-
.chat-maximized .react-draggable {
|
|
51
|
-
transform: none !important;
|
|
52
|
-
width: auto !important;
|
|
53
|
-
height: auto !important;
|
|
54
|
-
inset: 0 !important;
|
|
55
|
-
position: absolute !important;
|
|
56
|
-
}`;
|
|
57
44
|
function ChatWindow({
|
|
58
45
|
panel,
|
|
59
46
|
chat,
|
|
@@ -70,7 +57,15 @@ function ChatWindow({
|
|
|
70
57
|
renderContextPicker
|
|
71
58
|
}) {
|
|
72
59
|
var _a;
|
|
73
|
-
const {
|
|
60
|
+
const {
|
|
61
|
+
panels,
|
|
62
|
+
updatePanel,
|
|
63
|
+
closePanel,
|
|
64
|
+
bringToFront,
|
|
65
|
+
maximizePanel,
|
|
66
|
+
openPanel
|
|
67
|
+
} = chatWindowContext.useChatWindowManager();
|
|
68
|
+
const mobile = useMediaQuery.useMediaQuery(ChatWindow_placement.CHAT_WINDOW_MOBILE_QUERY);
|
|
74
69
|
const threadSetup = ChatWindow_thread.useChatThreadSetup({
|
|
75
70
|
threadId: panel.threadId,
|
|
76
71
|
api: sessionsApi,
|
|
@@ -187,6 +182,7 @@ function ChatWindow({
|
|
|
187
182
|
setUserToolRules((prev) => ToolPreferences_model.withUserRule(prev, rule));
|
|
188
183
|
}, []);
|
|
189
184
|
react.useEffect(() => {
|
|
185
|
+
if (mobile) return;
|
|
190
186
|
let active = true;
|
|
191
187
|
import("react-rnd").then((m) => {
|
|
192
188
|
if (active) setRnd(() => m.Rnd);
|
|
@@ -194,7 +190,7 @@ function ChatWindow({
|
|
|
194
190
|
return () => {
|
|
195
191
|
active = false;
|
|
196
192
|
};
|
|
197
|
-
}, []);
|
|
193
|
+
}, [mobile]);
|
|
198
194
|
const removeContext = react.useCallback(
|
|
199
195
|
(id) => updatePanel(panel.id, {
|
|
200
196
|
contextItems: panel.contextItems.filter((c) => c.id !== id)
|
|
@@ -287,22 +283,18 @@ function ChatWindow({
|
|
|
287
283
|
setForking(false);
|
|
288
284
|
}
|
|
289
285
|
}, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);
|
|
290
|
-
const header = /* @__PURE__ */ jsxRuntime.
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
headerExtras,
|
|
303
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
304
|
-
ToolPreferences.ToolPreferences,
|
|
305
|
-
{
|
|
286
|
+
const header = /* @__PURE__ */ jsxRuntime.jsx(
|
|
287
|
+
ChatWindow_header.ChatWindowHeader,
|
|
288
|
+
{
|
|
289
|
+
mobile,
|
|
290
|
+
title,
|
|
291
|
+
threadId: panel.threadId,
|
|
292
|
+
maximized: panel.maximized,
|
|
293
|
+
threadsSource,
|
|
294
|
+
sessionsApi,
|
|
295
|
+
titleRefresh,
|
|
296
|
+
headerExtras,
|
|
297
|
+
toolPreferences: {
|
|
306
298
|
tools: resolvedTools,
|
|
307
299
|
value: toolPrefs,
|
|
308
300
|
onRule: handleToolRule,
|
|
@@ -325,152 +317,95 @@ function ChatWindow({
|
|
|
325
317
|
catalogLoading,
|
|
326
318
|
catalogError,
|
|
327
319
|
onCatalogRetry: retryCatalogs
|
|
328
|
-
}
|
|
329
|
-
),
|
|
330
|
-
sessionsApi && /* @__PURE__ */ jsxRuntime.jsx(
|
|
331
|
-
button.Button,
|
|
332
|
-
{
|
|
333
|
-
variant: "ghost",
|
|
334
|
-
size: "icon",
|
|
335
|
-
title: messageCount === 0 ? "Send a message before forking this conversation" : "Fork conversation into a new window",
|
|
336
|
-
disabled: !panel.threadId || messageCount === 0 || forking,
|
|
337
|
-
onClick: () => void handleFork(),
|
|
338
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiGitBranch.UiGitBranch, className: "size-4" })
|
|
339
|
-
}
|
|
340
|
-
),
|
|
341
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
342
|
-
button.Button,
|
|
343
|
-
{
|
|
344
|
-
variant: "ghost",
|
|
345
|
-
size: "icon",
|
|
346
|
-
title: "New window",
|
|
347
|
-
onClick: () => openPanel(),
|
|
348
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "size-4" })
|
|
349
|
-
}
|
|
350
|
-
),
|
|
351
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
352
|
-
button.Button,
|
|
353
|
-
{
|
|
354
|
-
variant: "ghost",
|
|
355
|
-
size: "icon",
|
|
356
|
-
title: panel.maximized ? "Restore" : "Maximize",
|
|
357
|
-
onClick: () => maximizePanel(panel.id),
|
|
358
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiFullscreen.UiFullscreen, className: "size-4" })
|
|
359
|
-
}
|
|
360
|
-
),
|
|
361
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
362
|
-
button.Button,
|
|
363
|
-
{
|
|
364
|
-
variant: "ghost",
|
|
365
|
-
size: "icon",
|
|
366
|
-
title: "Close",
|
|
367
|
-
onClick: () => closePanel(panel.id),
|
|
368
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "size-4" })
|
|
369
|
-
}
|
|
370
|
-
)
|
|
371
|
-
] });
|
|
372
|
-
const frame = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl", children: [
|
|
373
|
-
header,
|
|
374
|
-
(renderContextPicker || panel.contextItems.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5", children: [
|
|
375
|
-
renderContextPicker == null ? void 0 : renderContextPicker({
|
|
376
|
-
items: panel.contextItems,
|
|
377
|
-
onAdd: addContext,
|
|
378
|
-
onAddMany: addContextItems
|
|
379
|
-
}),
|
|
380
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
381
|
-
ContextBadges.ContextBadges,
|
|
382
|
-
{
|
|
383
|
-
items: panel.contextItems,
|
|
384
|
-
onRemove: removeContext,
|
|
385
|
-
className: "px-0 py-0",
|
|
386
|
-
...contextTypeConfig ? { typeConfig: contextTypeConfig } : {}
|
|
387
|
-
}
|
|
388
|
-
)
|
|
389
|
-
] }),
|
|
390
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: threadSetup.blocked ? /* @__PURE__ */ jsxRuntime.jsx(ChatWindow_threadStatus.ChatThreadSetupStatus, { setup: threadSetup }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
391
|
-
Chat.Chat,
|
|
392
|
-
{
|
|
393
|
-
...chat,
|
|
394
|
-
...resolvedModels.length ? { models: resolvedModels, modelsApi: null } : {},
|
|
395
|
-
runtime,
|
|
396
|
-
...runtimeFamilies ? { runtimeFamilies } : {},
|
|
397
|
-
permissionMode,
|
|
398
|
-
onRuntimeChange: handleRuntimeChange,
|
|
399
|
-
onModelChange: handleModelChange,
|
|
400
|
-
onReasoningEffortChange: handleReasoningEffortChange,
|
|
401
|
-
budget,
|
|
402
|
-
onUsage: handleUsage,
|
|
403
|
-
runtimeLocked,
|
|
404
|
-
onMessageCountChange: handleMessageCountChange,
|
|
405
|
-
onSessionHydrated: handleSessionHydrated,
|
|
406
|
-
...panel.threadId ? { threadId: panel.threadId } : {},
|
|
407
|
-
sessionsApi,
|
|
408
|
-
tools: resolvedTools,
|
|
409
|
-
...toolRenderers ? { toolRenderers } : {},
|
|
410
|
-
body: mergedBody,
|
|
411
|
-
initialPrompt,
|
|
412
|
-
onInitialPromptConsumed: handleInitialPromptConsumed,
|
|
413
|
-
proposedPrompts,
|
|
414
|
-
onProposedPromptsConsumed: handleProposedPromptsConsumed
|
|
415
320
|
},
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
321
|
+
hasMessages: messageCount > 0,
|
|
322
|
+
forkDisabled: !panel.threadId || messageCount === 0 || forking,
|
|
323
|
+
onSelectThread: (threadId) => updatePanel(panel.id, { threadId }),
|
|
324
|
+
onNewThread: () => updatePanel(panel.id, { threadId: null }),
|
|
325
|
+
onFork: () => void handleFork(),
|
|
326
|
+
onNewWindow: () => openPanel(),
|
|
327
|
+
onMaximize: () => maximizePanel(panel.id),
|
|
328
|
+
onClose: () => closePanel(panel.id)
|
|
329
|
+
}
|
|
422
330
|
);
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
331
|
+
const frame = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
332
|
+
"div",
|
|
333
|
+
{
|
|
334
|
+
className: utils.cn(
|
|
335
|
+
"flex h-full flex-col overflow-hidden bg-background",
|
|
336
|
+
!mobile && "rounded-lg border border-border shadow-xl"
|
|
337
|
+
),
|
|
338
|
+
children: [
|
|
339
|
+
header,
|
|
340
|
+
(renderContextPicker || panel.contextItems.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5", children: [
|
|
341
|
+
renderContextPicker == null ? void 0 : renderContextPicker({
|
|
342
|
+
items: panel.contextItems,
|
|
343
|
+
onAdd: addContext,
|
|
344
|
+
onAddMany: addContextItems
|
|
345
|
+
}),
|
|
346
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
347
|
+
ContextBadges.ContextBadges,
|
|
348
|
+
{
|
|
349
|
+
items: panel.contextItems,
|
|
350
|
+
onRemove: removeContext,
|
|
351
|
+
className: "px-0 py-0",
|
|
352
|
+
...contextTypeConfig ? { typeConfig: contextTypeConfig } : {}
|
|
353
|
+
}
|
|
354
|
+
)
|
|
355
|
+
] }),
|
|
356
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: threadSetup.blocked ? /* @__PURE__ */ jsxRuntime.jsx(ChatWindow_threadStatus.ChatThreadSetupStatus, { setup: threadSetup }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
357
|
+
Chat.Chat,
|
|
358
|
+
{
|
|
359
|
+
...chat,
|
|
360
|
+
...resolvedModels.length ? { models: resolvedModels, modelsApi: null } : {},
|
|
361
|
+
runtime,
|
|
362
|
+
...runtimeFamilies ? { runtimeFamilies } : {},
|
|
363
|
+
permissionMode,
|
|
364
|
+
onRuntimeChange: handleRuntimeChange,
|
|
365
|
+
onModelChange: handleModelChange,
|
|
366
|
+
onReasoningEffortChange: handleReasoningEffortChange,
|
|
367
|
+
budget,
|
|
368
|
+
onUsage: handleUsage,
|
|
369
|
+
runtimeLocked,
|
|
370
|
+
onMessageCountChange: handleMessageCountChange,
|
|
371
|
+
onSessionHydrated: handleSessionHydrated,
|
|
372
|
+
...panel.threadId ? { threadId: panel.threadId } : {},
|
|
373
|
+
sessionsApi,
|
|
374
|
+
tools: resolvedTools,
|
|
375
|
+
...toolRenderers ? { toolRenderers } : {},
|
|
376
|
+
body: mergedBody,
|
|
377
|
+
initialPrompt,
|
|
378
|
+
onInitialPromptConsumed: handleInitialPromptConsumed,
|
|
379
|
+
proposedPrompts,
|
|
380
|
+
onProposedPromptsConsumed: handleProposedPromptsConsumed
|
|
381
|
+
},
|
|
382
|
+
panel.threadId ?? `new-${panel.id}`
|
|
383
|
+
) })
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
const layerStyle = { zIndex: panel.zIndex };
|
|
388
|
+
if (mobile) {
|
|
389
|
+
const front = panels.reduce((top, p) => p.zIndex >= top.zIndex ? p : top);
|
|
390
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ChatWindow_placement.ChatWindowSheet, { layerStyle, hidden: front.id !== panel.id, children: frame });
|
|
438
391
|
}
|
|
439
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
440
|
-
|
|
441
|
-
|
|
392
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
393
|
+
ChatWindow_placement.ChatWindowFloating,
|
|
394
|
+
{
|
|
395
|
+
panel,
|
|
396
|
+
layerStyle,
|
|
442
397
|
Rnd,
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
height: panel.height
|
|
449
|
-
},
|
|
450
|
-
style: { pointerEvents: "auto" },
|
|
451
|
-
minWidth: Math.min(360, Math.max(1, window.innerWidth - 32)),
|
|
452
|
-
minHeight: Math.min(400, Math.max(1, window.innerHeight - 32)),
|
|
453
|
-
bounds: "parent",
|
|
454
|
-
dragHandleClassName: "chat-drag-handle",
|
|
455
|
-
disableDragging: panel.maximized,
|
|
456
|
-
enableResizing: !panel.maximized,
|
|
457
|
-
onDragStart: () => bringToFront(panel.id),
|
|
458
|
-
onDragStop: (_e, d) => updatePanel(panel.id, { x: d.x, y: d.y }),
|
|
459
|
-
onResizeStop: (_e, _dir, ref, _delta, pos) => updatePanel(panel.id, {
|
|
460
|
-
width: ref.offsetWidth,
|
|
461
|
-
height: ref.offsetHeight,
|
|
462
|
-
x: pos.x,
|
|
463
|
-
y: pos.y
|
|
464
|
-
}),
|
|
465
|
-
children: frame
|
|
466
|
-
}
|
|
467
|
-
)
|
|
468
|
-
] });
|
|
398
|
+
onDragStart: () => bringToFront(panel.id),
|
|
399
|
+
onGeometryChange: (partial) => updatePanel(panel.id, partial),
|
|
400
|
+
children: frame
|
|
401
|
+
}
|
|
402
|
+
);
|
|
469
403
|
}
|
|
470
404
|
function ChatWindowLayer(props) {
|
|
471
405
|
const { panels } = chatWindowContext.useChatWindowManager();
|
|
472
406
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: panels.map((panel) => /* @__PURE__ */ jsxRuntime.jsx(ChatWindow, { panel, ...props }, panel.id)) });
|
|
473
407
|
}
|
|
408
|
+
exports.CHAT_WINDOW_MOBILE_QUERY = ChatWindow_placement.CHAT_WINDOW_MOBILE_QUERY;
|
|
474
409
|
exports.ChatWindow = ChatWindow;
|
|
475
410
|
exports.ChatWindowLayer = ChatWindowLayer;
|
|
476
411
|
//# sourceMappingURL=ChatWindow.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.cjs","sources":["../../../src/data/ai/ChatWindow.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiAdd, UiClose, UiFullscreen, UiGitBranch } from \"../../icons\";\nimport { Chat } from \"../chat/Chat\";\nimport { forkChatSession, type CaptainChatSession } from \"../chat/approval\";\nimport type {\n ChatBudgetConfig,\n ChatUsageSummary,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { ThreadPicker } from \"./ThreadPicker\";\nimport { ContextBadges } from \"./ContextBadges\";\nimport { ToolPreferences, type ToolMeta } from \"./ToolPreferences\";\nimport type { ChatContextItem } from \"./context\";\nimport { chatWindowRequestBody } from \"./ChatWindowRequestBody\";\nimport {\n loadChatPreferences,\n saveChatPreferences,\n type StoredChatPreferences,\n} from \"./ChatWindow.preferences\";\nimport { useChatWindowRuntime } from \"./ChatWindow.runtime\";\nimport { useChatWindowCatalogs } from \"./ChatWindow.catalogs\";\nimport { normalizeToolCatalog } from \"./ChatWindow.tool-catalog\";\nimport {\n effectiveToolPolicies,\n withUserRule,\n} from \"./ToolPreferences.model\";\nimport type {\n PermissionPolicy,\n PermissionRule,\n} from \"../chat/tool-policy\";\nimport { useChatThreadSetup } from \"./ChatWindow.thread\";\nimport { ChatThreadSetupStatus } from \"./ChatWindow.thread-status\";\nimport type { ChatWindowProps } from \"./ChatWindow.types\";\nexport type {\n ChatContextPickerRenderProps,\n ChatWindowProps,\n} from \"./ChatWindow.types\";\n\nconst EMPTY_TOOLS: ToolMeta[] = [];\n\nconst MAXIMIZE_CSS = `\n.chat-maximized .react-draggable {\n transform: none !important;\n width: auto !important;\n height: auto !important;\n inset: 0 !important;\n position: absolute !important;\n}`;\n\n/** A draggable, resizable floating chat window. It lazy-loads `react-rnd` (an\n * optional dependency, so consumers of just the inner <Chat> never pull it)\n * and renders the existing <Chat> beneath a drag-handle header with thread\n * switching, a context-badge row and optional tool preferences. */\nexport function ChatWindow({\n panel,\n chat,\n title = \"Assistant\",\n sessionsApi = \"/api/chat/sessions\",\n threadsSource,\n contextTypeConfig,\n tools,\n defaultToolPolicy = \"ask\",\n toolsApi = \"/api/chat/tools\",\n runtimesApi = null,\n toolRenderers,\n headerExtras,\n renderContextPicker,\n}: ChatWindowProps) {\n const { updatePanel, closePanel, bringToFront, maximizePanel, openPanel } =\n useChatWindowManager();\n const threadSetup = useChatThreadSetup({\n threadId: panel.threadId,\n api: sessionsApi,\n source: threadsSource,\n onCreated: (threadId) => updatePanel(panel.id, { threadId }),\n });\n const [Rnd, setRnd] = useState<ComponentType<RndProps> | null>(null);\n const [storedPrefs] = useState<StoredChatPreferences>(() =>\n loadChatPreferences(),\n );\n const [budget, setBudget] = useState<ChatBudgetConfig>(\n chat?.budget ?? storedPrefs.budget ?? {},\n );\n const [permissionMode, setPermissionMode] = useState<ClaudePermissionMode>(\n chat?.permissionMode ?? storedPrefs.permissionMode ?? \"default\",\n );\n const [titleRefresh, setTitleRefresh] = useState(0);\n // Only the rules the user actually toggled are stored. Everything else is\n // derived, so a surface's rules still reach tools the user never touched, and\n // a group toggle keeps applying as the catalog grows.\n const [userToolRules, setUserToolRules] = useState<PermissionPolicy>(\n storedPrefs.toolRules ?? [],\n );\n const [fetchedTools, setFetchedTools] = useState<ToolMeta[] | undefined>(\n undefined,\n );\n const [toolsLoading, setToolsLoading] = useState(false);\n const [toolsError, setToolsError] = useState<string | null>(null);\n const resolvedTools = tools ?? fetchedTools ?? EMPTY_TOOLS;\n const modelsApi =\n chat?.modelsApi === undefined ? \"/api/chat/models\" : chat.modelsApi;\n const {\n models: resolvedModels,\n runtimeFamilies,\n loading: catalogLoading,\n error: catalogError,\n retry: retryCatalogs,\n } = useChatWindowCatalogs({\n models: chat?.models,\n modelsApi,\n runtimeFamilies: chat?.runtimeFamilies,\n runtimesApi,\n });\n const {\n runtime,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n } = useChatWindowRuntime({\n chat,\n initialModel: panel.initialModel,\n models: resolvedModels,\n storedRuntime: storedPrefs.runtime,\n });\n const [messageCount, setMessageCount] = useState(0);\n const [runtimeBound, setRuntimeBound] = useState(false);\n const [forking, setForking] = useState(false);\n const runtimeLocked = runtimeBound || messageCount > 0;\n const preferredRuntimeRef = useRef(runtime);\n const threadIdRef = useRef(panel.threadId);\n threadIdRef.current = panel.threadId;\n\n useEffect(() => {\n if (!runtimeLocked) preferredRuntimeRef.current = runtime;\n }, [runtime, runtimeLocked]);\n\n useEffect(() => {\n setMessageCount(0);\n setRuntimeBound(false);\n replaceRuntime(preferredRuntimeRef.current);\n }, [panel.threadId, replaceRuntime]);\n\n useEffect(() => {\n if (chat?.budget !== undefined) setBudget(chat.budget);\n }, [chat?.budget]);\n\n useEffect(() => {\n if (chat?.permissionMode !== undefined)\n setPermissionMode(chat.permissionMode);\n }, [chat?.permissionMode]);\n\n useEffect(() => {\n if (tools || toolsApi === null) return;\n let active = true;\n setToolsLoading(true);\n setToolsError(null);\n fetch(toolsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`tools ${r.status}`)),\n )\n .then((data) => {\n if (!active) return;\n setFetchedTools(normalizeToolCatalog(data));\n })\n .catch((err) => {\n if (!active) return;\n setToolsError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n if (active) setToolsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [tools, toolsApi]);\n\n useEffect(() => {\n saveChatPreferences({\n runtime: runtimeLocked ? preferredRuntimeRef.current : runtime,\n ...(budget.cost !== undefined || budget.maxTokens !== undefined\n ? { budget }\n : {}),\n permissionMode,\n toolRules: userToolRules,\n });\n }, [budget, permissionMode, runtime, runtimeLocked, userToolRules]);\n\n const toolPrefs = useMemo(\n () =>\n effectiveToolPolicies({\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userRules: userToolRules,\n fallback: defaultToolPolicy,\n }),\n [defaultToolPolicy, panel.toolPolicy, resolvedTools, userToolRules],\n );\n\n // The popover hands back the one rule the toggle means, not a whole map, so\n // which control was used survives into the request.\n const handleToolRule = useCallback((rule: PermissionRule) => {\n setUserToolRules((prev) => withUserRule(prev, rule));\n }, []);\n\n useEffect(() => {\n let active = true;\n import(\"react-rnd\").then((m) => {\n if (active) setRnd(() => m.Rnd as unknown as ComponentType<RndProps>);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const removeContext = useCallback(\n (id: string) =>\n updatePanel(panel.id, {\n contextItems: panel.contextItems.filter((c) => c.id !== id),\n }),\n [updatePanel, panel.id, panel.contextItems],\n );\n\n const addContextItems = useCallback(\n (items: ChatContextItem[]) =>\n updatePanel(panel.id, {\n contextItems: [\n ...panel.contextItems,\n ...items.filter(\n (item, index) =>\n !panel.contextItems.some((existing) => existing.id === item.id) &&\n items.findIndex((candidate) => candidate.id === item.id) ===\n index,\n ),\n ],\n }),\n [panel.contextItems, panel.id, updatePanel],\n );\n const addContext = useCallback(\n (item: ChatContextItem) => addContextItems([item]),\n [addContextItems],\n );\n\n const mergedBody = chatWindowRequestBody({\n base: chat?.body,\n contextItems: panel.contextItems,\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userPolicy: userToolRules,\n });\n\n const initialPrompt = panel.initialPrompt ?? chat?.initialPrompt ?? null;\n const handleInitialPromptConsumed = useCallback(() => {\n if (panel.initialPrompt) updatePanel(panel.id, { initialPrompt: null });\n chat?.onInitialPromptConsumed?.();\n }, [chat, panel.id, panel.initialPrompt, updatePanel]);\n const proposedPrompts = panel.proposedPrompts?.length\n ? panel.proposedPrompts\n : (chat?.proposedPrompts ?? null);\n const handleProposedPromptsConsumed = useCallback(() => {\n if (panel.proposedPrompts?.length)\n updatePanel(panel.id, { proposedPrompts: [] });\n chat?.onProposedPromptsConsumed?.();\n }, [chat, panel.id, panel.proposedPrompts, updatePanel]);\n const handleUsage = useCallback(\n (snapshot: ChatUsageSummary) => {\n // A settled turn is also when the backend has named the conversation, so\n // this is what refreshes the picker's label.\n setTitleRefresh((value) => value + 1);\n chat?.onUsage?.(snapshot);\n },\n [chat],\n );\n const handlePermissionModeChange = useCallback(\n (next: ClaudePermissionMode) => {\n setPermissionMode(next);\n chat?.onPermissionModeChange?.(next);\n },\n [chat],\n );\n const handleSessionHydrated = useCallback(\n (session: CaptainChatSession) => {\n if (session.id !== panel.threadId) return;\n // A hydrated session names its runtime as (model, mode). Requiring a\n // `backend` key here left every loaded session unbound — the picker kept\n // its defaults and the next send posted a runtime the thread had not\n // agreed to.\n setRuntimeBound(Boolean(session.runtime?.model && session.runtime.mode));\n if (session.runtime?.model && session.runtime.mode) {\n replaceRuntimeIdentity(session.runtime);\n }\n chat?.onSessionHydrated?.(session);\n },\n [chat, panel.threadId, replaceRuntimeIdentity],\n );\n const handleMessageCountChange = useCallback(\n (count: number) => {\n setMessageCount(count);\n chat?.onMessageCountChange?.(count);\n },\n [chat],\n );\n const handleFork = useCallback(async () => {\n if (!sessionsApi || !panel.threadId || messageCount === 0 || forking)\n return;\n const sourceThreadId = panel.threadId;\n setForking(true);\n try {\n const fork = await forkChatSession(sessionsApi, sourceThreadId);\n if (threadIdRef.current !== sourceThreadId) return;\n openPanel({ threadId: fork.id });\n } catch (error) {\n console.warn(\"clicky-ui: failed to fork chat session\", error);\n } finally {\n setForking(false);\n }\n }, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);\n\n const header = (\n <div className=\"chat-drag-handle flex cursor-move items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5\">\n {threadsSource != null || sessionsApi !== null ? (\n <ThreadPicker\n threadId={panel.threadId}\n onSelect={(tid) => updatePanel(panel.id, { threadId: tid })}\n onNew={() => updatePanel(panel.id, { threadId: null })}\n refreshToken={titleRefresh}\n {...(threadsSource\n ? { source: threadsSource }\n : sessionsApi !== null\n ? { api: sessionsApi }\n : {})}\n />\n ) : (\n <span className=\"px-1 text-sm font-medium\">{title}</span>\n )}\n <div className=\"flex-1\" />\n {headerExtras}\n <ToolPreferences\n tools={resolvedTools}\n value={toolPrefs}\n onRule={handleToolRule}\n rules={userToolRules}\n onRulesChange={setUserToolRules}\n models={resolvedModels}\n runtime={runtime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={handlePermissionModeChange}\n budget={budget}\n onBudgetChange={setBudget}\n runtimeLocked={runtimeLocked}\n {...(sessionsApi ? { costsApi: sessionsApi } : {})}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n toolsLoading={toolsLoading}\n toolsError={toolsError}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={retryCatalogs}\n />\n {sessionsApi && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={\n messageCount === 0\n ? \"Send a message before forking this conversation\"\n : \"Fork conversation into a new window\"\n }\n disabled={!panel.threadId || messageCount === 0 || forking}\n onClick={() => void handleFork()}\n >\n <Icon icon={UiGitBranch} className=\"size-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"New window\"\n onClick={() => openPanel()}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={panel.maximized ? \"Restore\" : \"Maximize\"}\n onClick={() => maximizePanel(panel.id)}\n >\n <Icon icon={UiFullscreen} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Close\"\n onClick={() => closePanel(panel.id)}\n >\n <Icon icon={UiClose} className=\"size-4\" />\n </Button>\n </div>\n );\n\n const frame = (\n <div className=\"flex h-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\">\n {header}\n {(renderContextPicker || panel.contextItems.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5\">\n {renderContextPicker?.({\n items: panel.contextItems,\n onAdd: addContext,\n onAddMany: addContextItems,\n })}\n <ContextBadges\n items={panel.contextItems}\n onRemove={removeContext}\n className=\"px-0 py-0\"\n {...(contextTypeConfig ? { typeConfig: contextTypeConfig } : {})}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {threadSetup.blocked ? (\n <ChatThreadSetupStatus setup={threadSetup} />\n ) : (\n <Chat\n key={panel.threadId ?? `new-${panel.id}`}\n {...chat}\n {...(resolvedModels.length\n ? { models: resolvedModels, modelsApi: null }\n : {})}\n runtime={runtime}\n {...(runtimeFamilies ? { runtimeFamilies } : {})}\n permissionMode={permissionMode}\n onRuntimeChange={handleRuntimeChange}\n onModelChange={handleModelChange}\n onReasoningEffortChange={handleReasoningEffortChange}\n budget={budget}\n onUsage={handleUsage}\n runtimeLocked={runtimeLocked}\n onMessageCountChange={handleMessageCountChange}\n onSessionHydrated={handleSessionHydrated}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n sessionsApi={sessionsApi}\n tools={resolvedTools}\n {...(toolRenderers ? { toolRenderers } : {})}\n body={mergedBody}\n initialPrompt={initialPrompt}\n onInitialPromptConsumed={handleInitialPromptConsumed}\n proposedPrompts={proposedPrompts}\n onProposedPromptsConsumed={handleProposedPromptsConsumed}\n />\n )}\n </div>\n </div>\n );\n\n const outerClass = cn(\n \"fixed pointer-events-none\",\n panel.maximized ? \"inset-4 chat-maximized\" : \"inset-0\",\n );\n\n // Until react-rnd loads (and as a graceful fallback if it never does) the\n // window is statically positioned — still usable, just not draggable.\n if (!Rnd) {\n return (\n <div className={outerClass} style={{ zIndex: panel.zIndex }}>\n <div\n className=\"pointer-events-auto h-full\"\n style={\n panel.maximized\n ? { position: \"relative\", width: \"100%\", height: \"100%\" }\n : {\n position: \"absolute\",\n left: panel.x,\n top: panel.y,\n width: panel.width,\n height: panel.height,\n }\n }\n >\n {frame}\n </div>\n </div>\n );\n }\n\n return (\n <div className={outerClass} style={{ zIndex: panel.zIndex }}>\n <style>{MAXIMIZE_CSS}</style>\n <Rnd\n default={{\n x: panel.x,\n y: panel.y,\n width: panel.width,\n height: panel.height,\n }}\n style={{ pointerEvents: \"auto\" }}\n minWidth={Math.min(360, Math.max(1, window.innerWidth - 32))}\n minHeight={Math.min(400, Math.max(1, window.innerHeight - 32))}\n bounds=\"parent\"\n dragHandleClassName=\"chat-drag-handle\"\n disableDragging={panel.maximized}\n enableResizing={!panel.maximized}\n onDragStart={() => bringToFront(panel.id)}\n onDragStop={(_e, d) => updatePanel(panel.id, { x: d.x, y: d.y })}\n onResizeStop={(_e, _dir, ref, _delta, pos) =>\n updatePanel(panel.id, {\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n x: pos.x,\n y: pos.y,\n })\n }\n >\n {frame}\n </Rnd>\n </div>\n );\n}\n\n/** Renders every open window for the current {@link useChatWindowManager}.\n * Drop one of these near the root alongside a <ChatFab/>. */\nexport function ChatWindowLayer(props: Omit<ChatWindowProps, \"panel\">) {\n const { panels } = useChatWindowManager();\n return (\n <>\n {panels.map((panel) => (\n <ChatWindow key={panel.id} panel={panel} {...props} />\n ))}\n </>\n );\n}\n"],"names":["useChatWindowManager","useChatThreadSetup","useState","loadChatPreferences","useChatWindowCatalogs","useChatWindowRuntime","useRef","useEffect","normalizeToolCatalog","saveChatPreferences","useMemo","effectiveToolPolicies","useCallback","withUserRule","chatWindowRequestBody","_a","forkChatSession","jsxs","jsx","ThreadPicker","ToolPreferences","Button","Icon","UiGitBranch","UiAdd","UiFullscreen","UiClose","ContextBadges","ChatThreadSetupStatus","Chat","cn","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChatWindow.cjs","sources":["../../../src/data/ai/ChatWindow.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport { useMediaQuery } from \"../../hooks/use-media-query\";\nimport { Chat } from \"../chat/Chat\";\nimport { forkChatSession, type CaptainChatSession } from \"../chat/approval\";\nimport type {\n ChatBudgetConfig,\n ChatUsageSummary,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { ChatWindowHeader } from \"./ChatWindow.header\";\nimport { ContextBadges } from \"./ContextBadges\";\nimport type { ToolMeta } from \"./ToolPreferences\";\nimport type { ChatContextItem } from \"./context\";\nimport { chatWindowRequestBody } from \"./ChatWindowRequestBody\";\nimport {\n loadChatPreferences,\n saveChatPreferences,\n type StoredChatPreferences,\n} from \"./ChatWindow.preferences\";\nimport { useChatWindowRuntime } from \"./ChatWindow.runtime\";\nimport { useChatWindowCatalogs } from \"./ChatWindow.catalogs\";\nimport { normalizeToolCatalog } from \"./ChatWindow.tool-catalog\";\nimport {\n effectiveToolPolicies,\n withUserRule,\n} from \"./ToolPreferences.model\";\nimport type {\n PermissionPolicy,\n PermissionRule,\n} from \"../chat/tool-policy\";\nimport { useChatThreadSetup } from \"./ChatWindow.thread\";\nimport { ChatThreadSetupStatus } from \"./ChatWindow.thread-status\";\nimport type { ChatWindowProps } from \"./ChatWindow.types\";\nimport {\n CHAT_WINDOW_MOBILE_QUERY,\n ChatWindowFloating,\n ChatWindowSheet,\n} from \"./ChatWindow.placement\";\nexport { CHAT_WINDOW_MOBILE_QUERY };\nexport type {\n ChatContextPickerRenderProps,\n ChatWindowProps,\n} from \"./ChatWindow.types\";\n\nconst EMPTY_TOOLS: ToolMeta[] = [];\n\n/** A draggable, resizable floating chat window — or, below\n * {@link CHAT_WINDOW_MOBILE_QUERY}, a full-screen sheet. It lazy-loads `react-rnd` (an\n * optional dependency, so consumers of just the inner <Chat> never pull it)\n * and renders the existing <Chat> beneath a drag-handle header with thread\n * switching, a context-badge row and optional tool preferences. */\nexport function ChatWindow({\n panel,\n chat,\n title = \"Assistant\",\n sessionsApi = \"/api/chat/sessions\",\n threadsSource,\n contextTypeConfig,\n tools,\n defaultToolPolicy = \"ask\",\n toolsApi = \"/api/chat/tools\",\n runtimesApi = null,\n toolRenderers,\n headerExtras,\n renderContextPicker,\n}: ChatWindowProps) {\n const {\n panels,\n updatePanel,\n closePanel,\n bringToFront,\n maximizePanel,\n openPanel,\n } = useChatWindowManager();\n const mobile = useMediaQuery(CHAT_WINDOW_MOBILE_QUERY);\n const threadSetup = useChatThreadSetup({\n threadId: panel.threadId,\n api: sessionsApi,\n source: threadsSource,\n onCreated: (threadId) => updatePanel(panel.id, { threadId }),\n });\n const [Rnd, setRnd] = useState<ComponentType<RndProps> | null>(null);\n const [storedPrefs] = useState<StoredChatPreferences>(() =>\n loadChatPreferences(),\n );\n const [budget, setBudget] = useState<ChatBudgetConfig>(\n chat?.budget ?? storedPrefs.budget ?? {},\n );\n const [permissionMode, setPermissionMode] = useState<ClaudePermissionMode>(\n chat?.permissionMode ?? storedPrefs.permissionMode ?? \"default\",\n );\n const [titleRefresh, setTitleRefresh] = useState(0);\n // Only the rules the user actually toggled are stored. Everything else is\n // derived, so a surface's rules still reach tools the user never touched, and\n // a group toggle keeps applying as the catalog grows.\n const [userToolRules, setUserToolRules] = useState<PermissionPolicy>(\n storedPrefs.toolRules ?? [],\n );\n const [fetchedTools, setFetchedTools] = useState<ToolMeta[] | undefined>(\n undefined,\n );\n const [toolsLoading, setToolsLoading] = useState(false);\n const [toolsError, setToolsError] = useState<string | null>(null);\n const resolvedTools = tools ?? fetchedTools ?? EMPTY_TOOLS;\n const modelsApi =\n chat?.modelsApi === undefined ? \"/api/chat/models\" : chat.modelsApi;\n const {\n models: resolvedModels,\n runtimeFamilies,\n loading: catalogLoading,\n error: catalogError,\n retry: retryCatalogs,\n } = useChatWindowCatalogs({\n models: chat?.models,\n modelsApi,\n runtimeFamilies: chat?.runtimeFamilies,\n runtimesApi,\n });\n const {\n runtime,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n } = useChatWindowRuntime({\n chat,\n initialModel: panel.initialModel,\n models: resolvedModels,\n storedRuntime: storedPrefs.runtime,\n });\n const [messageCount, setMessageCount] = useState(0);\n const [runtimeBound, setRuntimeBound] = useState(false);\n const [forking, setForking] = useState(false);\n const runtimeLocked = runtimeBound || messageCount > 0;\n const preferredRuntimeRef = useRef(runtime);\n const threadIdRef = useRef(panel.threadId);\n threadIdRef.current = panel.threadId;\n\n useEffect(() => {\n if (!runtimeLocked) preferredRuntimeRef.current = runtime;\n }, [runtime, runtimeLocked]);\n\n useEffect(() => {\n setMessageCount(0);\n setRuntimeBound(false);\n replaceRuntime(preferredRuntimeRef.current);\n }, [panel.threadId, replaceRuntime]);\n\n useEffect(() => {\n if (chat?.budget !== undefined) setBudget(chat.budget);\n }, [chat?.budget]);\n\n useEffect(() => {\n if (chat?.permissionMode !== undefined)\n setPermissionMode(chat.permissionMode);\n }, [chat?.permissionMode]);\n\n useEffect(() => {\n if (tools || toolsApi === null) return;\n let active = true;\n setToolsLoading(true);\n setToolsError(null);\n fetch(toolsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`tools ${r.status}`)),\n )\n .then((data) => {\n if (!active) return;\n setFetchedTools(normalizeToolCatalog(data));\n })\n .catch((err) => {\n if (!active) return;\n setToolsError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n if (active) setToolsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [tools, toolsApi]);\n\n useEffect(() => {\n saveChatPreferences({\n runtime: runtimeLocked ? preferredRuntimeRef.current : runtime,\n ...(budget.cost !== undefined || budget.maxTokens !== undefined\n ? { budget }\n : {}),\n permissionMode,\n toolRules: userToolRules,\n });\n }, [budget, permissionMode, runtime, runtimeLocked, userToolRules]);\n\n const toolPrefs = useMemo(\n () =>\n effectiveToolPolicies({\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userRules: userToolRules,\n fallback: defaultToolPolicy,\n }),\n [defaultToolPolicy, panel.toolPolicy, resolvedTools, userToolRules],\n );\n\n // The popover hands back the one rule the toggle means, not a whole map, so\n // which control was used survives into the request.\n const handleToolRule = useCallback((rule: PermissionRule) => {\n setUserToolRules((prev) => withUserRule(prev, rule));\n }, []);\n\n useEffect(() => {\n if (mobile) return;\n let active = true;\n import(\"react-rnd\").then((m) => {\n if (active) setRnd(() => m.Rnd as unknown as ComponentType<RndProps>);\n });\n return () => {\n active = false;\n };\n }, [mobile]);\n\n const removeContext = useCallback(\n (id: string) =>\n updatePanel(panel.id, {\n contextItems: panel.contextItems.filter((c) => c.id !== id),\n }),\n [updatePanel, panel.id, panel.contextItems],\n );\n\n const addContextItems = useCallback(\n (items: ChatContextItem[]) =>\n updatePanel(panel.id, {\n contextItems: [\n ...panel.contextItems,\n ...items.filter(\n (item, index) =>\n !panel.contextItems.some((existing) => existing.id === item.id) &&\n items.findIndex((candidate) => candidate.id === item.id) ===\n index,\n ),\n ],\n }),\n [panel.contextItems, panel.id, updatePanel],\n );\n const addContext = useCallback(\n (item: ChatContextItem) => addContextItems([item]),\n [addContextItems],\n );\n\n const mergedBody = chatWindowRequestBody({\n base: chat?.body,\n contextItems: panel.contextItems,\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userPolicy: userToolRules,\n });\n\n const initialPrompt = panel.initialPrompt ?? chat?.initialPrompt ?? null;\n const handleInitialPromptConsumed = useCallback(() => {\n if (panel.initialPrompt) updatePanel(panel.id, { initialPrompt: null });\n chat?.onInitialPromptConsumed?.();\n }, [chat, panel.id, panel.initialPrompt, updatePanel]);\n const proposedPrompts = panel.proposedPrompts?.length\n ? panel.proposedPrompts\n : (chat?.proposedPrompts ?? null);\n const handleProposedPromptsConsumed = useCallback(() => {\n if (panel.proposedPrompts?.length)\n updatePanel(panel.id, { proposedPrompts: [] });\n chat?.onProposedPromptsConsumed?.();\n }, [chat, panel.id, panel.proposedPrompts, updatePanel]);\n const handleUsage = useCallback(\n (snapshot: ChatUsageSummary) => {\n // A settled turn is also when the backend has named the conversation, so\n // this is what refreshes the picker's label.\n setTitleRefresh((value) => value + 1);\n chat?.onUsage?.(snapshot);\n },\n [chat],\n );\n const handlePermissionModeChange = useCallback(\n (next: ClaudePermissionMode) => {\n setPermissionMode(next);\n chat?.onPermissionModeChange?.(next);\n },\n [chat],\n );\n const handleSessionHydrated = useCallback(\n (session: CaptainChatSession) => {\n if (session.id !== panel.threadId) return;\n // A hydrated session names its runtime as (model, mode). Requiring a\n // `backend` key here left every loaded session unbound — the picker kept\n // its defaults and the next send posted a runtime the thread had not\n // agreed to.\n setRuntimeBound(Boolean(session.runtime?.model && session.runtime.mode));\n if (session.runtime?.model && session.runtime.mode) {\n replaceRuntimeIdentity(session.runtime);\n }\n chat?.onSessionHydrated?.(session);\n },\n [chat, panel.threadId, replaceRuntimeIdentity],\n );\n const handleMessageCountChange = useCallback(\n (count: number) => {\n setMessageCount(count);\n chat?.onMessageCountChange?.(count);\n },\n [chat],\n );\n const handleFork = useCallback(async () => {\n if (!sessionsApi || !panel.threadId || messageCount === 0 || forking)\n return;\n const sourceThreadId = panel.threadId;\n setForking(true);\n try {\n const fork = await forkChatSession(sessionsApi, sourceThreadId);\n if (threadIdRef.current !== sourceThreadId) return;\n openPanel({ threadId: fork.id });\n } catch (error) {\n console.warn(\"clicky-ui: failed to fork chat session\", error);\n } finally {\n setForking(false);\n }\n }, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);\n\n const header = (\n <ChatWindowHeader\n mobile={mobile}\n title={title}\n threadId={panel.threadId}\n maximized={panel.maximized}\n threadsSource={threadsSource}\n sessionsApi={sessionsApi}\n titleRefresh={titleRefresh}\n headerExtras={headerExtras}\n toolPreferences={{\n tools: resolvedTools,\n value: toolPrefs,\n onRule: handleToolRule,\n rules: userToolRules,\n onRulesChange: setUserToolRules,\n models: resolvedModels,\n runtime,\n onRuntimeChange: handleRuntimeChange,\n runtimeFamilies,\n reasoningEfforts,\n permissionMode,\n onPermissionModeChange: handlePermissionModeChange,\n budget,\n onBudgetChange: setBudget,\n runtimeLocked,\n ...(sessionsApi ? { costsApi: sessionsApi } : {}),\n ...(panel.threadId ? { threadId: panel.threadId } : {}),\n toolsLoading,\n toolsError,\n catalogLoading,\n catalogError,\n onCatalogRetry: retryCatalogs,\n }}\n hasMessages={messageCount > 0}\n forkDisabled={!panel.threadId || messageCount === 0 || forking}\n onSelectThread={(threadId) => updatePanel(panel.id, { threadId })}\n onNewThread={() => updatePanel(panel.id, { threadId: null })}\n onFork={() => void handleFork()}\n onNewWindow={() => openPanel()}\n onMaximize={() => maximizePanel(panel.id)}\n onClose={() => closePanel(panel.id)}\n />\n );\n\n const frame = (\n <div\n className={cn(\n \"flex h-full flex-col overflow-hidden bg-background\",\n !mobile && \"rounded-lg border border-border shadow-xl\",\n )}\n >\n {header}\n {(renderContextPicker || panel.contextItems.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5\">\n {renderContextPicker?.({\n items: panel.contextItems,\n onAdd: addContext,\n onAddMany: addContextItems,\n })}\n <ContextBadges\n items={panel.contextItems}\n onRemove={removeContext}\n className=\"px-0 py-0\"\n {...(contextTypeConfig ? { typeConfig: contextTypeConfig } : {})}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {threadSetup.blocked ? (\n <ChatThreadSetupStatus setup={threadSetup} />\n ) : (\n <Chat\n key={panel.threadId ?? `new-${panel.id}`}\n {...chat}\n {...(resolvedModels.length\n ? { models: resolvedModels, modelsApi: null }\n : {})}\n runtime={runtime}\n {...(runtimeFamilies ? { runtimeFamilies } : {})}\n permissionMode={permissionMode}\n onRuntimeChange={handleRuntimeChange}\n onModelChange={handleModelChange}\n onReasoningEffortChange={handleReasoningEffortChange}\n budget={budget}\n onUsage={handleUsage}\n runtimeLocked={runtimeLocked}\n onMessageCountChange={handleMessageCountChange}\n onSessionHydrated={handleSessionHydrated}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n sessionsApi={sessionsApi}\n tools={resolvedTools}\n {...(toolRenderers ? { toolRenderers } : {})}\n body={mergedBody}\n initialPrompt={initialPrompt}\n onInitialPromptConsumed={handleInitialPromptConsumed}\n proposedPrompts={proposedPrompts}\n onProposedPromptsConsumed={handleProposedPromptsConsumed}\n />\n )}\n </div>\n </div>\n );\n\n const layerStyle = { zIndex: panel.zIndex };\n\n if (mobile) {\n const front = panels.reduce((top, p) => (p.zIndex >= top.zIndex ? p : top));\n return (\n <ChatWindowSheet layerStyle={layerStyle} hidden={front.id !== panel.id}>\n {frame}\n </ChatWindowSheet>\n );\n }\n\n return (\n <ChatWindowFloating\n panel={panel}\n layerStyle={layerStyle}\n Rnd={Rnd}\n onDragStart={() => bringToFront(panel.id)}\n onGeometryChange={(partial) => updatePanel(panel.id, partial)}\n >\n {frame}\n </ChatWindowFloating>\n );\n}\n\n/** Renders every open window for the current {@link useChatWindowManager}.\n * Below {@link CHAT_WINDOW_MOBILE_QUERY} each is a full-screen sheet and only\n * the most recently focused one is visible. Drop one of these near the root alongside a <ChatFab/>. */\nexport function ChatWindowLayer(props: Omit<ChatWindowProps, \"panel\">) {\n const { panels } = useChatWindowManager();\n return (\n <>\n {panels.map((panel) => (\n <ChatWindow key={panel.id} panel={panel} {...props} />\n ))}\n </>\n );\n}\n"],"names":["useChatWindowManager","useMediaQuery","CHAT_WINDOW_MOBILE_QUERY","useChatThreadSetup","useState","loadChatPreferences","useChatWindowCatalogs","useChatWindowRuntime","useRef","useEffect","normalizeToolCatalog","saveChatPreferences","useMemo","effectiveToolPolicies","useCallback","withUserRule","chatWindowRequestBody","_a","forkChatSession","jsx","ChatWindowHeader","jsxs","cn","ContextBadges","ChatThreadSetupStatus","Chat","ChatWindowSheet","ChatWindowFloating","Fragment"],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { ChatWindowProps } from './ChatWindow.types.js';
|
|
2
|
+
import { CHAT_WINDOW_MOBILE_QUERY } from './ChatWindow.placement.js';
|
|
3
|
+
export { CHAT_WINDOW_MOBILE_QUERY };
|
|
2
4
|
export type { ChatContextPickerRenderProps, ChatWindowProps, } from './ChatWindow.types.js';
|
|
3
|
-
/** A draggable, resizable floating chat window
|
|
5
|
+
/** A draggable, resizable floating chat window — or, below
|
|
6
|
+
* {@link CHAT_WINDOW_MOBILE_QUERY}, a full-screen sheet. It lazy-loads `react-rnd` (an
|
|
4
7
|
* optional dependency, so consumers of just the inner <Chat> never pull it)
|
|
5
8
|
* and renders the existing <Chat> beneath a drag-handle header with thread
|
|
6
9
|
* switching, a context-badge row and optional tool preferences. */
|
|
7
10
|
export declare function ChatWindow({ panel, chat, title, sessionsApi, threadsSource, contextTypeConfig, tools, defaultToolPolicy, toolsApi, runtimesApi, toolRenderers, headerExtras, renderContextPicker, }: ChatWindowProps): import("react").JSX.Element;
|
|
8
11
|
/** Renders every open window for the current {@link useChatWindowManager}.
|
|
9
|
-
*
|
|
12
|
+
* Below {@link CHAT_WINDOW_MOBILE_QUERY} each is a full-screen sheet and only
|
|
13
|
+
* the most recently focused one is visible. Drop one of these near the root alongside a <ChatFab/>. */
|
|
10
14
|
export declare function ChatWindowLayer(props: Omit<ChatWindowProps, "panel">): import("react").JSX.Element;
|
|
11
15
|
//# sourceMappingURL=ChatWindow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,wBAAwB,EAGzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,YAAY,EACV,4BAA4B,EAC5B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAI5B;;;;oEAIoE;AACpE,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACJ,KAAmB,EACnB,WAAkC,EAClC,aAAa,EACb,iBAAiB,EACjB,KAAK,EACL,iBAAyB,EACzB,QAA4B,EAC5B,WAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,EAAE,eAAe,+BAmYjB;AAED;;wGAEwG;AACxG,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,+BASpE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const utils = require("../../lib/utils.cjs");
|
|
5
|
+
const button = require("../../components/button.cjs");
|
|
6
|
+
const Icon = require("../Icon.cjs");
|
|
7
|
+
const ThreadPicker = require("./ThreadPicker.cjs");
|
|
8
|
+
const ToolPreferences = require("./ToolPreferences.cjs");
|
|
9
|
+
const UiArrowLeft = require("../../icons/components/UiArrowLeft.cjs");
|
|
10
|
+
const UiGitBranch = require("../../icons/components/UiGitBranch.cjs");
|
|
11
|
+
const UiAdd = require("../../icons/components/UiAdd.cjs");
|
|
12
|
+
const UiFullscreen = require("../../icons/components/UiFullscreen.cjs");
|
|
13
|
+
const UiClose = require("../../icons/components/UiClose.cjs");
|
|
14
|
+
function ChatWindowHeader({
|
|
15
|
+
mobile,
|
|
16
|
+
title,
|
|
17
|
+
threadId,
|
|
18
|
+
maximized,
|
|
19
|
+
threadsSource,
|
|
20
|
+
sessionsApi,
|
|
21
|
+
titleRefresh,
|
|
22
|
+
headerExtras,
|
|
23
|
+
toolPreferences,
|
|
24
|
+
hasMessages,
|
|
25
|
+
forkDisabled,
|
|
26
|
+
onSelectThread,
|
|
27
|
+
onNewThread,
|
|
28
|
+
onFork,
|
|
29
|
+
onNewWindow,
|
|
30
|
+
onMaximize,
|
|
31
|
+
onClose
|
|
32
|
+
}) {
|
|
33
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
className: utils.cn(
|
|
37
|
+
"flex items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5",
|
|
38
|
+
!mobile && "chat-drag-handle cursor-move"
|
|
39
|
+
),
|
|
40
|
+
children: [
|
|
41
|
+
mobile && /* @__PURE__ */ jsxRuntime.jsx(
|
|
42
|
+
button.Button,
|
|
43
|
+
{
|
|
44
|
+
variant: "ghost",
|
|
45
|
+
size: "icon",
|
|
46
|
+
title: "Back",
|
|
47
|
+
"aria-label": "Back",
|
|
48
|
+
onClick: onClose,
|
|
49
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiArrowLeft.UiArrowLeft, className: "size-4" })
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
threadsSource != null || sessionsApi !== null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
ThreadPicker.ThreadPicker,
|
|
54
|
+
{
|
|
55
|
+
threadId,
|
|
56
|
+
onSelect: onSelectThread,
|
|
57
|
+
onNew: onNewThread,
|
|
58
|
+
refreshToken: titleRefresh,
|
|
59
|
+
...threadsSource ? { source: threadsSource } : sessionsApi !== null ? { api: sessionsApi } : {}
|
|
60
|
+
}
|
|
61
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-1 text-sm font-medium", children: title }),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
|
|
63
|
+
headerExtras,
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(ToolPreferences.ToolPreferences, { ...toolPreferences }),
|
|
65
|
+
sessionsApi && /* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
button.Button,
|
|
67
|
+
{
|
|
68
|
+
variant: "ghost",
|
|
69
|
+
size: "icon",
|
|
70
|
+
title: hasMessages ? "Fork conversation into a new window" : "Send a message before forking this conversation",
|
|
71
|
+
disabled: forkDisabled,
|
|
72
|
+
onClick: onFork,
|
|
73
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiGitBranch.UiGitBranch, className: "size-4" })
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
77
|
+
button.Button,
|
|
78
|
+
{
|
|
79
|
+
variant: "ghost",
|
|
80
|
+
size: "icon",
|
|
81
|
+
title: "New window",
|
|
82
|
+
onClick: onNewWindow,
|
|
83
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "size-4" })
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
!mobile && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
button.Button,
|
|
89
|
+
{
|
|
90
|
+
variant: "ghost",
|
|
91
|
+
size: "icon",
|
|
92
|
+
title: maximized ? "Restore" : "Maximize",
|
|
93
|
+
onClick: onMaximize,
|
|
94
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiFullscreen.UiFullscreen, className: "size-4" })
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { variant: "ghost", size: "icon", title: "Close", onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "size-4" }) })
|
|
98
|
+
] })
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
exports.ChatWindowHeader = ChatWindowHeader;
|
|
104
|
+
//# sourceMappingURL=ChatWindow.header.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.header.cjs","sources":["../../../src/data/ai/ChatWindow.header.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport {\n UiAdd,\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiGitBranch,\n} from \"../../icons\";\nimport { ThreadPicker, type ThreadSource } from \"./ThreadPicker\";\nimport { ToolPreferences } from \"./ToolPreferences\";\n\nexport type ChatWindowHeaderProps = {\n /** Below the mobile breakpoint: a back button replaces drag, maximize and close. */\n mobile: boolean;\n title: ReactNode;\n threadId: string | null;\n maximized: boolean;\n threadsSource: ThreadSource | undefined;\n sessionsApi: string | null;\n /** Bumped when a turn settles so the picker re-reads the conversation name. */\n titleRefresh: number;\n headerExtras: ReactNode;\n toolPreferences: ComponentProps<typeof ToolPreferences>;\n hasMessages: boolean;\n forkDisabled: boolean;\n onSelectThread: (threadId: string) => void;\n onNewThread: () => void;\n onFork: () => void;\n onNewWindow: () => void;\n onMaximize: () => void;\n onClose: () => void;\n};\n\n/** The chat window's drag-handle header: thread switcher (or title), host\n * extras, tool/runtime preferences, fork, new window, and — off mobile —\n * maximize and close. */\nexport function ChatWindowHeader({\n mobile,\n title,\n threadId,\n maximized,\n threadsSource,\n sessionsApi,\n titleRefresh,\n headerExtras,\n toolPreferences,\n hasMessages,\n forkDisabled,\n onSelectThread,\n onNewThread,\n onFork,\n onNewWindow,\n onMaximize,\n onClose,\n}: ChatWindowHeaderProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5\",\n !mobile && \"chat-drag-handle cursor-move\",\n )}\n >\n {mobile && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n aria-label=\"Back\"\n onClick={onClose}\n >\n <Icon icon={UiArrowLeft} className=\"size-4\" />\n </Button>\n )}\n {threadsSource != null || sessionsApi !== null ? (\n <ThreadPicker\n threadId={threadId}\n onSelect={onSelectThread}\n onNew={onNewThread}\n refreshToken={titleRefresh}\n {...(threadsSource\n ? { source: threadsSource }\n : sessionsApi !== null\n ? { api: sessionsApi }\n : {})}\n />\n ) : (\n <span className=\"px-1 text-sm font-medium\">{title}</span>\n )}\n <div className=\"flex-1\" />\n {headerExtras}\n <ToolPreferences {...toolPreferences} />\n {sessionsApi && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={\n hasMessages\n ? \"Fork conversation into a new window\"\n : \"Send a message before forking this conversation\"\n }\n disabled={forkDisabled}\n onClick={onFork}\n >\n <Icon icon={UiGitBranch} className=\"size-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"New window\"\n onClick={onNewWindow}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n {!mobile && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={maximized ? \"Restore\" : \"Maximize\"}\n onClick={onMaximize}\n >\n <Icon icon={UiFullscreen} className=\"size-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" title=\"Close\" onClick={onClose}>\n <Icon icon={UiClose} className=\"size-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","jsx","Button","Icon","UiArrowLeft","ThreadPicker","ToolPreferences","UiGitBranch","UiAdd","Fragment","UiFullscreen","UiClose"],"mappings":";;;;;;;;;;;;;AAuCO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,CAAC,UAAU;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAA,UACCC,2BAAAA;AAAAA,UAACC,OAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,cAAW;AAAA,YACX,SAAS;AAAA,YAET,UAAAD,2BAAAA,IAACE,WAAA,EAAK,MAAMC,YAAAA,aAAa,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAG/C,iBAAiB,QAAQ,gBAAgB,OACxCH,2BAAAA;AAAAA,UAACI,aAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,YACP,cAAc;AAAA,YACb,GAAI,gBACD,EAAE,QAAQ,cAAA,IACV,gBAAgB,OACd,EAAE,KAAK,gBACP,CAAA;AAAA,UAAC;AAAA,QAAA,IAGTJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,4BAA4B,UAAA,OAAM;AAAA,QAEpDA,2BAAAA,IAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,QACvB;AAAA,QACDA,2BAAAA,IAACK,gBAAAA,iBAAA,EAAiB,GAAG,iBAAiB;AAAA,QACrC,eACCL,2BAAAA;AAAAA,UAACC,OAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OACE,cACI,wCACA;AAAA,YAEN,UAAU;AAAA,YACV,SAAS;AAAA,YAET,UAAAD,2BAAAA,IAACE,WAAA,EAAK,MAAMI,YAAAA,aAAa,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhDN,2BAAAA;AAAAA,UAACC,OAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAAS;AAAA,YAET,UAAAD,2BAAAA,IAACE,WAAA,EAAK,MAAMK,MAAAA,OAAO,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAEvC,CAAC,UACAT,2BAAAA,KAAAU,WAAAA,UAAA,EACE,UAAA;AAAA,UAAAR,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAO,YAAY,YAAY;AAAA,cAC/B,SAAS;AAAA,cAET,UAAAD,2BAAAA,IAACE,WAAA,EAAK,MAAMO,aAAAA,cAAc,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,yCAE9CR,OAAAA,QAAA,EAAO,SAAQ,SAAQ,MAAK,QAAO,OAAM,SAAQ,SAAS,SACzD,yCAACC,WAAA,EAAK,MAAMQ,iBAAS,WAAU,UAAS,EAAA,CAC1C;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
|