@flanksource/clicky-ui 0.3.45 → 0.3.47
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 +22 -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/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/AccessMark.cjs +23 -0
- package/dist/data/AccessMark.cjs.map +1 -0
- package/dist/data/AccessMark.d.ts +11 -0
- package/dist/data/AccessMark.d.ts.map +1 -0
- package/dist/data/AccessMark.js +23 -0
- package/dist/data/AccessMark.js.map +1 -0
- 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/CodeDiff.cjs +116 -23
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts +26 -0
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +116 -23
- package/dist/data/CodeDiff.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/GraphDiagram.cjs +65 -13
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -2
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +66 -14
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramGroups.cjs +100 -0
- package/dist/data/GraphDiagramGroups.cjs.map +1 -0
- package/dist/data/GraphDiagramGroups.d.ts +24 -0
- package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
- package/dist/data/GraphDiagramGroups.js +100 -0
- package/dist/data/GraphDiagramGroups.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +17 -31
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +6 -13
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +17 -31
- package/dist/data/GraphDiagramNodes.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/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/TreeNode.cjs +1 -1
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +1 -1
- package/dist/data/TreeNode.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/call-graph/CallGraph.cjs +50 -31
- package/dist/data/call-graph/CallGraph.cjs.map +1 -1
- package/dist/data/call-graph/CallGraph.d.ts +10 -1
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraph.js +52 -33
- package/dist/data/call-graph/CallGraph.js.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.js +5 -4
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.js +18 -6
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
- package/dist/data/call-graph/call-graph-model.cjs +169 -18
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-model.d.ts +40 -4
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-model.js +170 -19
- package/dist/data/call-graph/call-graph-model.js.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
- package/dist/data/call-graph/index.d.ts +2 -2
- package/dist/data/call-graph/index.d.ts.map +1 -1
- package/dist/data/call-graph/types.cjs.map +1 -1
- package/dist/data/call-graph/types.d.ts +7 -2
- package/dist/data/call-graph/types.d.ts.map +1 -1
- package/dist/data/call-graph/types.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/data-access.cjs +8 -0
- package/dist/data/data-access.cjs.map +1 -0
- package/dist/data/data-access.d.ts +5 -0
- package/dist/data/data-access.d.ts.map +1 -0
- package/dist/data/data-access.js +8 -0
- package/dist/data/data-access.js.map +1 -0
- 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/git/GitChangeList.cjs +6 -2
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -1
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +6 -2
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +47 -16
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +34 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +47 -16
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs +5 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +19 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js +5 -0
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-group-window.cjs +60 -0
- package/dist/data/graph-group-window.cjs.map +1 -0
- package/dist/data/graph-group-window.d.ts +33 -0
- package/dist/data/graph-group-window.d.ts.map +1 -0
- package/dist/data/graph-group-window.js +60 -0
- package/dist/data/graph-group-window.js.map +1 -0
- 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 +74 -42
- 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 +76 -44
- 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 +52 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +3 -2
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +52 -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 +27 -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 +28 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +11 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +18 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +11 -0
- package/dist/data/test-runner/adapter.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 +5 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +143 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +30 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +143 -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/use-group-windows.cjs +50 -0
- package/dist/data/use-group-windows.cjs.map +1 -0
- package/dist/data/use-group-windows.d.ts +27 -0
- package/dist/data/use-group-windows.d.ts.map +1 -0
- package/dist/data/use-group-windows.js +50 -0
- package/dist/data/use-group-windows.js.map +1 -0
- package/dist/data/verification/adapterViews.cjs +16 -41
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +16 -41
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +115 -3
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +115 -3
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- 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 +54 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +58 -7
- package/dist/data.js.map +1 -1
- package/dist/hooks/event-hub.cjs +229 -0
- package/dist/hooks/event-hub.cjs.map +1 -0
- package/dist/hooks/event-hub.d.ts +26 -0
- package/dist/hooks/event-hub.d.ts.map +1 -0
- package/dist/hooks/event-hub.js +229 -0
- package/dist/hooks/event-hub.js.map +1 -0
- package/dist/hooks.cjs +2 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +2 -0
- package/dist/hooks.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 +56 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +60 -7
- 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/overlay/modalStack.cjs +13 -6
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +13 -6
- package/dist/overlay/modalStack.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/OperationScheduleDialog.cjs +63 -10
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +63 -10
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +12 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +12 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -0
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -0
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +7 -1
- package/dist/rpc/operation-schedule-types.d.ts.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
|
@@ -0,0 +1,95 @@
|
|
|
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 CHAT_WINDOW_MOBILE_QUERY = "(max-width: 767px)";
|
|
6
|
+
const MAXIMIZE_CSS = `
|
|
7
|
+
.chat-maximized .react-draggable {
|
|
8
|
+
transform: none !important;
|
|
9
|
+
width: auto !important;
|
|
10
|
+
height: auto !important;
|
|
11
|
+
inset: 0 !important;
|
|
12
|
+
position: absolute !important;
|
|
13
|
+
}`;
|
|
14
|
+
function ChatWindowSheet({
|
|
15
|
+
layerStyle,
|
|
16
|
+
hidden,
|
|
17
|
+
children
|
|
18
|
+
}) {
|
|
19
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { hidden, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
"data-testid": "chat-window-sheet",
|
|
23
|
+
className: utils.cn(
|
|
24
|
+
"fixed inset-x-0 top-0 flex h-dvh flex-col overflow-hidden bg-background",
|
|
25
|
+
"pt-[env(safe-area-inset-top)]",
|
|
26
|
+
"pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]"
|
|
27
|
+
),
|
|
28
|
+
style: layerStyle,
|
|
29
|
+
children
|
|
30
|
+
}
|
|
31
|
+
) });
|
|
32
|
+
}
|
|
33
|
+
function ChatWindowFloating({
|
|
34
|
+
panel,
|
|
35
|
+
layerStyle,
|
|
36
|
+
Rnd,
|
|
37
|
+
onDragStart,
|
|
38
|
+
onGeometryChange,
|
|
39
|
+
children
|
|
40
|
+
}) {
|
|
41
|
+
const outerClass = utils.cn(
|
|
42
|
+
"fixed pointer-events-none",
|
|
43
|
+
panel.maximized ? "inset-4 chat-maximized" : "inset-0"
|
|
44
|
+
);
|
|
45
|
+
if (!Rnd) {
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: outerClass, style: layerStyle, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: "pointer-events-auto h-full",
|
|
50
|
+
style: panel.maximized ? { position: "relative", width: "100%", height: "100%" } : {
|
|
51
|
+
position: "absolute",
|
|
52
|
+
left: panel.x,
|
|
53
|
+
top: panel.y,
|
|
54
|
+
width: panel.width,
|
|
55
|
+
height: panel.height
|
|
56
|
+
},
|
|
57
|
+
children
|
|
58
|
+
}
|
|
59
|
+
) });
|
|
60
|
+
}
|
|
61
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: outerClass, style: layerStyle, children: [
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: MAXIMIZE_CSS }),
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
64
|
+
Rnd,
|
|
65
|
+
{
|
|
66
|
+
default: {
|
|
67
|
+
x: panel.x,
|
|
68
|
+
y: panel.y,
|
|
69
|
+
width: panel.width,
|
|
70
|
+
height: panel.height
|
|
71
|
+
},
|
|
72
|
+
style: { pointerEvents: "auto" },
|
|
73
|
+
minWidth: Math.min(360, Math.max(1, window.innerWidth - 32)),
|
|
74
|
+
minHeight: Math.min(400, Math.max(1, window.innerHeight - 32)),
|
|
75
|
+
bounds: "parent",
|
|
76
|
+
dragHandleClassName: "chat-drag-handle",
|
|
77
|
+
disableDragging: panel.maximized,
|
|
78
|
+
enableResizing: !panel.maximized,
|
|
79
|
+
onDragStart,
|
|
80
|
+
onDragStop: (_e, d) => onGeometryChange({ x: d.x, y: d.y }),
|
|
81
|
+
onResizeStop: (_e, _dir, ref, _delta, pos) => onGeometryChange({
|
|
82
|
+
width: ref.offsetWidth,
|
|
83
|
+
height: ref.offsetHeight,
|
|
84
|
+
x: pos.x,
|
|
85
|
+
y: pos.y
|
|
86
|
+
}),
|
|
87
|
+
children
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] });
|
|
91
|
+
}
|
|
92
|
+
exports.CHAT_WINDOW_MOBILE_QUERY = CHAT_WINDOW_MOBILE_QUERY;
|
|
93
|
+
exports.ChatWindowFloating = ChatWindowFloating;
|
|
94
|
+
exports.ChatWindowSheet = ChatWindowSheet;
|
|
95
|
+
//# sourceMappingURL=ChatWindow.placement.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.placement.cjs","sources":["../../../src/data/ai/ChatWindow.placement.tsx"],"sourcesContent":["import type { ComponentType, CSSProperties, ReactNode } from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport type { ChatWindowState } from \"./chat-window-context\";\n\n/** The small-screen query the chat window switches to a full-screen sheet at.\n * Matches AppShell's md breakpoint (its mobile drawer is md:hidden); export so hosts can align\n * their own chrome (e.g. hide a bottom bar) with it. */\nexport const CHAT_WINDOW_MOBILE_QUERY = \"(max-width: 767px)\";\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/** The window on a phone: fixed to the dynamic viewport (`h-dvh`, so a URL-bar\n * or on-screen-keyboard resize never pushes the prompt off-screen), clipped so\n * the document cannot scroll, padded by the top and side safe areas (the\n * prompt bar pads its own bottom), never draggable or resizable. `hidden`\n * keeps a non-front window mounted (its stream and draft survive) without\n * painting it. */\nexport function ChatWindowSheet({\n layerStyle,\n hidden,\n children,\n}: {\n /** Stacking style of the window layer, built by the host (ChatWindow). */\n layerStyle: CSSProperties;\n hidden: boolean;\n children: ReactNode;\n}) {\n return (\n <div hidden={hidden}>\n <div\n data-testid=\"chat-window-sheet\"\n className={cn(\n \"fixed inset-x-0 top-0 flex h-dvh flex-col overflow-hidden bg-background\",\n \"pt-[env(safe-area-inset-top)]\",\n \"pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]\",\n )}\n style={layerStyle}\n >\n {children}\n </div>\n </div>\n );\n}\n\n/** The window on a larger screen: a draggable/resizable react-rnd box. Until\n * react-rnd loads (and as a graceful fallback if it never does) the window is\n * statically positioned — still usable, just not draggable. */\nexport function ChatWindowFloating({\n panel,\n layerStyle,\n Rnd,\n onDragStart,\n onGeometryChange,\n children,\n}: {\n panel: ChatWindowState;\n /** Stacking style of the window layer, built by the host (ChatWindow). */\n layerStyle: CSSProperties;\n Rnd: ComponentType<RndProps> | null;\n onDragStart: () => void;\n onGeometryChange: (\n partial: Pick<Partial<ChatWindowState>, \"x\" | \"y\" | \"width\" | \"height\">,\n ) => void;\n children: ReactNode;\n}) {\n const outerClass = cn(\n \"fixed pointer-events-none\",\n panel.maximized ? \"inset-4 chat-maximized\" : \"inset-0\",\n );\n\n if (!Rnd) {\n return (\n <div className={outerClass} style={layerStyle}>\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 {children}\n </div>\n </div>\n );\n }\n\n return (\n <div className={outerClass} style={layerStyle}>\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={onDragStart}\n onDragStop={(_e, d) => onGeometryChange({ x: d.x, y: d.y })}\n onResizeStop={(_e, _dir, ref, _delta, pos) =>\n onGeometryChange({\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n x: pos.x,\n y: pos.y,\n })\n }\n >\n {children}\n </Rnd>\n </div>\n );\n}\n"],"names":["jsx","cn","jsxs"],"mappings":";;;;AAQO,MAAM,2BAA2B;AAExC,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAed,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACEA,2BAAAA,IAAC,SAAI,QACH,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAO;AAAA,MAEN;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAKO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,aAAaA,MAAAA;AAAAA,IACjB;AAAA,IACA,MAAM,YAAY,2BAA2B;AAAA,EAAA;AAG/C,MAAI,CAAC,KAAK;AACR,WACED,2BAAAA,IAAC,OAAA,EAAI,WAAW,YAAY,OAAO,YACjC,UAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OACE,MAAM,YACF,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,WAC/C;AAAA,UACE,UAAU;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,KAAK,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAIrB;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AAEA,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAW,YAAY,OAAO,YACjC,UAAA;AAAA,IAAAF,2BAAAA,IAAC,WAAO,UAAA,aAAA,CAAa;AAAA,IACrBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAEhB,OAAO,EAAE,eAAe,OAAA;AAAA,QACxB,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,CAAC;AAAA,QAC3D,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,cAAc,EAAE,CAAC;AAAA,QAC7D,QAAO;AAAA,QACP,qBAAoB;AAAA,QACpB,iBAAiB,MAAM;AAAA,QACvB,gBAAgB,CAAC,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,IAAI,MAAM,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAA,CAAG;AAAA,QAC1D,cAAc,CAAC,IAAI,MAAM,KAAK,QAAQ,QACpC,iBAAiB;AAAA,UACf,OAAO,IAAI;AAAA,UACX,QAAQ,IAAI;AAAA,UACZ,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,QAAA,CACR;AAAA,QAGF;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ComponentType, CSSProperties, ReactNode } from 'react';
|
|
2
|
+
import { Props as RndProps } from 'react-rnd';
|
|
3
|
+
import { ChatWindowState } from './chat-window-context.js';
|
|
4
|
+
/** The small-screen query the chat window switches to a full-screen sheet at.
|
|
5
|
+
* Matches AppShell's md breakpoint (its mobile drawer is md:hidden); export so hosts can align
|
|
6
|
+
* their own chrome (e.g. hide a bottom bar) with it. */
|
|
7
|
+
export declare const CHAT_WINDOW_MOBILE_QUERY = "(max-width: 767px)";
|
|
8
|
+
/** The window on a phone: fixed to the dynamic viewport (`h-dvh`, so a URL-bar
|
|
9
|
+
* or on-screen-keyboard resize never pushes the prompt off-screen), clipped so
|
|
10
|
+
* the document cannot scroll, padded by the top and side safe areas (the
|
|
11
|
+
* prompt bar pads its own bottom), never draggable or resizable. `hidden`
|
|
12
|
+
* keeps a non-front window mounted (its stream and draft survive) without
|
|
13
|
+
* painting it. */
|
|
14
|
+
export declare function ChatWindowSheet({ layerStyle, hidden, children, }: {
|
|
15
|
+
/** Stacking style of the window layer, built by the host (ChatWindow). */
|
|
16
|
+
layerStyle: CSSProperties;
|
|
17
|
+
hidden: boolean;
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** The window on a larger screen: a draggable/resizable react-rnd box. Until
|
|
21
|
+
* react-rnd loads (and as a graceful fallback if it never does) the window is
|
|
22
|
+
* statically positioned — still usable, just not draggable. */
|
|
23
|
+
export declare function ChatWindowFloating({ panel, layerStyle, Rnd, onDragStart, onGeometryChange, children, }: {
|
|
24
|
+
panel: ChatWindowState;
|
|
25
|
+
/** Stacking style of the window layer, built by the host (ChatWindow). */
|
|
26
|
+
layerStyle: CSSProperties;
|
|
27
|
+
Rnd: ComponentType<RndProps> | null;
|
|
28
|
+
onDragStart: () => void;
|
|
29
|
+
onGeometryChange: (partial: Pick<Partial<ChatWindowState>, "x" | "y" | "width" | "height">) => void;
|
|
30
|
+
children: ReactNode;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=ChatWindow.placement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.placement.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.placement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;yDAEyD;AACzD,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAW7D;;;;;mBAKmB;AACnB,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,MAAM,EACN,QAAQ,GACT,EAAE;IACD,0EAA0E;IAC1E,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAgBA;AAED;;gEAEgE;AAChE,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,UAAU,EACV,GAAG,EACH,WAAW,EACX,gBAAgB,EAChB,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,eAAe,CAAC;IACvB,0EAA0E;IAC1E,UAAU,EAAE,aAAa,CAAC;IAC1B,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACpC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,EAAE,CAChB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,KACpE,IAAI,CAAC;IACV,QAAQ,EAAE,SAAS,CAAC;CACrB,+BA6DA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
const CHAT_WINDOW_MOBILE_QUERY = "(max-width: 767px)";
|
|
4
|
+
const MAXIMIZE_CSS = `
|
|
5
|
+
.chat-maximized .react-draggable {
|
|
6
|
+
transform: none !important;
|
|
7
|
+
width: auto !important;
|
|
8
|
+
height: auto !important;
|
|
9
|
+
inset: 0 !important;
|
|
10
|
+
position: absolute !important;
|
|
11
|
+
}`;
|
|
12
|
+
function ChatWindowSheet({
|
|
13
|
+
layerStyle,
|
|
14
|
+
hidden,
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsx("div", { hidden, children: /* @__PURE__ */ jsx(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
"data-testid": "chat-window-sheet",
|
|
21
|
+
className: cn(
|
|
22
|
+
"fixed inset-x-0 top-0 flex h-dvh flex-col overflow-hidden bg-background",
|
|
23
|
+
"pt-[env(safe-area-inset-top)]",
|
|
24
|
+
"pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]"
|
|
25
|
+
),
|
|
26
|
+
style: layerStyle,
|
|
27
|
+
children
|
|
28
|
+
}
|
|
29
|
+
) });
|
|
30
|
+
}
|
|
31
|
+
function ChatWindowFloating({
|
|
32
|
+
panel,
|
|
33
|
+
layerStyle,
|
|
34
|
+
Rnd,
|
|
35
|
+
onDragStart,
|
|
36
|
+
onGeometryChange,
|
|
37
|
+
children
|
|
38
|
+
}) {
|
|
39
|
+
const outerClass = cn(
|
|
40
|
+
"fixed pointer-events-none",
|
|
41
|
+
panel.maximized ? "inset-4 chat-maximized" : "inset-0"
|
|
42
|
+
);
|
|
43
|
+
if (!Rnd) {
|
|
44
|
+
return /* @__PURE__ */ jsx("div", { className: outerClass, style: layerStyle, children: /* @__PURE__ */ jsx(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
className: "pointer-events-auto h-full",
|
|
48
|
+
style: panel.maximized ? { position: "relative", width: "100%", height: "100%" } : {
|
|
49
|
+
position: "absolute",
|
|
50
|
+
left: panel.x,
|
|
51
|
+
top: panel.y,
|
|
52
|
+
width: panel.width,
|
|
53
|
+
height: panel.height
|
|
54
|
+
},
|
|
55
|
+
children
|
|
56
|
+
}
|
|
57
|
+
) });
|
|
58
|
+
}
|
|
59
|
+
return /* @__PURE__ */ jsxs("div", { className: outerClass, style: layerStyle, children: [
|
|
60
|
+
/* @__PURE__ */ jsx("style", { children: MAXIMIZE_CSS }),
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
62
|
+
Rnd,
|
|
63
|
+
{
|
|
64
|
+
default: {
|
|
65
|
+
x: panel.x,
|
|
66
|
+
y: panel.y,
|
|
67
|
+
width: panel.width,
|
|
68
|
+
height: panel.height
|
|
69
|
+
},
|
|
70
|
+
style: { pointerEvents: "auto" },
|
|
71
|
+
minWidth: Math.min(360, Math.max(1, window.innerWidth - 32)),
|
|
72
|
+
minHeight: Math.min(400, Math.max(1, window.innerHeight - 32)),
|
|
73
|
+
bounds: "parent",
|
|
74
|
+
dragHandleClassName: "chat-drag-handle",
|
|
75
|
+
disableDragging: panel.maximized,
|
|
76
|
+
enableResizing: !panel.maximized,
|
|
77
|
+
onDragStart,
|
|
78
|
+
onDragStop: (_e, d) => onGeometryChange({ x: d.x, y: d.y }),
|
|
79
|
+
onResizeStop: (_e, _dir, ref, _delta, pos) => onGeometryChange({
|
|
80
|
+
width: ref.offsetWidth,
|
|
81
|
+
height: ref.offsetHeight,
|
|
82
|
+
x: pos.x,
|
|
83
|
+
y: pos.y
|
|
84
|
+
}),
|
|
85
|
+
children
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
CHAT_WINDOW_MOBILE_QUERY,
|
|
92
|
+
ChatWindowFloating,
|
|
93
|
+
ChatWindowSheet
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=ChatWindow.placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.placement.js","sources":["../../../src/data/ai/ChatWindow.placement.tsx"],"sourcesContent":["import type { ComponentType, CSSProperties, ReactNode } from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport type { ChatWindowState } from \"./chat-window-context\";\n\n/** The small-screen query the chat window switches to a full-screen sheet at.\n * Matches AppShell's md breakpoint (its mobile drawer is md:hidden); export so hosts can align\n * their own chrome (e.g. hide a bottom bar) with it. */\nexport const CHAT_WINDOW_MOBILE_QUERY = \"(max-width: 767px)\";\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/** The window on a phone: fixed to the dynamic viewport (`h-dvh`, so a URL-bar\n * or on-screen-keyboard resize never pushes the prompt off-screen), clipped so\n * the document cannot scroll, padded by the top and side safe areas (the\n * prompt bar pads its own bottom), never draggable or resizable. `hidden`\n * keeps a non-front window mounted (its stream and draft survive) without\n * painting it. */\nexport function ChatWindowSheet({\n layerStyle,\n hidden,\n children,\n}: {\n /** Stacking style of the window layer, built by the host (ChatWindow). */\n layerStyle: CSSProperties;\n hidden: boolean;\n children: ReactNode;\n}) {\n return (\n <div hidden={hidden}>\n <div\n data-testid=\"chat-window-sheet\"\n className={cn(\n \"fixed inset-x-0 top-0 flex h-dvh flex-col overflow-hidden bg-background\",\n \"pt-[env(safe-area-inset-top)]\",\n \"pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]\",\n )}\n style={layerStyle}\n >\n {children}\n </div>\n </div>\n );\n}\n\n/** The window on a larger screen: a draggable/resizable react-rnd box. Until\n * react-rnd loads (and as a graceful fallback if it never does) the window is\n * statically positioned — still usable, just not draggable. */\nexport function ChatWindowFloating({\n panel,\n layerStyle,\n Rnd,\n onDragStart,\n onGeometryChange,\n children,\n}: {\n panel: ChatWindowState;\n /** Stacking style of the window layer, built by the host (ChatWindow). */\n layerStyle: CSSProperties;\n Rnd: ComponentType<RndProps> | null;\n onDragStart: () => void;\n onGeometryChange: (\n partial: Pick<Partial<ChatWindowState>, \"x\" | \"y\" | \"width\" | \"height\">,\n ) => void;\n children: ReactNode;\n}) {\n const outerClass = cn(\n \"fixed pointer-events-none\",\n panel.maximized ? \"inset-4 chat-maximized\" : \"inset-0\",\n );\n\n if (!Rnd) {\n return (\n <div className={outerClass} style={layerStyle}>\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 {children}\n </div>\n </div>\n );\n }\n\n return (\n <div className={outerClass} style={layerStyle}>\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={onDragStart}\n onDragStop={(_e, d) => onGeometryChange({ x: d.x, y: d.y })}\n onResizeStop={(_e, _dir, ref, _delta, pos) =>\n onGeometryChange({\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n x: pos.x,\n y: pos.y,\n })\n }\n >\n {children}\n </Rnd>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAQO,MAAM,2BAA2B;AAExC,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAed,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,oBAAC,SAAI,QACH,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAO;AAAA,MAEN;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAKO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,MAAM,YAAY,2BAA2B;AAAA,EAAA;AAG/C,MAAI,CAAC,KAAK;AACR,WACE,oBAAC,OAAA,EAAI,WAAW,YAAY,OAAO,YACjC,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OACE,MAAM,YACF,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,WAC/C;AAAA,UACE,UAAU;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,KAAK,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAIrB;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,YAAY,OAAO,YACjC,UAAA;AAAA,IAAA,oBAAC,WAAO,UAAA,aAAA,CAAa;AAAA,IACrB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAEhB,OAAO,EAAE,eAAe,OAAA;AAAA,QACxB,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,CAAC;AAAA,QAC3D,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,cAAc,EAAE,CAAC;AAAA,QAC7D,QAAO;AAAA,QACP,qBAAoB;AAAA,QACpB,iBAAiB,MAAM;AAAA,QACvB,gBAAgB,CAAC,MAAM;AAAA,QACvB;AAAA,QACA,YAAY,CAAC,IAAI,MAAM,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAA,CAAG;AAAA,QAC1D,cAAc,CAAC,IAAI,MAAM,KAAK,QAAQ,QACpC,iBAAiB;AAAA,UACf,OAAO,IAAI;AAAA,UACX,QAAQ,IAAI;AAAA,UACZ,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,QAAA,CACR;AAAA,QAGF;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;"}
|
|
@@ -12,6 +12,7 @@ function SessionChatComposer({
|
|
|
12
12
|
capabilities,
|
|
13
13
|
queued = [],
|
|
14
14
|
error,
|
|
15
|
+
disabledReason,
|
|
15
16
|
onSubmit,
|
|
16
17
|
onInterrupt,
|
|
17
18
|
toolbar,
|
|
@@ -24,7 +25,7 @@ function SessionChatComposer({
|
|
|
24
25
|
}) {
|
|
25
26
|
const active = status === "running" || status === "interrupting";
|
|
26
27
|
const canSubmitWhileActive = capabilities.steer || capabilities.followUp;
|
|
27
|
-
const disabled = status === "starting" || status === "interrupting" || status === "stopping" || status === "running" && !canSubmitWhileActive;
|
|
28
|
+
const disabled = disabledReason !== void 0 || status === "starting" || status === "interrupting" || status === "stopping" || status === "running" && !canSubmitWhileActive;
|
|
28
29
|
const pickerReadOnly = !onPermissionModeChange || status === "starting" || status === "interrupting" || status === "stopping";
|
|
29
30
|
const picker = permissionMode && permissionModes && permissionModes.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
30
31
|
PermissionModePicker,
|
|
@@ -65,6 +66,7 @@ function SessionChatComposer({
|
|
|
65
66
|
{
|
|
66
67
|
status: active ? "streaming" : "ready",
|
|
67
68
|
disabled,
|
|
69
|
+
...disabledReason !== void 0 ? { disabledReason } : {},
|
|
68
70
|
allowSubmitWhileStreaming: canSubmitWhileActive,
|
|
69
71
|
stopLabel: "Interrupt",
|
|
70
72
|
placeholder: status === "idle" ? "Continue this session…" : "Add a follow-up…",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionChatComposer.cjs","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Select } from \"../../components\";\nimport { PromptInput } from \"../chat/PromptInput\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\nimport { Icon } from \"../Icon\";\nimport { sessionTone } from \"./session-tones\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\nimport type { SpecPermissionMode } from \"./SpecRuntimeEditor.model\";\n\nexport type SessionChatCapabilities = {\n interrupt: boolean;\n steer: boolean;\n followUp: boolean;\n resume: boolean;\n /** True when the live run's runtime can switch permission posture mid-session. */\n setPermissionMode?: boolean;\n};\n\nexport type SessionChatQueuedMessage = {\n messageId: string;\n text: string;\n};\n\nexport type SessionChatComposerProps = {\n status: \"starting\" | \"running\" | \"interrupting\" | \"idle\" | \"stopping\";\n capabilities: SessionChatCapabilities;\n queued?: SessionChatQueuedMessage[];\n error?: string;\n onSubmit: (text: string) => void;\n onInterrupt?: () => void;\n toolbar?: ReactNode;\n inputAccessory?: ReactNode;\n className?: string;\n /** Current permission posture, when the host tracks one for this session. */\n permissionMode?: SpecPermissionMode;\n /** Modes the run's runtime honours, canonical order. */\n permissionModes?: SpecPermissionMode[];\n /** Agent family (\"claude\", \"codex\", \"gemini\") whose vocabulary labels the modes. */\n permissionFamily?: string;\n /** Omit to render the picker read-only. */\n onPermissionModeChange?: (mode: SpecPermissionMode) => void;\n};\n\nexport function SessionChatComposer({\n status,\n capabilities,\n queued = [],\n error,\n onSubmit,\n onInterrupt,\n toolbar,\n inputAccessory,\n className,\n permissionMode,\n permissionModes,\n permissionFamily,\n onPermissionModeChange,\n}: SessionChatComposerProps) {\n const active = status === \"running\" || status === \"interrupting\";\n const canSubmitWhileActive = capabilities.steer || capabilities.followUp;\n const disabled =\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\" ||\n (status === \"running\" && !canSubmitWhileActive);\n const pickerReadOnly =\n !onPermissionModeChange ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\";\n const picker =\n permissionMode && permissionModes && permissionModes.length > 0 ? (\n <PermissionModePicker\n mode={permissionMode}\n modes={permissionModes}\n family={permissionFamily}\n readOnly={pickerReadOnly}\n {...(onPermissionModeChange ? { onChange: onPermissionModeChange } : {})}\n />\n ) : null;\n const composedToolbar =\n picker || toolbar ? (\n <>\n {picker}\n {toolbar}\n </>\n ) : undefined;\n\n return (\n <div className={className}>\n {queued.length > 0 && (\n <div\n className=\"mb-density-2 flex flex-wrap gap-density-1\"\n aria-label=\"Queued messages\"\n >\n {queued.map((message) => (\n <span\n key={message.messageId}\n className=\"max-w-full truncate rounded-full border border-border bg-muted px-density-2 py-1 text-xs text-muted-foreground\"\n >\n Queued: {message.text}\n </span>\n ))}\n </div>\n )}\n {error && (\n <div className=\"mb-density-2 text-xs text-destructive\">{error}</div>\n )}\n <PromptInput\n status={active ? \"streaming\" : \"ready\"}\n disabled={disabled}\n allowSubmitWhileStreaming={canSubmitWhileActive}\n stopLabel=\"Interrupt\"\n placeholder={\n status === \"idle\" ? \"Continue this session…\" : \"Add a follow-up…\"\n }\n onSubmit={(text) => onSubmit(text)}\n {...(inputAccessory ? { inputAccessory } : {})}\n {...(composedToolbar ? { toolbar: composedToolbar } : {})}\n {...(capabilities.interrupt && status === \"running\" && onInterrupt\n ? { onStop: onInterrupt }\n : {})}\n />\n </div>\n );\n}\n\nfunction PermissionModePicker({\n mode,\n modes,\n family,\n readOnly,\n onChange,\n}: {\n mode: SpecPermissionMode;\n modes: SpecPermissionMode[];\n family: string | undefined;\n readOnly: boolean;\n onChange?: (mode: SpecPermissionMode) => void;\n}) {\n const visual = permissionModeVisual(family, mode);\n const tone = sessionTone(visual.tone);\n return (\n <div className=\"inline-flex items-center gap-1.5\">\n <Icon\n icon={visual.icon}\n title={visual.label}\n className={`size-3.5 ${tone.text}`}\n />\n <Select\n aria-label=\"Permission mode\"\n value={mode}\n disabled={readOnly}\n onChange={(event) =>\n onChange?.(event.target.value as SpecPermissionMode)\n }\n className=\"h-7 w-auto min-w-24 py-0 text-xs\"\n >\n {modes.map((candidate) => (\n <option\n key={candidate}\n value={candidate}\n title={descriptionFor(family, candidate)}\n >\n {permissionModeVisual(family, candidate).label}\n </option>\n ))}\n </Select>\n </div>\n );\n}\n\n// The option descriptions document Claude's postures, so other families get none.\nfunction descriptionFor(\n family: string | undefined,\n mode: SpecPermissionMode,\n): string | undefined {\n if (family && family !== \"claude\") return undefined;\n return CLAUDE_PERMISSION_MODE_OPTIONS.find(\n (option) => option.value === mode,\n )?.description;\n}\n"],"names":["jsx","jsxs","Fragment","PromptInput","permissionModeVisual","sessionTone","Icon","Select","CLAUDE_PERMISSION_MODE_OPTIONS"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SessionChatComposer.cjs","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Select } from \"../../components\";\nimport { PromptInput } from \"../chat/PromptInput\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\nimport { Icon } from \"../Icon\";\nimport { sessionTone } from \"./session-tones\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\nimport type { SpecPermissionMode } from \"./SpecRuntimeEditor.model\";\n\nexport type SessionChatCapabilities = {\n interrupt: boolean;\n steer: boolean;\n followUp: boolean;\n resume: boolean;\n /** True when the live run's runtime can switch permission posture mid-session. */\n setPermissionMode?: boolean;\n};\n\nexport type SessionChatQueuedMessage = {\n messageId: string;\n text: string;\n};\n\nexport type SessionChatComposerProps = {\n status: \"starting\" | \"running\" | \"interrupting\" | \"idle\" | \"stopping\";\n capabilities: SessionChatCapabilities;\n queued?: SessionChatQueuedMessage[];\n error?: string;\n /** Disables the input and shows this reason in it (e.g. while the session\n * it continues is still loading, or could not be read). */\n disabledReason?: string;\n onSubmit: (text: string) => void;\n onInterrupt?: () => void;\n toolbar?: ReactNode;\n inputAccessory?: ReactNode;\n className?: string;\n /** Current permission posture, when the host tracks one for this session. */\n permissionMode?: SpecPermissionMode;\n /** Modes the run's runtime honours, canonical order. */\n permissionModes?: SpecPermissionMode[];\n /** Agent family (\"claude\", \"codex\", \"gemini\") whose vocabulary labels the modes. */\n permissionFamily?: string;\n /** Omit to render the picker read-only. */\n onPermissionModeChange?: (mode: SpecPermissionMode) => void;\n};\n\nexport function SessionChatComposer({\n status,\n capabilities,\n queued = [],\n error,\n disabledReason,\n onSubmit,\n onInterrupt,\n toolbar,\n inputAccessory,\n className,\n permissionMode,\n permissionModes,\n permissionFamily,\n onPermissionModeChange,\n}: SessionChatComposerProps) {\n const active = status === \"running\" || status === \"interrupting\";\n const canSubmitWhileActive = capabilities.steer || capabilities.followUp;\n const disabled =\n disabledReason !== undefined ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\" ||\n (status === \"running\" && !canSubmitWhileActive);\n const pickerReadOnly =\n !onPermissionModeChange ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\";\n const picker =\n permissionMode && permissionModes && permissionModes.length > 0 ? (\n <PermissionModePicker\n mode={permissionMode}\n modes={permissionModes}\n family={permissionFamily}\n readOnly={pickerReadOnly}\n {...(onPermissionModeChange ? { onChange: onPermissionModeChange } : {})}\n />\n ) : null;\n const composedToolbar =\n picker || toolbar ? (\n <>\n {picker}\n {toolbar}\n </>\n ) : undefined;\n\n return (\n <div className={className}>\n {queued.length > 0 && (\n <div\n className=\"mb-density-2 flex flex-wrap gap-density-1\"\n aria-label=\"Queued messages\"\n >\n {queued.map((message) => (\n <span\n key={message.messageId}\n className=\"max-w-full truncate rounded-full border border-border bg-muted px-density-2 py-1 text-xs text-muted-foreground\"\n >\n Queued: {message.text}\n </span>\n ))}\n </div>\n )}\n {error && (\n <div className=\"mb-density-2 text-xs text-destructive\">{error}</div>\n )}\n <PromptInput\n status={active ? \"streaming\" : \"ready\"}\n disabled={disabled}\n {...(disabledReason !== undefined ? { disabledReason } : {})}\n allowSubmitWhileStreaming={canSubmitWhileActive}\n stopLabel=\"Interrupt\"\n placeholder={\n status === \"idle\" ? \"Continue this session…\" : \"Add a follow-up…\"\n }\n onSubmit={(text) => onSubmit(text)}\n {...(inputAccessory ? { inputAccessory } : {})}\n {...(composedToolbar ? { toolbar: composedToolbar } : {})}\n {...(capabilities.interrupt && status === \"running\" && onInterrupt\n ? { onStop: onInterrupt }\n : {})}\n />\n </div>\n );\n}\n\nfunction PermissionModePicker({\n mode,\n modes,\n family,\n readOnly,\n onChange,\n}: {\n mode: SpecPermissionMode;\n modes: SpecPermissionMode[];\n family: string | undefined;\n readOnly: boolean;\n onChange?: (mode: SpecPermissionMode) => void;\n}) {\n const visual = permissionModeVisual(family, mode);\n const tone = sessionTone(visual.tone);\n return (\n <div className=\"inline-flex items-center gap-1.5\">\n <Icon\n icon={visual.icon}\n title={visual.label}\n className={`size-3.5 ${tone.text}`}\n />\n <Select\n aria-label=\"Permission mode\"\n value={mode}\n disabled={readOnly}\n onChange={(event) =>\n onChange?.(event.target.value as SpecPermissionMode)\n }\n className=\"h-7 w-auto min-w-24 py-0 text-xs\"\n >\n {modes.map((candidate) => (\n <option\n key={candidate}\n value={candidate}\n title={descriptionFor(family, candidate)}\n >\n {permissionModeVisual(family, candidate).label}\n </option>\n ))}\n </Select>\n </div>\n );\n}\n\n// The option descriptions document Claude's postures, so other families get none.\nfunction descriptionFor(\n family: string | undefined,\n mode: SpecPermissionMode,\n): string | undefined {\n if (family && family !== \"claude\") return undefined;\n return CLAUDE_PERMISSION_MODE_OPTIONS.find(\n (option) => option.value === mode,\n )?.description;\n}\n"],"names":["jsx","jsxs","Fragment","PromptInput","permissionModeVisual","sessionTone","Icon","Select","CLAUDE_PERMISSION_MODE_OPTIONS"],"mappings":"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"}
|
|
@@ -17,6 +17,9 @@ export type SessionChatComposerProps = {
|
|
|
17
17
|
capabilities: SessionChatCapabilities;
|
|
18
18
|
queued?: SessionChatQueuedMessage[];
|
|
19
19
|
error?: string;
|
|
20
|
+
/** Disables the input and shows this reason in it (e.g. while the session
|
|
21
|
+
* it continues is still loading, or could not be read). */
|
|
22
|
+
disabledReason?: string;
|
|
20
23
|
onSubmit: (text: string) => void;
|
|
21
24
|
onInterrupt?: () => void;
|
|
22
25
|
toolbar?: ReactNode;
|
|
@@ -31,5 +34,5 @@ export type SessionChatComposerProps = {
|
|
|
31
34
|
/** Omit to render the picker read-only. */
|
|
32
35
|
onPermissionModeChange?: (mode: SpecPermissionMode) => void;
|
|
33
36
|
};
|
|
34
|
-
export declare function SessionChatComposer({ status, capabilities, queued, error, onSubmit, onInterrupt, toolbar, inputAccessory, className, permissionMode, permissionModes, permissionFamily, onPermissionModeChange, }: SessionChatComposerProps): import("react").JSX.Element;
|
|
37
|
+
export declare function SessionChatComposer({ status, capabilities, queued, error, disabledReason, onSubmit, onInterrupt, toolbar, inputAccessory, className, permissionMode, permissionModes, permissionFamily, onPermissionModeChange, }: SessionChatComposerProps): import("react").JSX.Element;
|
|
35
38
|
//# sourceMappingURL=SessionChatComposer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionChatComposer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;IACtE,YAAY,EAAE,uBAAuB,CAAC;IACtC,MAAM,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,wDAAwD;IACxD,eAAe,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACvC,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,YAAY,EACZ,MAAW,EACX,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAO,EACP,cAAc,EACd,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,EAAE,wBAAwB,+
|
|
1
|
+
{"version":3,"file":"SessionChatComposer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;IACtE,YAAY,EAAE,uBAAuB,CAAC;IACtC,MAAM,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;gEAC4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,wDAAwD;IACxD,eAAe,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACvC,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,YAAY,EACZ,MAAW,EACX,KAAK,EACL,cAAc,EACd,QAAQ,EACR,WAAW,EACX,OAAO,EACP,cAAc,EACd,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,EAAE,wBAAwB,+BAsE1B"}
|
|
@@ -10,6 +10,7 @@ function SessionChatComposer({
|
|
|
10
10
|
capabilities,
|
|
11
11
|
queued = [],
|
|
12
12
|
error,
|
|
13
|
+
disabledReason,
|
|
13
14
|
onSubmit,
|
|
14
15
|
onInterrupt,
|
|
15
16
|
toolbar,
|
|
@@ -22,7 +23,7 @@ function SessionChatComposer({
|
|
|
22
23
|
}) {
|
|
23
24
|
const active = status === "running" || status === "interrupting";
|
|
24
25
|
const canSubmitWhileActive = capabilities.steer || capabilities.followUp;
|
|
25
|
-
const disabled = status === "starting" || status === "interrupting" || status === "stopping" || status === "running" && !canSubmitWhileActive;
|
|
26
|
+
const disabled = disabledReason !== void 0 || status === "starting" || status === "interrupting" || status === "stopping" || status === "running" && !canSubmitWhileActive;
|
|
26
27
|
const pickerReadOnly = !onPermissionModeChange || status === "starting" || status === "interrupting" || status === "stopping";
|
|
27
28
|
const picker = permissionMode && permissionModes && permissionModes.length > 0 ? /* @__PURE__ */ jsx(
|
|
28
29
|
PermissionModePicker,
|
|
@@ -63,6 +64,7 @@ function SessionChatComposer({
|
|
|
63
64
|
{
|
|
64
65
|
status: active ? "streaming" : "ready",
|
|
65
66
|
disabled,
|
|
67
|
+
...disabledReason !== void 0 ? { disabledReason } : {},
|
|
66
68
|
allowSubmitWhileStreaming: canSubmitWhileActive,
|
|
67
69
|
stopLabel: "Interrupt",
|
|
68
70
|
placeholder: status === "idle" ? "Continue this session…" : "Add a follow-up…",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionChatComposer.js","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Select } from \"../../components\";\nimport { PromptInput } from \"../chat/PromptInput\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\nimport { Icon } from \"../Icon\";\nimport { sessionTone } from \"./session-tones\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\nimport type { SpecPermissionMode } from \"./SpecRuntimeEditor.model\";\n\nexport type SessionChatCapabilities = {\n interrupt: boolean;\n steer: boolean;\n followUp: boolean;\n resume: boolean;\n /** True when the live run's runtime can switch permission posture mid-session. */\n setPermissionMode?: boolean;\n};\n\nexport type SessionChatQueuedMessage = {\n messageId: string;\n text: string;\n};\n\nexport type SessionChatComposerProps = {\n status: \"starting\" | \"running\" | \"interrupting\" | \"idle\" | \"stopping\";\n capabilities: SessionChatCapabilities;\n queued?: SessionChatQueuedMessage[];\n error?: string;\n onSubmit: (text: string) => void;\n onInterrupt?: () => void;\n toolbar?: ReactNode;\n inputAccessory?: ReactNode;\n className?: string;\n /** Current permission posture, when the host tracks one for this session. */\n permissionMode?: SpecPermissionMode;\n /** Modes the run's runtime honours, canonical order. */\n permissionModes?: SpecPermissionMode[];\n /** Agent family (\"claude\", \"codex\", \"gemini\") whose vocabulary labels the modes. */\n permissionFamily?: string;\n /** Omit to render the picker read-only. */\n onPermissionModeChange?: (mode: SpecPermissionMode) => void;\n};\n\nexport function SessionChatComposer({\n status,\n capabilities,\n queued = [],\n error,\n onSubmit,\n onInterrupt,\n toolbar,\n inputAccessory,\n className,\n permissionMode,\n permissionModes,\n permissionFamily,\n onPermissionModeChange,\n}: SessionChatComposerProps) {\n const active = status === \"running\" || status === \"interrupting\";\n const canSubmitWhileActive = capabilities.steer || capabilities.followUp;\n const disabled =\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\" ||\n (status === \"running\" && !canSubmitWhileActive);\n const pickerReadOnly =\n !onPermissionModeChange ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\";\n const picker =\n permissionMode && permissionModes && permissionModes.length > 0 ? (\n <PermissionModePicker\n mode={permissionMode}\n modes={permissionModes}\n family={permissionFamily}\n readOnly={pickerReadOnly}\n {...(onPermissionModeChange ? { onChange: onPermissionModeChange } : {})}\n />\n ) : null;\n const composedToolbar =\n picker || toolbar ? (\n <>\n {picker}\n {toolbar}\n </>\n ) : undefined;\n\n return (\n <div className={className}>\n {queued.length > 0 && (\n <div\n className=\"mb-density-2 flex flex-wrap gap-density-1\"\n aria-label=\"Queued messages\"\n >\n {queued.map((message) => (\n <span\n key={message.messageId}\n className=\"max-w-full truncate rounded-full border border-border bg-muted px-density-2 py-1 text-xs text-muted-foreground\"\n >\n Queued: {message.text}\n </span>\n ))}\n </div>\n )}\n {error && (\n <div className=\"mb-density-2 text-xs text-destructive\">{error}</div>\n )}\n <PromptInput\n status={active ? \"streaming\" : \"ready\"}\n disabled={disabled}\n allowSubmitWhileStreaming={canSubmitWhileActive}\n stopLabel=\"Interrupt\"\n placeholder={\n status === \"idle\" ? \"Continue this session…\" : \"Add a follow-up…\"\n }\n onSubmit={(text) => onSubmit(text)}\n {...(inputAccessory ? { inputAccessory } : {})}\n {...(composedToolbar ? { toolbar: composedToolbar } : {})}\n {...(capabilities.interrupt && status === \"running\" && onInterrupt\n ? { onStop: onInterrupt }\n : {})}\n />\n </div>\n );\n}\n\nfunction PermissionModePicker({\n mode,\n modes,\n family,\n readOnly,\n onChange,\n}: {\n mode: SpecPermissionMode;\n modes: SpecPermissionMode[];\n family: string | undefined;\n readOnly: boolean;\n onChange?: (mode: SpecPermissionMode) => void;\n}) {\n const visual = permissionModeVisual(family, mode);\n const tone = sessionTone(visual.tone);\n return (\n <div className=\"inline-flex items-center gap-1.5\">\n <Icon\n icon={visual.icon}\n title={visual.label}\n className={`size-3.5 ${tone.text}`}\n />\n <Select\n aria-label=\"Permission mode\"\n value={mode}\n disabled={readOnly}\n onChange={(event) =>\n onChange?.(event.target.value as SpecPermissionMode)\n }\n className=\"h-7 w-auto min-w-24 py-0 text-xs\"\n >\n {modes.map((candidate) => (\n <option\n key={candidate}\n value={candidate}\n title={descriptionFor(family, candidate)}\n >\n {permissionModeVisual(family, candidate).label}\n </option>\n ))}\n </Select>\n </div>\n );\n}\n\n// The option descriptions document Claude's postures, so other families get none.\nfunction descriptionFor(\n family: string | undefined,\n mode: SpecPermissionMode,\n): string | undefined {\n if (family && family !== \"claude\") return undefined;\n return CLAUDE_PERMISSION_MODE_OPTIONS.find(\n (option) => option.value === mode,\n )?.description;\n}\n"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"SessionChatComposer.js","sources":["../../../src/data/ai/SessionChatComposer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Select } from \"../../components\";\nimport { PromptInput } from \"../chat/PromptInput\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\nimport { Icon } from \"../Icon\";\nimport { sessionTone } from \"./session-tones\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\nimport type { SpecPermissionMode } from \"./SpecRuntimeEditor.model\";\n\nexport type SessionChatCapabilities = {\n interrupt: boolean;\n steer: boolean;\n followUp: boolean;\n resume: boolean;\n /** True when the live run's runtime can switch permission posture mid-session. */\n setPermissionMode?: boolean;\n};\n\nexport type SessionChatQueuedMessage = {\n messageId: string;\n text: string;\n};\n\nexport type SessionChatComposerProps = {\n status: \"starting\" | \"running\" | \"interrupting\" | \"idle\" | \"stopping\";\n capabilities: SessionChatCapabilities;\n queued?: SessionChatQueuedMessage[];\n error?: string;\n /** Disables the input and shows this reason in it (e.g. while the session\n * it continues is still loading, or could not be read). */\n disabledReason?: string;\n onSubmit: (text: string) => void;\n onInterrupt?: () => void;\n toolbar?: ReactNode;\n inputAccessory?: ReactNode;\n className?: string;\n /** Current permission posture, when the host tracks one for this session. */\n permissionMode?: SpecPermissionMode;\n /** Modes the run's runtime honours, canonical order. */\n permissionModes?: SpecPermissionMode[];\n /** Agent family (\"claude\", \"codex\", \"gemini\") whose vocabulary labels the modes. */\n permissionFamily?: string;\n /** Omit to render the picker read-only. */\n onPermissionModeChange?: (mode: SpecPermissionMode) => void;\n};\n\nexport function SessionChatComposer({\n status,\n capabilities,\n queued = [],\n error,\n disabledReason,\n onSubmit,\n onInterrupt,\n toolbar,\n inputAccessory,\n className,\n permissionMode,\n permissionModes,\n permissionFamily,\n onPermissionModeChange,\n}: SessionChatComposerProps) {\n const active = status === \"running\" || status === \"interrupting\";\n const canSubmitWhileActive = capabilities.steer || capabilities.followUp;\n const disabled =\n disabledReason !== undefined ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\" ||\n (status === \"running\" && !canSubmitWhileActive);\n const pickerReadOnly =\n !onPermissionModeChange ||\n status === \"starting\" ||\n status === \"interrupting\" ||\n status === \"stopping\";\n const picker =\n permissionMode && permissionModes && permissionModes.length > 0 ? (\n <PermissionModePicker\n mode={permissionMode}\n modes={permissionModes}\n family={permissionFamily}\n readOnly={pickerReadOnly}\n {...(onPermissionModeChange ? { onChange: onPermissionModeChange } : {})}\n />\n ) : null;\n const composedToolbar =\n picker || toolbar ? (\n <>\n {picker}\n {toolbar}\n </>\n ) : undefined;\n\n return (\n <div className={className}>\n {queued.length > 0 && (\n <div\n className=\"mb-density-2 flex flex-wrap gap-density-1\"\n aria-label=\"Queued messages\"\n >\n {queued.map((message) => (\n <span\n key={message.messageId}\n className=\"max-w-full truncate rounded-full border border-border bg-muted px-density-2 py-1 text-xs text-muted-foreground\"\n >\n Queued: {message.text}\n </span>\n ))}\n </div>\n )}\n {error && (\n <div className=\"mb-density-2 text-xs text-destructive\">{error}</div>\n )}\n <PromptInput\n status={active ? \"streaming\" : \"ready\"}\n disabled={disabled}\n {...(disabledReason !== undefined ? { disabledReason } : {})}\n allowSubmitWhileStreaming={canSubmitWhileActive}\n stopLabel=\"Interrupt\"\n placeholder={\n status === \"idle\" ? \"Continue this session…\" : \"Add a follow-up…\"\n }\n onSubmit={(text) => onSubmit(text)}\n {...(inputAccessory ? { inputAccessory } : {})}\n {...(composedToolbar ? { toolbar: composedToolbar } : {})}\n {...(capabilities.interrupt && status === \"running\" && onInterrupt\n ? { onStop: onInterrupt }\n : {})}\n />\n </div>\n );\n}\n\nfunction PermissionModePicker({\n mode,\n modes,\n family,\n readOnly,\n onChange,\n}: {\n mode: SpecPermissionMode;\n modes: SpecPermissionMode[];\n family: string | undefined;\n readOnly: boolean;\n onChange?: (mode: SpecPermissionMode) => void;\n}) {\n const visual = permissionModeVisual(family, mode);\n const tone = sessionTone(visual.tone);\n return (\n <div className=\"inline-flex items-center gap-1.5\">\n <Icon\n icon={visual.icon}\n title={visual.label}\n className={`size-3.5 ${tone.text}`}\n />\n <Select\n aria-label=\"Permission mode\"\n value={mode}\n disabled={readOnly}\n onChange={(event) =>\n onChange?.(event.target.value as SpecPermissionMode)\n }\n className=\"h-7 w-auto min-w-24 py-0 text-xs\"\n >\n {modes.map((candidate) => (\n <option\n key={candidate}\n value={candidate}\n title={descriptionFor(family, candidate)}\n >\n {permissionModeVisual(family, candidate).label}\n </option>\n ))}\n </Select>\n </div>\n );\n}\n\n// The option descriptions document Claude's postures, so other families get none.\nfunction descriptionFor(\n family: string | undefined,\n mode: SpecPermissionMode,\n): string | undefined {\n if (family && family !== \"claude\") return undefined;\n return CLAUDE_PERMISSION_MODE_OPTIONS.find(\n (option) => option.value === mode,\n )?.description;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const utils = require("../../lib/utils.cjs");
|
|
6
6
|
const SessionInspector_panels = require("./SessionInspector.panels.cjs");
|
|
7
|
+
const SessionInspector_composerSlot = require("./SessionInspector.composer-slot.cjs");
|
|
7
8
|
const SessionInspector_summary = require("./SessionInspector.summary.cjs");
|
|
8
9
|
const SessionInspector_compact = require("./SessionInspector.compact.cjs");
|
|
9
10
|
const SessionInspector_tabs = require("./SessionInspector.tabs.cjs");
|
|
@@ -22,6 +23,7 @@ function SessionInspector({
|
|
|
22
23
|
src,
|
|
23
24
|
follow,
|
|
24
25
|
className,
|
|
26
|
+
onLoadStateChange,
|
|
25
27
|
...options
|
|
26
28
|
}) {
|
|
27
29
|
if (session !== void 0 && src !== void 0) {
|
|
@@ -34,10 +36,23 @@ function SessionInspector({
|
|
|
34
36
|
}
|
|
35
37
|
const followOptions = follow === void 0 ? {} : { follow };
|
|
36
38
|
const remote = SessionInspector_remote.useRemoteSession(src, followOptions);
|
|
39
|
+
SessionInspector_remote.useReportLoadState({
|
|
40
|
+
state: remote,
|
|
41
|
+
enabled: src !== void 0,
|
|
42
|
+
onChange: onLoadStateChange
|
|
43
|
+
});
|
|
37
44
|
const collection = session !== void 0 && SessionInspector_collection.isSessionCollectionInput(session) ? session : void 0;
|
|
38
45
|
const remoteCollection = SessionInspector_remote.useRemoteCollection(collection, followOptions);
|
|
39
46
|
const status = src !== void 0 ? remote : remoteCollection;
|
|
40
47
|
const resolved = src !== void 0 ? remote.session : collection ? remoteCollection.collection : session;
|
|
48
|
+
const viewOptions = src !== void 0 && (remote.hasOlder || remote.loadingOlder) ? {
|
|
49
|
+
...options,
|
|
50
|
+
transcriptProps: {
|
|
51
|
+
...options.transcriptProps,
|
|
52
|
+
onReachStart: () => void remote.loadOlder(),
|
|
53
|
+
loadingOlder: remote.loadingOlder === true
|
|
54
|
+
}
|
|
55
|
+
} : options;
|
|
41
56
|
const remoteBacked = src !== void 0 || collection !== void 0 && remoteCollection.collection !== collection;
|
|
42
57
|
if (resolved && !remoteBacked) {
|
|
43
58
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -56,12 +71,13 @@ function SessionInspector({
|
|
|
56
71
|
loading: status.loading,
|
|
57
72
|
...status.error ? { error: status.error } : {},
|
|
58
73
|
...className ? { className } : {},
|
|
74
|
+
...options.composer ? { composer: options.composer } : {},
|
|
59
75
|
children: resolved ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
60
76
|
SessionInspectorView,
|
|
61
77
|
{
|
|
62
78
|
session: resolved,
|
|
63
79
|
...followOptions,
|
|
64
|
-
...
|
|
80
|
+
...viewOptions
|
|
65
81
|
}
|
|
66
82
|
) : null
|
|
67
83
|
}
|
|
@@ -235,85 +251,65 @@ function CollectionSessionInspector({
|
|
|
235
251
|
),
|
|
236
252
|
/* @__PURE__ */ jsxRuntime.jsx(SessionInspector_tabs.InspectorTabs, { tab, tabs: compactTabs, onSelect: setTab })
|
|
237
253
|
] }),
|
|
238
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
254
|
+
/* @__PURE__ */ jsxRuntime.jsx("main", { className: "flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: compact ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
255
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
256
|
+
"div",
|
|
257
|
+
{
|
|
258
|
+
className: utils.cn(
|
|
259
|
+
"min-h-0 flex-1 overflow-hidden",
|
|
260
|
+
tab !== "transcript" && "hidden"
|
|
261
|
+
),
|
|
262
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
SessionInspector_transcript.SessionTranscript,
|
|
264
|
+
{
|
|
265
|
+
session: hierarchy.filtered,
|
|
266
|
+
viewerProps: {
|
|
267
|
+
...compactTranscriptProps,
|
|
268
|
+
className: transcriptClassName
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
}
|
|
273
|
+
),
|
|
274
|
+
tab !== "transcript" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto p-density-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
275
|
+
SessionInspector_panels.SessionInspectorPanel,
|
|
276
|
+
{
|
|
277
|
+
tab,
|
|
278
|
+
detail: panelDetail,
|
|
279
|
+
session: hierarchy.current,
|
|
280
|
+
...onPlanChange ? { onPlanChange } : {},
|
|
281
|
+
...onResolveApproval ? { onResolveApproval } : {}
|
|
282
|
+
}
|
|
283
|
+
) }) : null
|
|
284
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
239
285
|
"div",
|
|
240
286
|
{
|
|
241
287
|
className: utils.cn(
|
|
242
|
-
"min-h-0 flex-1
|
|
243
|
-
|
|
288
|
+
"min-h-0 flex-1",
|
|
289
|
+
tab === "transcript" ? "overflow-hidden" : "overflow-auto p-density-4"
|
|
244
290
|
),
|
|
245
|
-
children: /* @__PURE__ */ jsxRuntime.
|
|
246
|
-
|
|
291
|
+
children: tab === "transcript" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
292
|
+
SessionInspector_transcript.SessionTranscript,
|
|
293
|
+
{
|
|
294
|
+
session: hierarchy.filtered,
|
|
295
|
+
viewerProps: {
|
|
296
|
+
...transcriptProps,
|
|
297
|
+
className: transcriptClassName
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
301
|
+
SessionInspector_panels.SessionInspectorPanel,
|
|
247
302
|
{
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
compact ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
254
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
255
|
-
"div",
|
|
256
|
-
{
|
|
257
|
-
className: utils.cn(
|
|
258
|
-
"min-h-0 flex-1 overflow-hidden",
|
|
259
|
-
tab !== "transcript" && "hidden"
|
|
260
|
-
),
|
|
261
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
262
|
-
SessionInspector_transcript.SessionTranscript,
|
|
263
|
-
{
|
|
264
|
-
session: hierarchy.filtered,
|
|
265
|
-
viewerProps: {
|
|
266
|
-
...compactTranscriptProps,
|
|
267
|
-
className: transcriptClassName
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
)
|
|
271
|
-
}
|
|
272
|
-
),
|
|
273
|
-
tab !== "transcript" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-auto p-density-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
274
|
-
SessionInspector_panels.SessionInspectorPanel,
|
|
275
|
-
{
|
|
276
|
-
tab,
|
|
277
|
-
detail: panelDetail,
|
|
278
|
-
session: hierarchy.current,
|
|
279
|
-
...onPlanChange ? { onPlanChange } : {},
|
|
280
|
-
...onResolveApproval ? { onResolveApproval } : {}
|
|
281
|
-
}
|
|
282
|
-
) }) : null
|
|
283
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
284
|
-
"div",
|
|
285
|
-
{
|
|
286
|
-
className: utils.cn(
|
|
287
|
-
"min-h-0 flex-1",
|
|
288
|
-
tab === "transcript" ? "overflow-hidden" : "overflow-auto p-density-4"
|
|
289
|
-
),
|
|
290
|
-
children: tab === "transcript" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
291
|
-
SessionInspector_transcript.SessionTranscript,
|
|
292
|
-
{
|
|
293
|
-
session: hierarchy.filtered,
|
|
294
|
-
viewerProps: {
|
|
295
|
-
...transcriptProps,
|
|
296
|
-
className: transcriptClassName
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
300
|
-
SessionInspector_panels.SessionInspectorPanel,
|
|
301
|
-
{
|
|
302
|
-
tab,
|
|
303
|
-
detail: panelDetail,
|
|
304
|
-
session: hierarchy.current,
|
|
305
|
-
...onPlanChange ? { onPlanChange } : {},
|
|
306
|
-
...onResolveApproval ? { onResolveApproval } : {}
|
|
307
|
-
}
|
|
308
|
-
)
|
|
309
|
-
}
|
|
310
|
-
),
|
|
311
|
-
composer ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 border-t border-border p-density-3", children: composer }) : null
|
|
312
|
-
]
|
|
303
|
+
tab,
|
|
304
|
+
detail: panelDetail,
|
|
305
|
+
session: hierarchy.current,
|
|
306
|
+
...onPlanChange ? { onPlanChange } : {},
|
|
307
|
+
...onResolveApproval ? { onResolveApproval } : {}
|
|
313
308
|
}
|
|
314
309
|
)
|
|
315
310
|
}
|
|
316
|
-
)
|
|
311
|
+
) }),
|
|
312
|
+
composer ? /* @__PURE__ */ jsxRuntime.jsx(SessionInspector_composerSlot.PinnedComposer, { children: composer }) : null
|
|
317
313
|
]
|
|
318
314
|
}
|
|
319
315
|
);
|