@flanksource/clicky-ui 0.3.55 → 0.3.57
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 +6 -0
- package/dist/ai.cjs +6 -0
- package/dist/ai.js +3 -1
- package/dist/chat.cjs +2 -0
- package/dist/chat.d.ts +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -1
- package/dist/comments/CommentCard.cjs +37 -7
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts +11 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +37 -7
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +9 -4
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +9 -4
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +8 -8
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +8 -8
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +5 -1
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +5 -1
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +17 -11
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +6 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +17 -11
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +4 -1
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +4 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +4 -1
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +6 -3
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +7 -2
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +6 -3
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/comments/MentionTextarea.cjs +1 -1
- package/dist/comments/MentionTextarea.cjs.map +1 -1
- package/dist/comments/MentionTextarea.d.ts.map +1 -1
- package/dist/comments/MentionTextarea.js +1 -1
- package/dist/comments/MentionTextarea.js.map +1 -1
- package/dist/comments/comment-assign.cjs +68 -0
- package/dist/comments/comment-assign.cjs.map +1 -0
- package/dist/comments/comment-assign.d.ts +31 -0
- package/dist/comments/comment-assign.d.ts.map +1 -0
- package/dist/comments/comment-assign.js +67 -0
- package/dist/comments/comment-assign.js.map +1 -0
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +39 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/comments/comment-utils.cjs +2 -0
- package/dist/comments/comment-utils.cjs.map +1 -1
- package/dist/comments/comment-utils.d.ts +2 -0
- package/dist/comments/comment-utils.d.ts.map +1 -1
- package/dist/comments/comment-utils.js +2 -0
- package/dist/comments/comment-utils.js.map +1 -1
- package/dist/comments.cjs +3 -0
- package/dist/comments.d.ts +1 -0
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +2 -1
- package/dist/components/ComboboxMenu.cjs +23 -13
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +23 -13
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +15 -4
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts +7 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +15 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/components/FilterBar.cjs +29 -6
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +3 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +29 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/ItemActions.cjs +1 -1
- package/dist/components/ItemActions.cjs.map +1 -1
- package/dist/components/ItemActions.js +1 -1
- package/dist/components/ItemActions.js.map +1 -1
- package/dist/components/ListMenu.cjs +33 -3
- package/dist/components/ListMenu.cjs.map +1 -1
- package/dist/components/ListMenu.d.ts +4 -1
- package/dist/components/ListMenu.d.ts.map +1 -1
- package/dist/components/ListMenu.js +33 -3
- package/dist/components/ListMenu.js.map +1 -1
- package/dist/components/ListMenuItems.cjs +80 -0
- package/dist/components/ListMenuItems.cjs.map +1 -0
- package/dist/components/ListMenuItems.d.ts +8 -0
- package/dist/components/ListMenuItems.d.ts.map +1 -0
- package/dist/components/ListMenuItems.js +80 -0
- package/dist/components/ListMenuItems.js.map +1 -0
- package/dist/components/LocalPathPicker.cjs +182 -0
- package/dist/components/LocalPathPicker.cjs.map +1 -0
- package/dist/components/LocalPathPicker.d.ts +11 -0
- package/dist/components/LocalPathPicker.d.ts.map +1 -0
- package/dist/components/LocalPathPicker.js +182 -0
- package/dist/components/LocalPathPicker.js.map +1 -0
- package/dist/components/LocalPathTree.cjs +89 -0
- package/dist/components/LocalPathTree.cjs.map +1 -0
- package/dist/components/LocalPathTree.d.ts +9 -0
- package/dist/components/LocalPathTree.d.ts.map +1 -0
- package/dist/components/LocalPathTree.js +89 -0
- package/dist/components/LocalPathTree.js.map +1 -0
- package/dist/components/RangeSlider.cjs +10 -30
- package/dist/components/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider.d.ts.map +1 -1
- package/dist/components/RangeSlider.js +4 -24
- package/dist/components/RangeSlider.js.map +1 -1
- package/dist/components/Slider.cjs +79 -0
- package/dist/components/Slider.cjs.map +1 -0
- package/dist/components/Slider.d.ts +23 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +79 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/combobox-types.d.ts +4 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.cjs +3 -5
- package/dist/components/filter-bar-field-utils.cjs.map +1 -1
- package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.js +3 -5
- package/dist/components/filter-bar-field-utils.js.map +1 -1
- package/dist/components/filter-bar-tree-model.cjs +22 -0
- package/dist/components/filter-bar-tree-model.cjs.map +1 -0
- package/dist/components/filter-bar-tree-model.d.ts +33 -0
- package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
- package/dist/components/filter-bar-tree-model.js +21 -0
- package/dist/components/filter-bar-tree-model.js.map +1 -0
- package/dist/components/filter-bar-tree.cjs +84 -0
- package/dist/components/filter-bar-tree.cjs.map +1 -0
- package/dist/components/filter-bar-tree.d.ts +7 -0
- package/dist/components/filter-bar-tree.d.ts.map +1 -0
- package/dist/components/filter-bar-tree.js +84 -0
- package/dist/components/filter-bar-tree.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
- package/dist/components/json-schema-form-help-links.cjs +18 -0
- package/dist/components/json-schema-form-help-links.cjs.map +1 -0
- package/dist/components/json-schema-form-help-links.d.ts +5 -0
- package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-links.js +18 -0
- package/dist/components/json-schema-form-help-links.js.map +1 -0
- package/dist/components/json-schema-form-help-model.cjs +7 -0
- package/dist/components/json-schema-form-help-model.cjs.map +1 -0
- package/dist/components/json-schema-form-help-model.d.ts +3 -0
- package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-model.js +7 -0
- package/dist/components/json-schema-form-help-model.js.map +1 -0
- package/dist/components/json-schema-form-json.cjs +48 -0
- package/dist/components/json-schema-form-json.cjs.map +1 -0
- package/dist/components/json-schema-form-json.d.ts +7 -0
- package/dist/components/json-schema-form-json.d.ts.map +1 -0
- package/dist/components/json-schema-form-json.js +48 -0
- package/dist/components/json-schema-form-json.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +7 -5
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +2 -2
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +7 -5
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +2 -13
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +2 -13
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +1 -1
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +1 -1
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +20 -6
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +20 -6
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +22 -2
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +22 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +5 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-union-model.cjs +46 -0
- package/dist/components/json-schema-form-union-model.cjs.map +1 -0
- package/dist/components/json-schema-form-union-model.d.ts +6 -0
- package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-union-model.js +43 -0
- package/dist/components/json-schema-form-union-model.js.map +1 -0
- package/dist/components/json-schema-form-union.cjs +52 -0
- package/dist/components/json-schema-form-union.cjs.map +1 -0
- package/dist/components/json-schema-form-union.d.ts +7 -0
- package/dist/components/json-schema-form-union.d.ts.map +1 -0
- package/dist/components/json-schema-form-union.js +52 -0
- package/dist/components/json-schema-form-union.js.map +1 -0
- package/dist/components/list-menu-virtual.cjs +5 -0
- package/dist/components/list-menu-virtual.cjs.map +1 -0
- package/dist/components/list-menu-virtual.d.ts +12 -0
- package/dist/components/list-menu-virtual.d.ts.map +1 -0
- package/dist/components/list-menu-virtual.js +6 -0
- package/dist/components/list-menu-virtual.js.map +1 -0
- package/dist/components/local-path.cjs +12 -0
- package/dist/components/local-path.cjs.map +1 -0
- package/dist/components/local-path.d.ts +14 -0
- package/dist/components/local-path.d.ts.map +1 -0
- package/dist/components/local-path.js +12 -0
- package/dist/components/local-path.js.map +1 -0
- package/dist/components/slider-shared.cjs +32 -0
- package/dist/components/slider-shared.cjs.map +1 -0
- package/dist/components/slider-shared.d.ts +18 -0
- package/dist/components/slider-shared.d.ts.map +1 -0
- package/dist/components/slider-shared.js +27 -0
- package/dist/components/slider-shared.js.map +1 -0
- package/dist/components.cjs +8 -0
- package/dist/components.d.ts +6 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +5 -1
- package/dist/connections/ConnectionsPage.cjs +51 -19
- package/dist/connections/ConnectionsPage.cjs.map +1 -1
- package/dist/connections/ConnectionsPage.d.ts +9 -1
- package/dist/connections/ConnectionsPage.d.ts.map +1 -1
- package/dist/connections/ConnectionsPage.js +52 -20
- package/dist/connections/ConnectionsPage.js.map +1 -1
- package/dist/connections/connectionDashboard.cjs +13 -8
- package/dist/connections/connectionDashboard.cjs.map +1 -1
- package/dist/connections/connectionDashboard.d.ts +8 -3
- package/dist/connections/connectionDashboard.d.ts.map +1 -1
- package/dist/connections/connectionDashboard.js +14 -9
- package/dist/connections/connectionDashboard.js.map +1 -1
- package/dist/connections/connectionDashboardModel.cjs.map +1 -1
- package/dist/connections/connectionDashboardModel.d.ts +4 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
- package/dist/connections/connectionDashboardModel.js.map +1 -1
- package/dist/connections/connectionDashboardRow.cjs +75 -55
- package/dist/connections/connectionDashboardRow.cjs.map +1 -1
- package/dist/connections/connectionDashboardRow.d.ts +3 -2
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
- package/dist/connections/connectionDashboardRow.js +75 -55
- package/dist/connections/connectionDashboardRow.js.map +1 -1
- package/dist/connections/connectionNamespaceField.cjs +17 -0
- package/dist/connections/connectionNamespaceField.cjs.map +1 -0
- package/dist/connections/connectionNamespaceField.d.ts +10 -0
- package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
- package/dist/connections/connectionNamespaceField.js +17 -0
- package/dist/connections/connectionNamespaceField.js.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.js +96 -0
- package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +11 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -1
- package/dist/connections/connectionsPageModel.d.ts +5 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -1
- package/dist/connections/connectionsPageModel.js +11 -1
- package/dist/connections/connectionsPageModel.js.map +1 -1
- package/dist/connections.cjs +5 -0
- package/dist/connections.d.ts +2 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +3 -2
- package/dist/data/AvatarBadge.cjs +3 -3
- package/dist/data/AvatarBadge.cjs.map +1 -1
- package/dist/data/AvatarBadge.js +3 -3
- package/dist/data/AvatarBadge.js.map +1 -1
- package/dist/data/CodeDiff.cjs +2 -0
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.js +2 -0
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +3 -2
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +3 -2
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Gauge.cjs +1 -1
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.js +1 -1
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/HighlightedTokens.cjs +2 -10
- package/dist/data/HighlightedTokens.cjs.map +1 -1
- package/dist/data/HighlightedTokens.d.ts.map +1 -1
- package/dist/data/HighlightedTokens.js +1 -9
- package/dist/data/HighlightedTokens.js.map +1 -1
- package/dist/data/Markdown.cjs +38 -11
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +9 -1
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +39 -12
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MultiGaugeBar.cjs +157 -0
- package/dist/data/MultiGaugeBar.cjs.map +1 -0
- package/dist/data/MultiGaugeBar.d.ts +29 -0
- package/dist/data/MultiGaugeBar.d.ts.map +1 -0
- package/dist/data/MultiGaugeBar.js +157 -0
- package/dist/data/MultiGaugeBar.js.map +1 -0
- package/dist/data/OpenInFilesLink.cjs +27 -0
- package/dist/data/OpenInFilesLink.cjs.map +1 -0
- package/dist/data/OpenInFilesLink.d.ts +15 -0
- package/dist/data/OpenInFilesLink.d.ts.map +1 -0
- package/dist/data/OpenInFilesLink.js +27 -0
- package/dist/data/OpenInFilesLink.js.map +1 -0
- package/dist/data/ProgressBar.cjs +5 -3
- package/dist/data/ProgressBar.cjs.map +1 -1
- package/dist/data/ProgressBar.d.ts +5 -1
- package/dist/data/ProgressBar.d.ts.map +1 -1
- package/dist/data/ProgressBar.js +5 -3
- package/dist/data/ProgressBar.js.map +1 -1
- package/dist/data/ProgressBars.cjs +13 -5
- package/dist/data/ProgressBars.cjs.map +1 -1
- package/dist/data/ProgressBars.d.ts +6 -1
- package/dist/data/ProgressBars.d.ts.map +1 -1
- package/dist/data/ProgressBars.js +13 -5
- package/dist/data/ProgressBars.js.map +1 -1
- package/dist/data/Properties.cjs +3 -3
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.js +3 -3
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -6
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +3 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +14 -6
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskPrompts.cjs +96 -0
- package/dist/data/TaskPrompts.cjs.map +1 -0
- package/dist/data/TaskPrompts.d.ts +6 -0
- package/dist/data/TaskPrompts.d.ts.map +1 -0
- package/dist/data/TaskPrompts.js +96 -0
- package/dist/data/TaskPrompts.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +3 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +7 -3
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -4
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +12 -5
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +13 -6
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/TimeseriesPanel.cjs +10 -9
- package/dist/data/TimeseriesPanel.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.d.ts +1 -1
- package/dist/data/TimeseriesPanel.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.js +11 -10
- package/dist/data/TimeseriesPanel.js.map +1 -1
- package/dist/data/TimeseriesPanel.model.cjs +62 -10
- package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.model.d.ts +40 -1
- package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.model.js +62 -11
- package/dist/data/TimeseriesPanel.model.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +7 -3
- package/dist/data/WorkloadCard.cjs.map +1 -1
- package/dist/data/WorkloadCard.d.ts +3 -1
- package/dist/data/WorkloadCard.d.ts.map +1 -1
- package/dist/data/WorkloadCard.js +7 -3
- package/dist/data/WorkloadCard.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +2 -1
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.placement.js +2 -1
- package/dist/data/ai/ChatWindow.placement.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +6 -3
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js +2 -1
- package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js +9 -6
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +2 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +3 -3
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -1
- package/dist/data/ai/PromptCatalog/prompt-page-model.js +4 -3
- package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -0
- package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
- package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.js +2 -2
- package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +2 -2
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.js +2 -2
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
- package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.js +126 -0
- package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.js +1 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
- package/dist/data/charts/BarChart.cjs +194 -0
- package/dist/data/charts/BarChart.cjs.map +1 -0
- package/dist/data/charts/BarChart.d.ts +19 -0
- package/dist/data/charts/BarChart.d.ts.map +1 -0
- package/dist/data/charts/BarChart.js +194 -0
- package/dist/data/charts/BarChart.js.map +1 -0
- package/dist/data/charts/ChartLegend.cjs +54 -0
- package/dist/data/charts/ChartLegend.cjs.map +1 -0
- package/dist/data/charts/ChartLegend.d.ts +17 -0
- package/dist/data/charts/ChartLegend.d.ts.map +1 -0
- package/dist/data/charts/ChartLegend.js +54 -0
- package/dist/data/charts/ChartLegend.js.map +1 -0
- package/dist/data/charts/Sparkline.cjs +56 -0
- package/dist/data/charts/Sparkline.cjs.map +1 -0
- package/dist/data/charts/Sparkline.d.ts +15 -0
- package/dist/data/charts/Sparkline.d.ts.map +1 -0
- package/dist/data/charts/Sparkline.js +56 -0
- package/dist/data/charts/Sparkline.js.map +1 -0
- package/dist/data/charts/StackedBarChart.cjs +241 -0
- package/dist/data/charts/StackedBarChart.cjs.map +1 -0
- package/dist/data/charts/StackedBarChart.d.ts +20 -0
- package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
- package/dist/data/charts/StackedBarChart.js +241 -0
- package/dist/data/charts/StackedBarChart.js.map +1 -0
- package/dist/data/charts/TrendChart.cjs +157 -0
- package/dist/data/charts/TrendChart.cjs.map +1 -0
- package/dist/data/charts/TrendChart.d.ts +20 -0
- package/dist/data/charts/TrendChart.d.ts.map +1 -0
- package/dist/data/charts/TrendChart.js +157 -0
- package/dist/data/charts/TrendChart.js.map +1 -0
- package/dist/data/charts/chart-marks.cjs +115 -0
- package/dist/data/charts/chart-marks.cjs.map +1 -0
- package/dist/data/charts/chart-marks.d.ts +39 -0
- package/dist/data/charts/chart-marks.d.ts.map +1 -0
- package/dist/data/charts/chart-marks.js +112 -0
- package/dist/data/charts/chart-marks.js.map +1 -0
- package/dist/data/charts/chart-palette.cjs +74 -0
- package/dist/data/charts/chart-palette.cjs.map +1 -0
- package/dist/data/charts/chart-palette.d.ts +58 -0
- package/dist/data/charts/chart-palette.d.ts.map +1 -0
- package/dist/data/charts/chart-palette.js +72 -0
- package/dist/data/charts/chart-palette.js.map +1 -0
- package/dist/data/charts/chart-scale.cjs +115 -0
- package/dist/data/charts/chart-scale.cjs.map +1 -0
- package/dist/data/charts/chart-scale.d.ts +41 -0
- package/dist/data/charts/chart-scale.d.ts.map +1 -0
- package/dist/data/charts/chart-scale.js +104 -0
- package/dist/data/charts/chart-scale.js.map +1 -0
- package/dist/data/charts/chart.test-utils.d.ts +7 -0
- package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
- package/dist/data/charts/index.d.ts +7 -0
- package/dist/data/charts/index.d.ts.map +1 -0
- package/dist/data/chat/MessageActions.cjs +1 -1
- package/dist/data/chat/MessageActions.cjs.map +1 -1
- package/dist/data/chat/MessageActions.js +1 -1
- package/dist/data/chat/MessageActions.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/ProblemActions.cjs +37 -0
- package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemActions.js +37 -0
- package/dist/data/diagnostics/ProblemActions.js.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
- package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.js +33 -0
- package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
- package/dist/data/diagnostics/ProblemRow.cjs +62 -0
- package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
- package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemRow.js +62 -0
- package/dist/data/diagnostics/ProblemRow.js.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +1 -1
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
- package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.js +14 -0
- package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.js +16 -0
- package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +9 -6
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -0
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +9 -6
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
- package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.js +1 -0
- package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
- package/dist/data/lint/LintDetail.cjs +230 -189
- package/dist/data/lint/LintDetail.cjs.map +1 -1
- package/dist/data/lint/LintDetail.d.ts +25 -3
- package/dist/data/lint/LintDetail.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.js +231 -192
- package/dist/data/lint/LintDetail.js.map +1 -1
- package/dist/data/lint/LintFilterBar.cjs +78 -83
- package/dist/data/lint/LintFilterBar.cjs.map +1 -1
- package/dist/data/lint/LintFilterBar.d.ts +23 -6
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
- package/dist/data/lint/LintFilterBar.js +78 -85
- package/dist/data/lint/LintFilterBar.js.map +1 -1
- package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
- package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.js +58 -0
- package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +59 -14
- package/dist/data/lint/LintResults.cjs.map +1 -1
- package/dist/data/lint/LintResults.d.ts +25 -1
- package/dist/data/lint/LintResults.d.ts.map +1 -1
- package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
- package/dist/data/lint/LintResults.js +60 -15
- package/dist/data/lint/LintResults.js.map +1 -1
- package/dist/data/lint/LintTable.cjs +156 -0
- package/dist/data/lint/LintTable.cjs.map +1 -0
- package/dist/data/lint/LintTable.d.ts +13 -0
- package/dist/data/lint/LintTable.d.ts.map +1 -0
- package/dist/data/lint/LintTable.js +156 -0
- package/dist/data/lint/LintTable.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +42 -19
- package/dist/data/lint/LintTreeNode.cjs.map +1 -1
- package/dist/data/lint/LintTreeNode.d.ts +7 -2
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
- package/dist/data/lint/LintTreeNode.js +44 -21
- package/dist/data/lint/LintTreeNode.js.map +1 -1
- package/dist/data/lint/ViolationSnippet.cjs +113 -0
- package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
- package/dist/data/lint/ViolationSnippet.d.ts +20 -0
- package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
- package/dist/data/lint/ViolationSnippet.js +112 -0
- package/dist/data/lint/ViolationSnippet.js.map +1 -0
- package/dist/data/lint/actions.cjs +44 -16
- package/dist/data/lint/actions.cjs.map +1 -1
- package/dist/data/lint/actions.d.ts +7 -3
- package/dist/data/lint/actions.d.ts.map +1 -1
- package/dist/data/lint/actions.js +44 -16
- package/dist/data/lint/actions.js.map +1 -1
- package/dist/data/lint/grouping.cjs +105 -8
- package/dist/data/lint/grouping.cjs.map +1 -1
- package/dist/data/lint/grouping.d.ts +21 -1
- package/dist/data/lint/grouping.d.ts.map +1 -1
- package/dist/data/lint/grouping.js +105 -10
- package/dist/data/lint/grouping.js.map +1 -1
- package/dist/data/lint/ignore-menu-items.cjs +18 -0
- package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
- package/dist/data/lint/ignore-menu-items.d.ts +6 -0
- package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
- package/dist/data/lint/ignore-menu-items.js +17 -0
- package/dist/data/lint/ignore-menu-items.js.map +1 -0
- package/dist/data/lint/index.d.ts +7 -5
- package/dist/data/lint/index.d.ts.map +1 -1
- package/dist/data/lint/stats.cjs +19 -4
- package/dist/data/lint/stats.cjs.map +1 -1
- package/dist/data/lint/stats.d.ts +13 -3
- package/dist/data/lint/stats.d.ts.map +1 -1
- package/dist/data/lint/stats.js +17 -5
- package/dist/data/lint/stats.js.map +1 -1
- package/dist/data/lint/types.cjs +8 -0
- package/dist/data/lint/types.cjs.map +1 -1
- package/dist/data/lint/types.d.ts +47 -0
- package/dist/data/lint/types.d.ts.map +1 -1
- package/dist/data/lint/types.js +8 -1
- package/dist/data/lint/types.js.map +1 -1
- package/dist/data/lint/violation-menu-items.cjs +31 -0
- package/dist/data/lint/violation-menu-items.cjs.map +1 -0
- package/dist/data/lint/violation-menu-items.d.ts +12 -0
- package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
- package/dist/data/lint/violation-menu-items.js +31 -0
- package/dist/data/lint/violation-menu-items.js.map +1 -0
- package/dist/data/markdown-source-blocks.cjs +38 -0
- package/dist/data/markdown-source-blocks.cjs.map +1 -0
- package/dist/data/markdown-source-blocks.d.ts +32 -0
- package/dist/data/markdown-source-blocks.d.ts.map +1 -0
- package/dist/data/markdown-source-blocks.js +35 -0
- package/dist/data/markdown-source-blocks.js.map +1 -0
- package/dist/data/test-runner/FilterFacet.cjs +52 -0
- package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
- package/dist/data/test-runner/FilterFacet.d.ts +13 -0
- package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
- package/dist/data/test-runner/FilterFacet.js +52 -0
- package/dist/data/test-runner/FilterFacet.js.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +19 -29
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +19 -29
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
- package/dist/data/test-runner/TestAttemptDetail.js +1 -1
- package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
- 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 +11 -0
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +3 -44
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +3 -44
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -1
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +7 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -1
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +3 -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/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/timeseries-query.cjs +98 -2
- package/dist/data/timeseries-query.cjs.map +1 -1
- package/dist/data/timeseries-query.d.ts +31 -5
- package/dist/data/timeseries-query.d.ts.map +1 -1
- package/dist/data/timeseries-query.js +98 -3
- package/dist/data/timeseries-query.js.map +1 -1
- package/dist/data/timeseries-stream-provider.cjs +38 -0
- package/dist/data/timeseries-stream-provider.cjs.map +1 -0
- package/dist/data/timeseries-stream-provider.d.ts +26 -0
- package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
- package/dist/data/timeseries-stream-provider.js +38 -0
- package/dist/data/timeseries-stream-provider.js.map +1 -0
- package/dist/data/timeseries-stream.cjs +304 -0
- package/dist/data/timeseries-stream.cjs.map +1 -0
- package/dist/data/timeseries-stream.d.ts +81 -0
- package/dist/data/timeseries-stream.d.ts.map +1 -0
- package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
- package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
- package/dist/data/timeseries-stream.js +296 -0
- package/dist/data/timeseries-stream.js.map +1 -0
- package/dist/data/token-style.cjs +13 -0
- package/dist/data/token-style.cjs.map +1 -0
- package/dist/data/token-style.d.ts +4 -0
- package/dist/data/token-style.d.ts.map +1 -0
- package/dist/data/token-style.js +13 -0
- package/dist/data/token-style.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
- package/dist/data/traces/ProcessTraceDetail.js +1 -1
- package/dist/data/traces/index.d.ts +8 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/traces/otel/OperationList.cjs +64 -0
- package/dist/data/traces/otel/OperationList.cjs.map +1 -0
- package/dist/data/traces/otel/OperationList.d.ts +10 -0
- package/dist/data/traces/otel/OperationList.d.ts.map +1 -0
- package/dist/data/traces/otel/OperationList.js +64 -0
- package/dist/data/traces/otel/OperationList.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts +7 -0
- package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceDetail.js +781 -0
- package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts +16 -0
- package/dist/data/traces/otel/OtelTraceSearch.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceSearch.js +145 -0
- package/dist/data/traces/otel/OtelTraceSearch.js.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs +47 -0
- package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts +12 -0
- package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -0
- package/dist/data/traces/otel/OtelTraceTable.js +47 -0
- package/dist/data/traces/otel/OtelTraceTable.js.map +1 -0
- package/dist/data/traces/otel/QueryBar.cjs +158 -0
- package/dist/data/traces/otel/QueryBar.cjs.map +1 -0
- package/dist/data/traces/otel/QueryBar.d.ts +12 -0
- package/dist/data/traces/otel/QueryBar.d.ts.map +1 -0
- package/dist/data/traces/otel/QueryBar.js +158 -0
- package/dist/data/traces/otel/QueryBar.js.map +1 -0
- package/dist/data/traces/otel/SpanCards.cjs +264 -0
- package/dist/data/traces/otel/SpanCards.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCards.d.ts +17 -0
- package/dist/data/traces/otel/SpanCards.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCards.js +261 -0
- package/dist/data/traces/otel/SpanCards.js.map +1 -0
- package/dist/data/traces/otel/SpanCategory.cjs +18 -0
- package/dist/data/traces/otel/SpanCategory.cjs.map +1 -0
- package/dist/data/traces/otel/SpanCategory.d.ts +7 -0
- package/dist/data/traces/otel/SpanCategory.d.ts.map +1 -0
- package/dist/data/traces/otel/SpanCategory.js +18 -0
- package/dist/data/traces/otel/SpanCategory.js.map +1 -0
- package/dist/data/traces/otel/TraceResults.cjs +195 -0
- package/dist/data/traces/otel/TraceResults.cjs.map +1 -0
- package/dist/data/traces/otel/TraceResults.d.ts +19 -0
- package/dist/data/traces/otel/TraceResults.d.ts.map +1 -0
- package/dist/data/traces/otel/TraceResults.js +193 -0
- package/dist/data/traces/otel/TraceResults.js.map +1 -0
- package/dist/data/traces/otel/api.cjs +36 -0
- package/dist/data/traces/otel/api.cjs.map +1 -0
- package/dist/data/traces/otel/api.d.ts +87 -0
- package/dist/data/traces/otel/api.d.ts.map +1 -0
- package/dist/data/traces/otel/api.js +33 -0
- package/dist/data/traces/otel/api.js.map +1 -0
- package/dist/data/traces/otel/fixtures.d.ts +4 -0
- package/dist/data/traces/otel/fixtures.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.cjs +7 -0
- package/dist/data/traces/otel/metrics.cjs.map +1 -0
- package/dist/data/traces/otel/metrics.d.ts +2 -0
- package/dist/data/traces/otel/metrics.d.ts.map +1 -0
- package/dist/data/traces/otel/metrics.js +7 -0
- package/dist/data/traces/otel/metrics.js.map +1 -0
- package/dist/data/traces/otel/model.cjs +167 -0
- package/dist/data/traces/otel/model.cjs.map +1 -0
- package/dist/data/traces/otel/model.d.ts +81 -0
- package/dist/data/traces/otel/model.d.ts.map +1 -0
- package/dist/data/traces/otel/model.js +154 -0
- package/dist/data/traces/otel/model.js.map +1 -0
- package/dist/data/traces/otel/query.cjs +90 -0
- package/dist/data/traces/otel/query.cjs.map +1 -0
- package/dist/data/traces/otel/query.d.ts +20 -0
- package/dist/data/traces/otel/query.d.ts.map +1 -0
- package/dist/data/traces/otel/query.js +86 -0
- package/dist/data/traces/otel/query.js.map +1 -0
- package/dist/data/traces/otel/result-model.cjs +25 -0
- package/dist/data/traces/otel/result-model.cjs.map +1 -0
- package/dist/data/traces/otel/result-model.d.ts +5 -0
- package/dist/data/traces/otel/result-model.d.ts.map +1 -0
- package/dist/data/traces/otel/result-model.js +24 -0
- package/dist/data/traces/otel/result-model.js.map +1 -0
- package/dist/data/traces/otel/source.cjs +11 -0
- package/dist/data/traces/otel/source.cjs.map +1 -0
- package/dist/data/traces/otel/source.d.ts +5 -0
- package/dist/data/traces/otel/source.d.ts.map +1 -0
- package/dist/data/traces/otel/source.js +10 -0
- package/dist/data/traces/otel/source.js.map +1 -0
- package/dist/data/traces/otel/span-traces.cjs +39 -0
- package/dist/data/traces/otel/span-traces.cjs.map +1 -0
- package/dist/data/traces/otel/span-traces.d.ts +3 -0
- package/dist/data/traces/otel/span-traces.d.ts.map +1 -0
- package/dist/data/traces/otel/span-traces.js +39 -0
- package/dist/data/traces/otel/span-traces.js.map +1 -0
- package/dist/data/use-data-table-virtual.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data/workload-panel/MemoryStack.cjs +49 -0
- package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
- package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
- package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
- package/dist/data/workload-panel/MemoryStack.js +48 -0
- package/dist/data/workload-panel/MemoryStack.js.map +1 -0
- package/dist/data/workload-panel/Metrics.cjs +197 -0
- package/dist/data/workload-panel/Metrics.cjs.map +1 -0
- package/dist/data/workload-panel/Metrics.d.ts +11 -0
- package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
- package/dist/data/workload-panel/Metrics.js +196 -0
- package/dist/data/workload-panel/Metrics.js.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.js +66 -0
- package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
- package/dist/data/workload-panel/fixtures.d.ts +60 -0
- package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
- package/dist/data/workload-panel/model.cjs +137 -0
- package/dist/data/workload-panel/model.cjs.map +1 -0
- package/dist/data/workload-panel/model.d.ts +53 -0
- package/dist/data/workload-panel/model.d.ts.map +1 -0
- package/dist/data/workload-panel/model.js +133 -0
- package/dist/data/workload-panel/model.js.map +1 -0
- package/dist/data/workload-panel/types.d.ts +56 -0
- package/dist/data/workload-panel/types.d.ts.map +1 -0
- package/dist/data.cjs +68 -6
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +32 -10
- package/dist/file-findings/AnnotatedCode.cjs +243 -0
- package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/AnnotatedCode.d.ts +30 -0
- package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/AnnotatedCode.js +243 -0
- package/dist/file-findings/AnnotatedCode.js.map +1 -0
- package/dist/file-findings/FileFindingsView.cjs +213 -0
- package/dist/file-findings/FileFindingsView.cjs.map +1 -0
- package/dist/file-findings/FileFindingsView.d.ts +35 -0
- package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
- package/dist/file-findings/FileFindingsView.js +213 -0
- package/dist/file-findings/FileFindingsView.js.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.js +22 -0
- package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
- package/dist/file-findings/adapters.cjs +155 -0
- package/dist/file-findings/adapters.cjs.map +1 -0
- package/dist/file-findings/adapters.d.ts +24 -0
- package/dist/file-findings/adapters.d.ts.map +1 -0
- package/dist/file-findings/adapters.js +153 -0
- package/dist/file-findings/adapters.js.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
- package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.js +97 -0
- package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
- package/dist/file-findings/file-review/FileReview.cjs +863 -0
- package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
- package/dist/file-findings/file-review/FileReview.d.ts +79 -0
- package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.js +863 -0
- package/dist/file-findings/file-review/FileReview.js.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.js +77 -0
- package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
- package/dist/file-findings/file-review/InlineThread.cjs +77 -0
- package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
- package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineThread.js +77 -0
- package/dist/file-findings/file-review/InlineThread.js.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
- package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.js +164 -0
- package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
- package/dist/file-findings/file-review/SourceView.cjs +179 -0
- package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
- package/dist/file-findings/file-review/SourceView.d.ts +29 -0
- package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
- package/dist/file-findings/file-review/SourceView.js +179 -0
- package/dist/file-findings/file-review/SourceView.js.map +1 -0
- package/dist/file-findings/file-review/blame.cjs +35 -0
- package/dist/file-findings/file-review/blame.cjs.map +1 -0
- package/dist/file-findings/file-review/blame.d.ts +28 -0
- package/dist/file-findings/file-review/blame.d.ts.map +1 -0
- package/dist/file-findings/file-review/blame.js +33 -0
- package/dist/file-findings/file-review/blame.js.map +1 -0
- package/dist/file-findings/file-review/geometry.cjs +101 -0
- package/dist/file-findings/file-review/geometry.cjs.map +1 -0
- package/dist/file-findings/file-review/geometry.d.ts +45 -0
- package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
- package/dist/file-findings/file-review/geometry.js +98 -0
- package/dist/file-findings/file-review/geometry.js.map +1 -0
- package/dist/file-findings/file-review/hooks.cjs +101 -0
- package/dist/file-findings/file-review/hooks.cjs.map +1 -0
- package/dist/file-findings/file-review/hooks.d.ts +22 -0
- package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
- package/dist/file-findings/file-review/hooks.js +99 -0
- package/dist/file-findings/file-review/hooks.js.map +1 -0
- package/dist/file-findings/file-review/marks.cjs +52 -0
- package/dist/file-findings/file-review/marks.cjs.map +1 -0
- package/dist/file-findings/file-review/marks.d.ts +23 -0
- package/dist/file-findings/file-review/marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/marks.js +47 -0
- package/dist/file-findings/file-review/marks.js.map +1 -0
- package/dist/file-findings/file-review/problem-filters.cjs +14 -0
- package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
- package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
- package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
- package/dist/file-findings/file-review/problem-filters.js +13 -0
- package/dist/file-findings/file-review/problem-filters.js.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
- package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.js +226 -0
- package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-anchor.cjs +104 -0
- package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
- package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-anchor.js +99 -0
- package/dist/file-findings/file-review/source-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-marks.cjs +71 -0
- package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
- package/dist/file-findings/file-review/source-marks.d.ts +27 -0
- package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-marks.js +68 -0
- package/dist/file-findings/file-review/source-marks.js.map +1 -0
- package/dist/file-findings/findings-comments.cjs +136 -0
- package/dist/file-findings/findings-comments.cjs.map +1 -0
- package/dist/file-findings/findings-comments.d.ts +28 -0
- package/dist/file-findings/findings-comments.d.ts.map +1 -0
- package/dist/file-findings/findings-comments.js +131 -0
- package/dist/file-findings/findings-comments.js.map +1 -0
- package/dist/file-findings/findings-languages.cjs +53 -0
- package/dist/file-findings/findings-languages.cjs.map +1 -0
- package/dist/file-findings/findings-languages.d.ts +11 -0
- package/dist/file-findings/findings-languages.d.ts.map +1 -0
- package/dist/file-findings/findings-languages.js +53 -0
- package/dist/file-findings/findings-languages.js.map +1 -0
- package/dist/file-findings/mdx-source.cjs +48 -0
- package/dist/file-findings/mdx-source.cjs.map +1 -0
- package/dist/file-findings/mdx-source.d.ts +7 -0
- package/dist/file-findings/mdx-source.d.ts.map +1 -0
- package/dist/file-findings/mdx-source.js +48 -0
- package/dist/file-findings/mdx-source.js.map +1 -0
- package/dist/file-findings/monaco-language.cjs +73 -0
- package/dist/file-findings/monaco-language.cjs.map +1 -0
- package/dist/file-findings/monaco-language.d.ts +11 -0
- package/dist/file-findings/monaco-language.d.ts.map +1 -0
- package/dist/file-findings/monaco-language.js +72 -0
- package/dist/file-findings/monaco-language.js.map +1 -0
- package/dist/file-findings/severity-counts.cjs +20 -0
- package/dist/file-findings/severity-counts.cjs.map +1 -0
- package/dist/file-findings/severity-counts.d.ts +5 -0
- package/dist/file-findings/severity-counts.d.ts.map +1 -0
- package/dist/file-findings/severity-counts.js +19 -0
- package/dist/file-findings/severity-counts.js.map +1 -0
- package/dist/file-findings/types.cjs +12 -0
- package/dist/file-findings/types.cjs.map +1 -0
- package/dist/file-findings/types.d.ts +43 -0
- package/dist/file-findings/types.d.ts.map +1 -0
- package/dist/file-findings/types.js +11 -0
- package/dist/file-findings/types.js.map +1 -0
- package/dist/file-findings.cjs +47 -0
- package/dist/file-findings.d.ts +15 -0
- package/dist/file-findings.d.ts.map +1 -0
- package/dist/file-findings.js +15 -0
- package/dist/hooks/event-hub.cjs +22 -8
- package/dist/hooks/event-hub.cjs.map +1 -1
- package/dist/hooks/event-hub.d.ts.map +1 -1
- package/dist/hooks/event-hub.js +22 -8
- package/dist/hooks/event-hub.js.map +1 -1
- package/dist/icons/components/UiBrowser.cjs +51 -0
- package/dist/icons/components/UiBrowser.cjs.map +1 -0
- package/dist/icons/components/UiBrowser.d.ts +15 -0
- package/dist/icons/components/UiBrowser.d.ts.map +1 -0
- package/dist/icons/components/UiBrowser.js +48 -0
- package/dist/icons/components/UiBrowser.js.map +1 -0
- package/dist/icons/components/UiCreditCard.cjs +51 -0
- package/dist/icons/components/UiCreditCard.cjs.map +1 -0
- package/dist/icons/components/UiCreditCard.d.ts +15 -0
- package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
- package/dist/icons/components/UiCreditCard.js +48 -0
- package/dist/icons/components/UiCreditCard.js.map +1 -0
- package/dist/icons/components/UiShoppingCart.cjs +51 -0
- package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
- package/dist/icons/components/UiShoppingCart.d.ts +15 -0
- package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
- package/dist/icons/components/UiShoppingCart.js +48 -0
- package/dist/icons/components/UiShoppingCart.js.map +1 -0
- package/dist/icons/index.d.ts +6 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +6 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +6 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +9 -0
- package/dist/icons.js +4 -1
- package/dist/index.cjs +86 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -12
- package/dist/layout/AppShell.cjs +37 -21
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +13 -2
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +37 -21
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +7 -6
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +7 -6
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +16 -6
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +12 -2
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +16 -6
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/layout/Workspace.cjs +37 -33
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +37 -33
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/layout/Workspace.regions.cjs +3 -3
- package/dist/layout/Workspace.regions.cjs.map +1 -1
- package/dist/layout/Workspace.regions.js +3 -3
- package/dist/layout/Workspace.regions.js.map +1 -1
- package/dist/lib/breakpoints.cjs +102 -0
- package/dist/lib/breakpoints.cjs.map +1 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +99 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/combobox.cjs +2 -1
- package/dist/lib/combobox.cjs.map +1 -1
- package/dist/lib/combobox.d.ts +1 -1
- package/dist/lib/combobox.d.ts.map +1 -1
- package/dist/lib/combobox.js +2 -1
- package/dist/lib/combobox.js.map +1 -1
- package/dist/lib/path-tree.cjs +21 -0
- package/dist/lib/path-tree.cjs.map +1 -1
- package/dist/lib/path-tree.d.ts +15 -0
- package/dist/lib/path-tree.d.ts.map +1 -1
- package/dist/lib/path-tree.js +21 -1
- package/dist/lib/path-tree.js.map +1 -1
- package/dist/overlay/Modal.cjs +2 -1
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +2 -1
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/profiles/editor/profileEditor.cjs +1 -1
- package/dist/profiles/editor/profileEditor.cjs.map +1 -1
- package/dist/profiles/editor/profileEditor.js +1 -1
- package/dist/profiles/editor/profileEditor.js.map +1 -1
- package/dist/profiles/editor/profileEditorSections.cjs +6 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.d.ts.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +6 -2
- package/dist/profiles/editor/profileEditorSections.js.map +1 -1
- package/dist/profiles/query/prometheusResults.cjs +24 -36
- package/dist/profiles/query/prometheusResults.cjs.map +1 -1
- package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
- package/dist/profiles/query/prometheusResults.js +24 -36
- package/dist/profiles/query/prometheusResults.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +1 -1
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.js +1 -1
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/classify.cjs +1 -1
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +1 -1
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/useOperations.d.ts +24 -24
- package/dist/rpc.cjs +0 -2
- package/dist/rpc.d.ts +0 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -2
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +6 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/package.json +9 -3
- package/schemas/json-schema-form.schema.json +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Properties.js","names":[],"sources":["../../src/data/Properties.tsx"],"sourcesContent":["import {\n Fragment,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\nimport { IconButton } from \"../components/IconButton\";\nimport {\n UiCheck,\n UiDotsVertical,\n UiListDashes,\n UiListFlat,\n UiRows,\n} from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { formatPropertyLabel } from \"./properties-utils\";\nimport { PropertiesContext } from \"./properties-context\";\nimport { PropertyValue } from \"./PropertyValue\";\n\nexport type PropertiesAction<V = unknown> = {\n /** Stable action id. */\n id: string;\n /** Iconify name or imported icon component. */\n icon: string | StaticIconComponent;\n /** Accessible label and tooltip for this row action. */\n label: (key: string, value: V, item: PropertiesItem<V>) => string;\n /** Return false to hide the action for a specific row. */\n visible?: (key: string, value: V, item: PropertiesItem<V>) => boolean;\n /** Return true to disable the action for a specific row. */\n disabled?: (key: string, value: V, item: PropertiesItem<V>) => boolean;\n /** Called when the row action is clicked. */\n onClick: (key: string, value: V, item: PropertiesItem<V>) => void;\n};\n\nexport type PropertiesItem<V = unknown> = {\n /** Stable property key. Also used as the default label. */\n key: string;\n /** Property value passed to renderers and actions. */\n value: V;\n /** Optional display type; structured values otherwise render as JSON. */\n type?: \"text\" | \"json\" | \"bytes\" | \"duration\" | \"number\" | \"boolean\" | \"date\";\n /** Unit for numeric values, such as ms, s, bytes, or percent. */\n unit?: string;\n /** Secondary text shown below the label. */\n subtitle?: ReactNode;\n /** Hide this row without removing it from the item array. */\n hidden?: boolean;\n /** Enables a child area spanning both columns, with nested labels indented. */\n expandable?: boolean;\n /** Controlled expanded state. */\n expanded?: boolean;\n /** Called when an expandable row is toggled. */\n onToggle?: (next: boolean) => void;\n /** Child content rendered when the row is expanded. */\n renderChildren?: () => ReactNode;\n};\n\nexport type PropertiesDensity = \"comfortable\" | \"compact\" | \"spacious\";\n\nexport type PropertiesProps<V = unknown> = {\n /** Property rows to render. Hidden items are filtered out. */\n items: PropertiesItem<V>[];\n /** Custom label renderer. */\n renderLabel?: (key: string, value: V, item: PropertiesItem<V>) => ReactNode;\n /** Custom value renderer. */\n renderValue?: (key: string, value: V, item: PropertiesItem<V>) => ReactNode;\n /** Static icon name or function that returns an icon name per row. */\n labelIcon?:\n | string\n | ((key: string, value: V, item: PropertiesItem<V>) => string | undefined);\n /** Actions rendered before the value. */\n prefixActions?: PropertiesAction<V>[];\n /** Actions rendered after the value. */\n suffixActions?: PropertiesAction<V>[];\n /** Classes applied to the list root. */\n className?: string;\n /** Classes applied to each row. */\n rowClassName?: string;\n /** CSS grid columns applied to each row. Defaults to the selected density preset. */\n gridTemplateColumns?: string;\n /** Classes applied to each label cell. */\n labelClassName?: string;\n /** Classes applied to each value cell. */\n valueClassName?: string;\n /** Row density preset. */\n density?: PropertiesDensity;\n /** Stable reference used to persist this instance's density preference. */\n keyRef?: string;\n /** Show the display-options menu. */\n showDensityMenu?: boolean;\n /** Empty-state content when no rows are visible. */\n emptyMessage?: ReactNode;\n};\n\nconst PROPERTIES_DENSITY_STORAGE_PREFIX = \"clicky-ui-properties\";\n\nconst PROPERTIES_DENSITY_OPTIONS: Array<{\n value: PropertiesDensity;\n label: string;\n icon: StaticIconComponent;\n}> = [\n { value: \"compact\", label: \"Compact\", icon: UiRows },\n { value: \"comfortable\", label: \"Comfortable\", icon: UiListFlat },\n { value: \"spacious\", label: \"Spacious\", icon: UiListDashes },\n];\n\nconst DENSITY_CLASSES: Record<\n PropertiesDensity,\n { row: string; label: string; value: string; gridTemplateColumns: string }\n> = {\n spacious: {\n row: \"px-density-4 py-density-3\",\n label: \"text-sm font-medium text-muted-foreground\",\n value: \"text-base text-foreground\",\n gridTemplateColumns: \"minmax(12rem, 20rem) minmax(0, 1fr)\",\n },\n comfortable: {\n row: \"px-density-3 py-density-2\",\n label: \"text-xs font-medium text-muted-foreground\",\n value: \"text-sm text-foreground\",\n gridTemplateColumns: \"minmax(7rem, 12rem) minmax(0, 1fr)\",\n },\n compact: {\n row: \"px-density-2 py-density-1.5\",\n label: \"font-mono text-[11px] text-muted-foreground\",\n value: \"text-xs text-foreground\",\n gridTemplateColumns: \"minmax(8rem, 14rem) minmax(0, 1fr)\",\n },\n};\n\nexport function Properties<V = unknown>({\n items,\n renderLabel,\n renderValue,\n labelIcon,\n prefixActions,\n suffixActions,\n className,\n rowClassName,\n gridTemplateColumns,\n labelClassName,\n valueClassName,\n density = \"comfortable\",\n keyRef,\n showDensityMenu = true,\n emptyMessage = \"No properties\",\n}: PropertiesProps<V>) {\n const parent = useContext(PropertiesContext);\n const [densityOverride, setDensityOverride] = useState<PropertiesDensity>();\n useEffect(() => setDensityOverride(readStoredDensity(keyRef)), [keyRef]);\n\n const visible = items.filter((item) => !item.hidden);\n\n if (visible.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">{emptyMessage}</div>;\n }\n\n const activeDensity = parent?.density ?? densityOverride ?? density;\n const styles = DENSITY_CLASSES[activeDensity];\n const columns =\n parent?.columns ?? gridTemplateColumns ?? styles.gridTemplateColumns;\n const depth = parent?.depth ?? 0;\n\n const updateDensity = (next: PropertiesDensity) => {\n setDensityOverride(next);\n writeStoredDensity(keyRef, next);\n };\n\n return (\n <dl\n className={cn(\n \"grid gap-x-density-3 divide-y divide-border rounded-md border border-border bg-muted/20\",\n parent && \"col-span-full rounded-none border-0 bg-transparent\",\n className,\n )}\n style={{ gridTemplateColumns: parent ? \"subgrid\" : columns }}\n >\n {showDensityMenu && !parent ? (\n <div className=\"col-span-full flex items-center justify-end px-density-2 py-density-1\">\n <dt className=\"sr-only\">Properties display options</dt>\n <dd>\n <PropertiesDensityMenu\n density={activeDensity}\n onChange={updateDensity}\n />\n </dd>\n </div>\n ) : null}\n {visible.map((item) => {\n const iconName =\n typeof labelIcon === \"function\"\n ? labelIcon(item.key, item.value, item)\n : labelIcon;\n const renderedLabel = renderLabel\n ? renderLabel(item.key, item.value, item)\n : formatPropertyLabel(item.key);\n const ariaLabel =\n typeof renderedLabel === \"string\" ? renderedLabel : item.key;\n\n return (\n <Fragment key={item.key}>\n <div\n className={cn(\n \"col-span-full grid min-w-0 grid-cols-subgrid gap-density-3\",\n styles.row,\n rowClassName,\n )}\n >\n <dt\n aria-label={ariaLabel}\n className={cn(\"min-w-0 truncate\", styles.label, labelClassName)}\n style={{ paddingInlineStart: depth * 16 }}\n >\n <div className=\"flex min-w-0 items-center gap-density-1\">\n {iconName ? (\n <Icon name={iconName} className=\"text-xs shrink-0\" />\n ) : null}\n <span className=\"min-w-0 truncate\">{renderedLabel}</span>\n </div>\n {item.subtitle ? (\n <div className=\"mt-0.5 text-[10px] font-normal text-muted-foreground/80\">\n {item.subtitle}\n </div>\n ) : null}\n </dt>\n <dd className={cn(\"min-w-0 space-y-density-1\", valueClassName)}>\n <div className=\"flex min-w-0 items-start gap-density-1\">\n <ActionList\n actions={prefixActions}\n item={item}\n className=\"shrink-0 pt-0.5\"\n />\n <div\n className={cn(\"min-w-0 max-w-full flex-1\", styles.value)}\n >\n {renderValue\n ? renderValue(item.key, item.value, item)\n : <PropertyValue item={item} density={activeDensity} />}\n </div>\n <ActionList\n actions={suffixActions}\n item={item}\n className=\"shrink-0 pt-0.5\"\n />\n </div>\n </dd>\n </div>\n {item.expandable && item.expanded && item.renderChildren ? (\n <div className=\"col-span-full grid grid-cols-subgrid\">\n <dt className=\"sr-only\">{ariaLabel} properties</dt>\n <dd className=\"col-span-full grid min-w-0 grid-cols-subgrid\">\n <PropertiesContext.Provider\n value={{\n depth: depth + 1,\n columns,\n density: activeDensity,\n }}\n >\n {item.renderChildren()}\n </PropertiesContext.Provider>\n </dd>\n </div>\n ) : null}\n </Fragment>\n );\n })}\n </dl>\n );\n}\n\nfunction PropertiesDensityMenu({\n density,\n onChange,\n}: {\n density: PropertiesDensity;\n onChange: (density: PropertiesDensity) => void;\n}) {\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Properties options\"\n trigger={\n <IconButton\n icon={UiDotsVertical}\n label=\"Properties options\"\n className=\"h-6 w-6\"\n />\n }\n >\n {(closeMenu) => (\n <div className=\"min-w-44 py-1 text-popover-foreground\">\n <div className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n Density\n </div>\n {PROPERTIES_DENSITY_OPTIONS.map((option) => {\n const active = density === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => {\n onChange(option.value);\n closeMenu();\n }}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction densityMenuItemClassName(active: boolean): string {\n return cn(\n \"flex w-full items-center gap-2 px-2 py-1.5 text-left text-sm\",\n \"hover:bg-accent focus:bg-accent focus:outline-none\",\n active && \"bg-accent/60\",\n );\n}\n\nfunction readStoredDensity(\n keyRef: string | undefined,\n): PropertiesDensity | undefined {\n const storageKey = propertiesDensityStorageKey(keyRef);\n if (!storageKey || typeof window === \"undefined\") return undefined;\n\n try {\n const value = window.localStorage.getItem(storageKey);\n return isPropertiesDensity(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredDensity(\n keyRef: string | undefined,\n density: PropertiesDensity,\n): void {\n const storageKey = propertiesDensityStorageKey(keyRef);\n if (!storageKey || typeof window === \"undefined\") return;\n\n try {\n window.localStorage.setItem(storageKey, density);\n } catch {\n // Display preferences are best-effort when browser storage is unavailable.\n }\n}\n\nfunction propertiesDensityStorageKey(\n keyRef: string | undefined,\n): string | undefined {\n const normalized = keyRef?.trim();\n return normalized\n ? `${PROPERTIES_DENSITY_STORAGE_PREFIX}:${normalized}:density`\n : undefined;\n}\n\nfunction isPropertiesDensity(value: unknown): value is PropertiesDensity {\n return value === \"compact\" || value === \"comfortable\" || value === \"spacious\";\n}\n\nfunction ActionList<V>({\n actions,\n item,\n className,\n}: {\n actions: PropertiesAction<V>[] | undefined;\n item: PropertiesItem<V>;\n className?: string;\n}) {\n if (!actions || actions.length === 0) return null;\n const rendered = actions.filter(\n (action) => !action.visible || action.visible(item.key, item.value, item),\n );\n if (rendered.length === 0) return null;\n return (\n <span className={cn(\"inline-flex items-center\", className)}>\n {rendered.map((action) => (\n <PropertiesActionButton key={action.id} action={action} item={item} />\n ))}\n </span>\n );\n}\n\nfunction PropertiesActionButton<V>({\n action,\n item,\n}: {\n action: PropertiesAction<V>;\n item: PropertiesItem<V>;\n}) {\n const label = action.label(item.key, item.value, item);\n const disabled = action.disabled?.(item.key, item.value, item) ?? false;\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n className={cn(\n \"inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground\",\n \"hover:bg-accent hover:text-foreground\",\n \"disabled:opacity-35 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\",\n )}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(item.key, item.value, item);\n }}\n >\n <Icon\n {...(typeof action.icon === \"string\"\n ? { name: action.icon }\n : { icon: action.icon })}\n className=\"text-xs\"\n />\n </button>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Properties.js","names":[],"sources":["../../src/data/Properties.tsx"],"sourcesContent":["import {\n Fragment,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\nimport { IconButton } from \"../components/IconButton\";\nimport {\n UiCheck,\n UiDotsVertical,\n UiListDashes,\n UiListFlat,\n UiRows,\n} from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { formatPropertyLabel } from \"./properties-utils\";\nimport { PropertiesContext } from \"./properties-context\";\nimport { PropertyValue } from \"./PropertyValue\";\n\nexport type PropertiesAction<V = unknown> = {\n /** Stable action id. */\n id: string;\n /** Iconify name or imported icon component. */\n icon: string | StaticIconComponent;\n /** Accessible label and tooltip for this row action. */\n label: (key: string, value: V, item: PropertiesItem<V>) => string;\n /** Return false to hide the action for a specific row. */\n visible?: (key: string, value: V, item: PropertiesItem<V>) => boolean;\n /** Return true to disable the action for a specific row. */\n disabled?: (key: string, value: V, item: PropertiesItem<V>) => boolean;\n /** Called when the row action is clicked. */\n onClick: (key: string, value: V, item: PropertiesItem<V>) => void;\n};\n\nexport type PropertiesItem<V = unknown> = {\n /** Stable property key. Also used as the default label. */\n key: string;\n /** Property value passed to renderers and actions. */\n value: V;\n /** Optional display type; structured values otherwise render as JSON. */\n type?: \"text\" | \"json\" | \"bytes\" | \"duration\" | \"number\" | \"boolean\" | \"date\";\n /** Unit for numeric values, such as ms, s, bytes, or percent. */\n unit?: string;\n /** Secondary text shown below the label. */\n subtitle?: ReactNode;\n /** Hide this row without removing it from the item array. */\n hidden?: boolean;\n /** Enables a child area spanning both columns, with nested labels indented. */\n expandable?: boolean;\n /** Controlled expanded state. */\n expanded?: boolean;\n /** Called when an expandable row is toggled. */\n onToggle?: (next: boolean) => void;\n /** Child content rendered when the row is expanded. */\n renderChildren?: () => ReactNode;\n};\n\nexport type PropertiesDensity = \"comfortable\" | \"compact\" | \"spacious\";\n\nexport type PropertiesProps<V = unknown> = {\n /** Property rows to render. Hidden items are filtered out. */\n items: PropertiesItem<V>[];\n /** Custom label renderer. */\n renderLabel?: (key: string, value: V, item: PropertiesItem<V>) => ReactNode;\n /** Custom value renderer. */\n renderValue?: (key: string, value: V, item: PropertiesItem<V>) => ReactNode;\n /** Static icon name or function that returns an icon name per row. */\n labelIcon?:\n | string\n | ((key: string, value: V, item: PropertiesItem<V>) => string | undefined);\n /** Actions rendered before the value. */\n prefixActions?: PropertiesAction<V>[];\n /** Actions rendered after the value. */\n suffixActions?: PropertiesAction<V>[];\n /** Classes applied to the list root. */\n className?: string;\n /** Classes applied to each row. */\n rowClassName?: string;\n /** CSS grid columns applied to each row. Defaults to the selected density preset. */\n gridTemplateColumns?: string;\n /** Classes applied to each label cell. */\n labelClassName?: string;\n /** Classes applied to each value cell. */\n valueClassName?: string;\n /** Row density preset. */\n density?: PropertiesDensity;\n /** Stable reference used to persist this instance's density preference. */\n keyRef?: string;\n /** Show the display-options menu. */\n showDensityMenu?: boolean;\n /** Empty-state content when no rows are visible. */\n emptyMessage?: ReactNode;\n};\n\nconst PROPERTIES_DENSITY_STORAGE_PREFIX = \"clicky-ui-properties\";\n\nconst PROPERTIES_DENSITY_OPTIONS: Array<{\n value: PropertiesDensity;\n label: string;\n icon: StaticIconComponent;\n}> = [\n { value: \"compact\", label: \"Compact\", icon: UiRows },\n { value: \"comfortable\", label: \"Comfortable\", icon: UiListFlat },\n { value: \"spacious\", label: \"Spacious\", icon: UiListDashes },\n];\n\nconst DENSITY_CLASSES: Record<\n PropertiesDensity,\n { row: string; label: string; value: string; gridTemplateColumns: string }\n> = {\n spacious: {\n row: \"px-density-4 py-density-3\",\n label: \"text-sm font-medium text-muted-foreground\",\n value: \"text-base text-foreground\",\n gridTemplateColumns: \"minmax(min(12rem, 40%), min(20rem, 50%)) minmax(0, 1fr)\",\n },\n comfortable: {\n row: \"px-density-3 py-density-2\",\n label: \"text-xs font-medium text-muted-foreground\",\n value: \"text-sm text-foreground\",\n gridTemplateColumns: \"minmax(min(7rem, 40%), min(12rem, 50%)) minmax(0, 1fr)\",\n },\n compact: {\n row: \"px-density-2 py-density-1.5\",\n label: \"font-mono text-[11px] text-muted-foreground\",\n value: \"text-xs text-foreground\",\n gridTemplateColumns: \"minmax(min(8rem, 40%), min(14rem, 50%)) minmax(0, 1fr)\",\n },\n};\n\nexport function Properties<V = unknown>({\n items,\n renderLabel,\n renderValue,\n labelIcon,\n prefixActions,\n suffixActions,\n className,\n rowClassName,\n gridTemplateColumns,\n labelClassName,\n valueClassName,\n density = \"comfortable\",\n keyRef,\n showDensityMenu = true,\n emptyMessage = \"No properties\",\n}: PropertiesProps<V>) {\n const parent = useContext(PropertiesContext);\n const [densityOverride, setDensityOverride] = useState<PropertiesDensity>();\n useEffect(() => setDensityOverride(readStoredDensity(keyRef)), [keyRef]);\n\n const visible = items.filter((item) => !item.hidden);\n\n if (visible.length === 0) {\n return <div className=\"text-sm text-muted-foreground\">{emptyMessage}</div>;\n }\n\n const activeDensity = parent?.density ?? densityOverride ?? density;\n const styles = DENSITY_CLASSES[activeDensity];\n const columns =\n parent?.columns ?? gridTemplateColumns ?? styles.gridTemplateColumns;\n const depth = parent?.depth ?? 0;\n\n const updateDensity = (next: PropertiesDensity) => {\n setDensityOverride(next);\n writeStoredDensity(keyRef, next);\n };\n\n return (\n <dl\n className={cn(\n \"grid gap-x-density-3 divide-y divide-border rounded-md border border-border bg-muted/20\",\n parent && \"col-span-full rounded-none border-0 bg-transparent\",\n className,\n )}\n style={{ gridTemplateColumns: parent ? \"subgrid\" : columns }}\n >\n {showDensityMenu && !parent ? (\n <div className=\"col-span-full flex items-center justify-end px-density-2 py-density-1\">\n <dt className=\"sr-only\">Properties display options</dt>\n <dd>\n <PropertiesDensityMenu\n density={activeDensity}\n onChange={updateDensity}\n />\n </dd>\n </div>\n ) : null}\n {visible.map((item) => {\n const iconName =\n typeof labelIcon === \"function\"\n ? labelIcon(item.key, item.value, item)\n : labelIcon;\n const renderedLabel = renderLabel\n ? renderLabel(item.key, item.value, item)\n : formatPropertyLabel(item.key);\n const ariaLabel =\n typeof renderedLabel === \"string\" ? renderedLabel : item.key;\n\n return (\n <Fragment key={item.key}>\n <div\n className={cn(\n \"col-span-full grid min-w-0 grid-cols-subgrid gap-density-3\",\n styles.row,\n rowClassName,\n )}\n >\n <dt\n aria-label={ariaLabel}\n className={cn(\"min-w-0 truncate\", styles.label, labelClassName)}\n style={{ paddingInlineStart: depth * 16 }}\n >\n <div className=\"flex min-w-0 items-center gap-density-1\">\n {iconName ? (\n <Icon name={iconName} className=\"text-xs shrink-0\" />\n ) : null}\n <span className=\"min-w-0 truncate\">{renderedLabel}</span>\n </div>\n {item.subtitle ? (\n <div className=\"mt-0.5 text-[10px] font-normal text-muted-foreground/80\">\n {item.subtitle}\n </div>\n ) : null}\n </dt>\n <dd className={cn(\"min-w-0 space-y-density-1\", valueClassName)}>\n <div className=\"flex min-w-0 items-start gap-density-1\">\n <ActionList\n actions={prefixActions}\n item={item}\n className=\"shrink-0 pt-0.5\"\n />\n <div\n className={cn(\"min-w-0 max-w-full flex-1\", styles.value)}\n >\n {renderValue\n ? renderValue(item.key, item.value, item)\n : <PropertyValue item={item} density={activeDensity} />}\n </div>\n <ActionList\n actions={suffixActions}\n item={item}\n className=\"shrink-0 pt-0.5\"\n />\n </div>\n </dd>\n </div>\n {item.expandable && item.expanded && item.renderChildren ? (\n <div className=\"col-span-full grid grid-cols-subgrid\">\n <dt className=\"sr-only\">{ariaLabel} properties</dt>\n <dd className=\"col-span-full grid min-w-0 grid-cols-subgrid\">\n <PropertiesContext.Provider\n value={{\n depth: depth + 1,\n columns,\n density: activeDensity,\n }}\n >\n {item.renderChildren()}\n </PropertiesContext.Provider>\n </dd>\n </div>\n ) : null}\n </Fragment>\n );\n })}\n </dl>\n );\n}\n\nfunction PropertiesDensityMenu({\n density,\n onChange,\n}: {\n density: PropertiesDensity;\n onChange: (density: PropertiesDensity) => void;\n}) {\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Properties options\"\n trigger={\n <IconButton\n icon={UiDotsVertical}\n label=\"Properties options\"\n className=\"h-6 w-6\"\n />\n }\n >\n {(closeMenu) => (\n <div className=\"min-w-44 py-1 text-popover-foreground\">\n <div className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n Density\n </div>\n {PROPERTIES_DENSITY_OPTIONS.map((option) => {\n const active = density === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => {\n onChange(option.value);\n closeMenu();\n }}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction densityMenuItemClassName(active: boolean): string {\n return cn(\n \"flex w-full items-center gap-2 px-2 py-1.5 text-left text-sm\",\n \"hover:bg-accent focus:bg-accent focus:outline-none\",\n active && \"bg-accent/60\",\n );\n}\n\nfunction readStoredDensity(\n keyRef: string | undefined,\n): PropertiesDensity | undefined {\n const storageKey = propertiesDensityStorageKey(keyRef);\n if (!storageKey || typeof window === \"undefined\") return undefined;\n\n try {\n const value = window.localStorage.getItem(storageKey);\n return isPropertiesDensity(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredDensity(\n keyRef: string | undefined,\n density: PropertiesDensity,\n): void {\n const storageKey = propertiesDensityStorageKey(keyRef);\n if (!storageKey || typeof window === \"undefined\") return;\n\n try {\n window.localStorage.setItem(storageKey, density);\n } catch {\n // Display preferences are best-effort when browser storage is unavailable.\n }\n}\n\nfunction propertiesDensityStorageKey(\n keyRef: string | undefined,\n): string | undefined {\n const normalized = keyRef?.trim();\n return normalized\n ? `${PROPERTIES_DENSITY_STORAGE_PREFIX}:${normalized}:density`\n : undefined;\n}\n\nfunction isPropertiesDensity(value: unknown): value is PropertiesDensity {\n return value === \"compact\" || value === \"comfortable\" || value === \"spacious\";\n}\n\nfunction ActionList<V>({\n actions,\n item,\n className,\n}: {\n actions: PropertiesAction<V>[] | undefined;\n item: PropertiesItem<V>;\n className?: string;\n}) {\n if (!actions || actions.length === 0) return null;\n const rendered = actions.filter(\n (action) => !action.visible || action.visible(item.key, item.value, item),\n );\n if (rendered.length === 0) return null;\n return (\n <span className={cn(\"inline-flex items-center\", className)}>\n {rendered.map((action) => (\n <PropertiesActionButton key={action.id} action={action} item={item} />\n ))}\n </span>\n );\n}\n\nfunction PropertiesActionButton<V>({\n action,\n item,\n}: {\n action: PropertiesAction<V>;\n item: PropertiesItem<V>;\n}) {\n const label = action.label(item.key, item.value, item);\n const disabled = action.disabled?.(item.key, item.value, item) ?? false;\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n className={cn(\n \"inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground\",\n \"hover:bg-accent hover:text-foreground\",\n \"disabled:opacity-35 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\",\n )}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(item.key, item.value, item);\n }}\n >\n <Icon\n {...(typeof action.icon === \"string\"\n ? { name: action.icon }\n : { icon: action.icon })}\n className=\"text-xs\"\n />\n </button>\n );\n}\n"],"mappings":"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"}
|
|
@@ -22,12 +22,14 @@ const require_task_copy = require("./task-copy.cjs");
|
|
|
22
22
|
const require_task_work_progress = require("./task-work-progress.cjs");
|
|
23
23
|
const require_TaskExecDetails = require("./TaskExecDetails.cjs");
|
|
24
24
|
const require_TaskProcessDetails = require("./TaskProcessDetails.cjs");
|
|
25
|
+
const require_TaskPrompts = require("./TaskPrompts.cjs");
|
|
25
26
|
let react = require("react");
|
|
26
27
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
27
28
|
// src/data/TaskProgress.tsx
|
|
28
29
|
var MAX_COMPLETED = 5;
|
|
29
30
|
var MAX_PENDING = 3;
|
|
30
|
-
|
|
31
|
+
var DEFAULT_PROMPT_BASE = "/api/todos";
|
|
32
|
+
function TaskProgress({ snapshots, title, compact, initialShowAllTasks, className, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, promptBasePath = DEFAULT_PROMPT_BASE }) {
|
|
31
33
|
const groups = snapshots.filter((s) => s.type === "group");
|
|
32
34
|
const tasks = snapshots.filter((s) => s.type === "task");
|
|
33
35
|
if (groups.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -49,11 +51,12 @@ function TaskProgress({ snapshots, title, compact, initialShowAllTasks, classNam
|
|
|
49
51
|
...metricsBaseUrl ? { metricsBaseUrl } : {},
|
|
50
52
|
...connectionStatus ? { connectionStatus } : {},
|
|
51
53
|
...extraTabs ? { extraTabs } : {},
|
|
52
|
-
...headerExtra ? { headerExtra } : {}
|
|
54
|
+
...headerExtra ? { headerExtra } : {},
|
|
55
|
+
promptBasePath
|
|
53
56
|
}, g.groupId || g.id))]
|
|
54
57
|
});
|
|
55
58
|
}
|
|
56
|
-
function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra }) {
|
|
59
|
+
function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, promptBasePath }) {
|
|
57
60
|
const [showAll, setShowAll] = (0, react.useState)(initialShowAllTasks ?? false);
|
|
58
61
|
const { state: copyState, copy } = require_clipboard.useCopyFlash();
|
|
59
62
|
const work = require_task_work_progress.taskWorkProgress(g);
|
|
@@ -164,12 +167,13 @@ function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onContro
|
|
|
164
167
|
...metricsBaseUrl ? { metricsBaseUrl } : {},
|
|
165
168
|
...connectionStatus ? { connectionStatus } : {},
|
|
166
169
|
...extraTabs ? { extraTabs } : {},
|
|
167
|
-
...headerExtra ? { headerExtra } : {}
|
|
170
|
+
...headerExtra ? { headerExtra } : {},
|
|
171
|
+
promptBasePath
|
|
168
172
|
}, t.id))
|
|
169
173
|
]
|
|
170
174
|
});
|
|
171
175
|
}
|
|
172
|
-
function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs: contributeTabs, headerExtra }) {
|
|
176
|
+
function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs: contributeTabs, headerExtra, promptBasePath }) {
|
|
173
177
|
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
174
178
|
const logs = t.logs ?? [];
|
|
175
179
|
const hasLogs = logs.length > 0;
|
|
@@ -227,7 +231,7 @@ function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, conne
|
|
|
227
231
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_CopyButton.CopyButton, {
|
|
228
232
|
value: () => require_task_copy.taskMarkdown(t),
|
|
229
233
|
label: `Copy ${t.name}`,
|
|
230
|
-
className: "opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100",
|
|
234
|
+
className: "opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 [@media(hover:none)]:opacity-100",
|
|
231
235
|
iconClassName: "text-xs"
|
|
232
236
|
}),
|
|
233
237
|
onTaskControl && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TaskControls, {
|
|
@@ -269,6 +273,10 @@ function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, conne
|
|
|
269
273
|
height: "h-1"
|
|
270
274
|
})
|
|
271
275
|
}),
|
|
276
|
+
t.prompts && t.prompts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TaskPrompts.TaskPrompts, {
|
|
277
|
+
prompts: t.prompts,
|
|
278
|
+
basePath: promptBasePath
|
|
279
|
+
}),
|
|
272
280
|
expanded && execDetails && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TaskExecDetails.TaskExecDetailsView, { details: execDetails }),
|
|
273
281
|
expanded && processDetails && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TaskProcessDetails.TaskProcessDetailsView, {
|
|
274
282
|
details: processDetails,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskProgress.cjs","names":["cn","useState","useCopyFlash","taskWorkProgress","bucketTasks","isFailedOrWarn","UiJson","taskGroupJson","UiWarningTriangle","taskGroupErrorCount","taskGroupErrors","Icon","taskStatusIcon","taskStatusColor","taskStatusBg","SplitButton","UiCheck","UiCopy","taskGroupMarkdown","ProgressBar","taskSegments","isTaskProcessDetails","TaskProcessDetailsView","isTaskExecDetails","TaskExecDetailsView","TaskMetadataChips","logLevelColor","CopyButton","taskMarkdown","TaskStreamTabs","UiPlay","UiStop","UiRestart","UiRefresh","_Fragment","Button"],"sources":["../../src/data/TaskProgress.tsx"],"sourcesContent":["import { taskWorkProgress } from \"./task-work-progress\";\nimport { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { SplitButton } from \"../components/SplitButton\";\nimport { useCopyFlash } from \"../components/clipboard\";\nimport { UiCheck, UiCopy, UiJson, UiPlay, UiRefresh, UiRestart, UiStop, UiWarningTriangle } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"./Icon\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport { TaskProcessDetailsView } from \"./TaskProcessDetails\";\nimport { TaskExecDetailsView } from \"./TaskExecDetails\";\nimport type { LogEntry, TaskControlAction, TaskSnapshot } from \"./TaskSnapshot\";\nimport { type TaskHeaderExtra, TaskMetadataChips } from \"./TaskHeaderExtras\";\nimport { type TaskExtraTabs, TaskStreamTabs } from \"./TaskStreamTabs\";\nimport {\n isFailedOrWarn,\n taskGroupErrorCount,\n taskGroupErrors,\n taskGroupJson,\n taskGroupMarkdown,\n taskMarkdown,\n} from \"./task-copy\";\nimport { isTaskExecDetails } from \"./task-exec-details\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport {\n bucketTasks,\n logLevelColor,\n taskSegments,\n taskStatusBg,\n taskStatusColor,\n taskStatusIcon,\n} from \"./task-status\";\n\n// TaskProgress renders one or more clicky task runs (groups) and their child\n// tasks: a segmented progress bar per group plus collapsible per-task rows with\n// status icon, duration, error, and expandable logs. Presentational only —\n// callers feed it snapshots from useTaskRun (SSE) or any other source.\n\nconst MAX_COMPLETED = 5;\nconst MAX_PENDING = 3;\n\nexport interface TaskProgressProps {\n snapshots: TaskSnapshot[];\n title?: string;\n /** Tighter spacing for embedding in a panel. */\n compact?: boolean;\n /** Show every child task when the group first opens. */\n initialShowAllTasks?: boolean;\n className?: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n /**\n * Contributes host-owned output panes alongside a task's own stdout/stderr —\n * an agent's session transcript, say, which this module has no way to fetch.\n */\n extraTabs?: TaskExtraTabs;\n /**\n * Replaces the content beside a task's name in its header row. Returning null\n * for a task falls back to the default, which chips the scalar values of its\n * process metadata.\n */\n headerExtra?: TaskHeaderExtra;\n}\n\nexport function TaskProgress({\n snapshots,\n title,\n compact,\n initialShowAllTasks,\n className,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n}: TaskProgressProps) {\n const groups = snapshots.filter((s) => s.type === \"group\");\n const tasks = snapshots.filter((s) => s.type === \"task\");\n\n if (groups.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)}>\n {title ? `${title}: ` : \"\"}No tasks yet.\n </div>\n );\n }\n\n return (\n <div className={cn(compact ? \"space-y-2\" : \"space-y-3\", className)}>\n {title && <h2 className=\"text-sm font-semibold\">{title}</h2>}\n {groups.map((g) => (\n <TaskGroupCard\n key={g.groupId || g.id}\n group={g}\n tasks={tasks.filter((t) => g.groupId ? t.groupId === g.groupId : t.group === g.id)}\n compact={compact}\n initialShowAllTasks={initialShowAllTasks}\n {...(onControl ? { onControl } : {})}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskGroupCard({\n group: g,\n tasks,\n compact,\n initialShowAllTasks,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n}: {\n group: TaskSnapshot;\n tasks: TaskSnapshot[];\n compact: boolean | undefined;\n initialShowAllTasks: boolean | undefined;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n}) {\n const [showAll, setShowAll] = useState(initialShowAllTasks ?? false);\n const { state: copyState, copy } = useCopyFlash();\n const work = taskWorkProgress(g);\n const total = g.work ? work.total : g.total ?? tasks.length;\n const counts = g.work ? work.counts : bucketTasks(tasks);\n const done = counts.ok + counts.warn + counts.fail + counts.canceled;\n const progress = g.work ? work.label : total > 0 ? `${done}/${total}` : \"\";\n\n const running = tasks.filter((t) => t.status === \"running\");\n const pending = tasks.filter((t) => t.status === \"pending\");\n const completed = tasks.filter((t) => t.status !== \"running\" && t.status !== \"pending\");\n const alwaysShow = completed.filter(isFailedOrWarn);\n const collapsible = completed.filter((t) => !isFailedOrWarn(t));\n\n const hiddenCompleted = collapsible.length - MAX_COMPLETED;\n const collapseCompleted = !showAll && hiddenCompleted > 0;\n const visibleSuccess = collapseCompleted ? collapsible.slice(-MAX_COMPLETED) : collapsible;\n\n const hiddenPending = pending.length - MAX_PENDING;\n const collapsePending = !showAll && hiddenPending > 0;\n const visiblePending = collapsePending ? pending.slice(0, MAX_PENDING) : pending;\n\n const isTerminal = g.status !== \"running\" && g.status !== \"pending\";\n\n const copyItems: DropdownMenuItem[] = [\n {\n label: \"Copy as JSON\",\n icon: UiJson,\n onSelect: () => copy(taskGroupJson(g, tasks)),\n },\n {\n label: \"Copy errors only\",\n icon: UiWarningTriangle,\n disabled: taskGroupErrorCount(tasks) === 0,\n onSelect: () => copy(taskGroupErrors(g, tasks)),\n },\n ];\n\n return (\n <div className={cn(\"rounded-lg border bg-card\", compact ? \"p-2\" : \"p-4\")}>\n <div className={cn(\"flex items-center justify-between gap-3\", compact ? \"mb-2\" : \"mb-3\")}>\n <h3 className=\"flex min-w-0 items-center gap-1.5 text-sm font-semibold\">\n <Icon\n icon={taskStatusIcon(g.status)}\n className={cn(\n \"shrink-0\",\n taskStatusColor(g.status),\n g.status === \"running\" && \"animate-spin\",\n )}\n />\n <span className=\"truncate\">{g.name}</span>\n {progress && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{progress}</span>\n )}\n {g.kind && (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0 text-[10px] text-muted-foreground\">\n {g.kind}\n </span>\n )}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isTerminal && (\n <span\n className={cn(\n \"rounded-full px-2 py-0.5 text-xs\",\n taskStatusColor(g.status),\n taskStatusBg(g.status),\n )}\n >\n {g.status}\n </span>\n )}\n <SplitButton\n label={copyState === \"copied\" ? \"Copied\" : copyState === \"error\" ? \"Copy failed\" : \"Copy\"}\n icon={copyState === \"copied\" ? UiCheck : UiCopy}\n variant=\"ghost\"\n size=\"sm\"\n title=\"More copy options\"\n onClick={() => copy(taskGroupMarkdown(g, tasks))}\n items={copyItems}\n />\n {onControl && <TaskControls target={g} onControl={onControl} />}\n </div>\n </div>\n\n {total > 0 && (\n <div className={compact ? \"mb-2\" : \"mb-3\"}>\n <ProgressBar segments={taskSegments(counts)} total={total} height=\"h-1.5\" />\n </div>\n )}\n\n {isTaskProcessDetails(g.details) && (\n <TaskProcessDetailsView\n details={g.details}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n\n {!isTaskProcessDetails(g.details) && isTaskExecDetails(g.details) && (\n <TaskExecDetailsView details={g.details} />\n )}\n\n {hiddenCompleted > 0 || hiddenPending > 0 ? (\n <button\n type=\"button\"\n className={cn(\"border-b text-xs text-muted-foreground hover:text-foreground\", compact ? \"py-1\" : \"py-1.5\")}\n onClick={() => setShowAll((v) => !v)}\n >\n {showAll\n ? \"▲ collapse\"\n : `... ${(collapseCompleted ? hiddenCompleted : 0) + (collapsePending ? hiddenPending : 0)} more tasks`}\n </button>\n ) : null}\n\n {[...visibleSuccess, ...alwaysShow, ...running, ...visiblePending].map((t) => (\n <TaskRow\n key={t.id}\n task={t}\n group={g}\n compact={compact}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskRow({\n task: t,\n group,\n compact,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs: contributeTabs,\n headerExtra,\n}: {\n task: TaskSnapshot;\n group: TaskSnapshot;\n compact: boolean | undefined;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(false);\n const logs: LogEntry[] = t.logs ?? [];\n const hasLogs = logs.length > 0;\n const extraTabs = contributeTabs?.(t, group) ?? [];\n // A host that has nothing to add for this task returns null, and the default\n // metadata chips take over — so enriching one kind of task never costs the\n // rest their header.\n const header = headerExtra?.(t, group) ?? <TaskMetadataChips task={t} />;\n const hasOutput = !!t.stdout || !!t.stderr || extraTabs.length > 0;\n const execDetails = isTaskExecDetails(t.details) ? t.details : undefined;\n const processDetails = isTaskProcessDetails(t.details) ? t.details : undefined;\n const expandable = hasLogs || hasOutput || execDetails !== undefined || processDetails !== undefined;\n // Promote the latest warning message inline so a `warning` row shows its\n // reason without expanding. Suppressed when an error is already shown.\n const latestWarn = t.error ? undefined : logs.filter((l) => l.level === \"warn\").at(-1);\n // Bounded per-task progress (e.g. records emitted in a phase): render an x/y\n // count, a percentage, and a thin bar while the task runs.\n const done = t.progress ?? 0;\n // Only surface bounded progress once work has actually started — an untouched\n // task should not render a \"0/100 · 0%\" placeholder.\n const hasProgress = typeof t.maxValue === \"number\" && t.maxValue > 0 && done > 0;\n const pct = hasProgress ? Math.round((done / (t.maxValue as number)) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"group flex items-start border-b last:border-0\",\n compact ? \"gap-2 py-1\" : \"gap-3 py-2\",\n expandable && \"-mx-1 cursor-pointer rounded px-1 hover:bg-muted/50\",\n )}\n onClick={expandable ? () => setExpanded((v) => !v) : undefined}\n >\n <Icon\n icon={taskStatusIcon(t.status)}\n className={cn(taskStatusColor(t.status), \"mt-0.5\", compact ? \"text-base\" : \"text-lg\", t.status === \"running\" && \"animate-spin\")}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm font-medium\">\n <span className=\"truncate\">{t.name}</span>\n {t.error && <span className=\"truncate text-xs font-normal text-red-500\">{t.error}</span>}\n {latestWarn && (\n <span className={cn(\"truncate text-xs font-normal\", logLevelColor(\"warn\"))}>\n {latestWarn.message}\n </span>\n )}\n {expandable && (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {logs.length + (t.stdout ? 1 : 0) + (t.stderr ? 1 : 0) + (execDetails || processDetails ? 1 : 0)}\n </span>\n )}\n </span>\n {header}\n <div className=\"flex shrink-0 items-center gap-1\">\n {t.duration && <span className=\"text-xs text-muted-foreground\">{t.duration}</span>}\n <CopyButton\n value={() => taskMarkdown(t)}\n label={`Copy ${t.name}`}\n className=\"opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100\"\n iconClassName=\"text-xs\"\n />\n {onTaskControl && (\n <TaskControls\n target={t}\n labelSuffix={t.name}\n stopPropagation\n onControl={(action) => onTaskControl(action, t, group)}\n />\n )}\n </div>\n </div>\n {(t.description || hasProgress) && (\n <div className=\"mt-0.5 flex items-center gap-2\">\n {t.description && (\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{t.description}</span>\n )}\n {hasProgress && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {done}/{t.maxValue} · {pct}%\n </span>\n )}\n </div>\n )}\n {hasProgress && t.status === \"running\" && (\n <div className=\"mt-1\">\n <ProgressBar\n segments={[{ count: done, color: \"bg-blue-500\", label: \"done\" }]}\n total={t.maxValue as number}\n height=\"h-1\"\n />\n </div>\n )}\n {expanded && execDetails && <TaskExecDetailsView details={execDetails} />}\n {expanded && processDetails && (\n <TaskProcessDetailsView\n details={processDetails}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n {expanded && hasLogs && (\n <div className=\"mt-1 ml-1 max-h-48 space-y-0.5 overflow-y-auto border-l-2 pl-2\">\n {logs.map((l, i) => (\n <div key={i} className={cn(\"text-xs\", logLevelColor(l.level))}>\n <span className=\"mr-1 font-mono text-muted-foreground\">{l.level.substring(0, 3)}</span>\n {l.message}\n </div>\n ))}\n </div>\n )}\n {expanded && <TaskStreamTabs task={t} {...(extraTabs.length > 0 ? { extraTabs } : {})} />}\n </div>\n </div>\n );\n}\n\nfunction TaskControls({\n target,\n onControl,\n labelSuffix,\n stopPropagation,\n}: {\n target: TaskSnapshot;\n onControl: (action: TaskControlAction, target: TaskSnapshot) => void | Promise<void>;\n labelSuffix?: string;\n stopPropagation?: boolean;\n}) {\n const [busy, setBusy] = useState<TaskControlAction | null>(null);\n const [error, setError] = useState(\"\");\n const icons: Record<TaskControlAction, typeof UiPlay> = {\n start: UiPlay,\n stop: UiStop,\n restart: UiRestart,\n drain: UiStop,\n retry: UiRefresh,\n };\n const invoke = async (action: TaskControlAction) => {\n setBusy(action);\n setError(\"\");\n try {\n await onControl(action, target);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : `Failed to ${action} task`);\n } finally {\n setBusy(null);\n }\n };\n return (\n <>\n {(target.controls ?? []).map((action) => {\n const ControlIcon = icons[action];\n const actionLabel = action === \"drain\" ? \"Stop after current\" : action[0]?.toUpperCase() + action.slice(1);\n const label = labelSuffix ? `${actionLabel} ${labelSuffix}` : actionLabel;\n return (\n <Button\n key={action}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n title={label}\n disabled={busy !== null}\n onClick={(event) => {\n if (stopPropagation) event.stopPropagation();\n void invoke(action);\n }}\n >\n <ControlIcon />\n </Button>\n );\n })}\n {error && <span role=\"alert\" className=\"text-xs text-red-600\">{error}</span>}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TaskProgress.cjs","names":["cn","useState","useCopyFlash","taskWorkProgress","bucketTasks","isFailedOrWarn","UiJson","taskGroupJson","UiWarningTriangle","taskGroupErrorCount","taskGroupErrors","Icon","taskStatusIcon","taskStatusColor","taskStatusBg","SplitButton","UiCheck","UiCopy","taskGroupMarkdown","ProgressBar","taskSegments","isTaskProcessDetails","TaskProcessDetailsView","isTaskExecDetails","TaskExecDetailsView","TaskMetadataChips","logLevelColor","CopyButton","taskMarkdown","TaskPrompts","TaskStreamTabs","UiPlay","UiStop","UiRestart","UiRefresh","_Fragment","Button"],"sources":["../../src/data/TaskProgress.tsx"],"sourcesContent":["import { taskWorkProgress } from \"./task-work-progress\";\nimport { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { SplitButton } from \"../components/SplitButton\";\nimport { useCopyFlash } from \"../components/clipboard\";\nimport { UiCheck, UiCopy, UiJson, UiPlay, UiRefresh, UiRestart, UiStop, UiWarningTriangle } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"./Icon\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport { TaskProcessDetailsView } from \"./TaskProcessDetails\";\nimport { TaskExecDetailsView } from \"./TaskExecDetails\";\nimport { TaskPrompts } from \"./TaskPrompts\";\nimport type { LogEntry, TaskControlAction, TaskSnapshot } from \"./TaskSnapshot\";\nimport { type TaskHeaderExtra, TaskMetadataChips } from \"./TaskHeaderExtras\";\nimport { type TaskExtraTabs, TaskStreamTabs } from \"./TaskStreamTabs\";\nimport {\n isFailedOrWarn,\n taskGroupErrorCount,\n taskGroupErrors,\n taskGroupJson,\n taskGroupMarkdown,\n taskMarkdown,\n} from \"./task-copy\";\nimport { isTaskExecDetails } from \"./task-exec-details\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport {\n bucketTasks,\n logLevelColor,\n taskSegments,\n taskStatusBg,\n taskStatusColor,\n taskStatusIcon,\n} from \"./task-status\";\n\n// TaskProgress renders one or more clicky task runs (groups) and their child\n// tasks: a segmented progress bar per group plus collapsible per-task rows with\n// status icon, duration, error, and expandable logs. Presentational only —\n// callers feed it snapshots from useTaskRun (SSE) or any other source.\n\nconst MAX_COMPLETED = 5;\nconst MAX_PENDING = 3;\nconst DEFAULT_PROMPT_BASE = \"/api/todos\";\n\nexport interface TaskProgressProps {\n snapshots: TaskSnapshot[];\n title?: string;\n /** Tighter spacing for embedding in a panel. */\n compact?: boolean;\n /** Show every child task when the group first opens. */\n initialShowAllTasks?: boolean;\n className?: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n /**\n * Contributes host-owned output panes alongside a task's own stdout/stderr —\n * an agent's session transcript, say, which this module has no way to fetch.\n */\n extraTabs?: TaskExtraTabs;\n /**\n * Replaces the content beside a task's name in its header row. Returning null\n * for a task falls back to the default, which chips the scalar values of its\n * process metadata.\n */\n headerExtra?: TaskHeaderExtra;\n /** Base path the prompt API is mounted under; a task's pending prompts are answered there. */\n promptBasePath?: string;\n}\n\nexport function TaskProgress({\n snapshots,\n title,\n compact,\n initialShowAllTasks,\n className,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n promptBasePath = DEFAULT_PROMPT_BASE,\n}: TaskProgressProps) {\n const groups = snapshots.filter((s) => s.type === \"group\");\n const tasks = snapshots.filter((s) => s.type === \"task\");\n\n if (groups.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)}>\n {title ? `${title}: ` : \"\"}No tasks yet.\n </div>\n );\n }\n\n return (\n <div className={cn(compact ? \"space-y-2\" : \"space-y-3\", className)}>\n {title && <h2 className=\"text-sm font-semibold\">{title}</h2>}\n {groups.map((g) => (\n <TaskGroupCard\n key={g.groupId || g.id}\n group={g}\n tasks={tasks.filter((t) => g.groupId ? t.groupId === g.groupId : t.group === g.id)}\n compact={compact}\n initialShowAllTasks={initialShowAllTasks}\n {...(onControl ? { onControl } : {})}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n promptBasePath={promptBasePath}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskGroupCard({\n group: g,\n tasks,\n compact,\n initialShowAllTasks,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n promptBasePath,\n}: {\n group: TaskSnapshot;\n tasks: TaskSnapshot[];\n compact: boolean | undefined;\n initialShowAllTasks: boolean | undefined;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n promptBasePath: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n}) {\n const [showAll, setShowAll] = useState(initialShowAllTasks ?? false);\n const { state: copyState, copy } = useCopyFlash();\n const work = taskWorkProgress(g);\n const total = g.work ? work.total : g.total ?? tasks.length;\n const counts = g.work ? work.counts : bucketTasks(tasks);\n const done = counts.ok + counts.warn + counts.fail + counts.canceled;\n const progress = g.work ? work.label : total > 0 ? `${done}/${total}` : \"\";\n\n const running = tasks.filter((t) => t.status === \"running\");\n const pending = tasks.filter((t) => t.status === \"pending\");\n const completed = tasks.filter((t) => t.status !== \"running\" && t.status !== \"pending\");\n const alwaysShow = completed.filter(isFailedOrWarn);\n const collapsible = completed.filter((t) => !isFailedOrWarn(t));\n\n const hiddenCompleted = collapsible.length - MAX_COMPLETED;\n const collapseCompleted = !showAll && hiddenCompleted > 0;\n const visibleSuccess = collapseCompleted ? collapsible.slice(-MAX_COMPLETED) : collapsible;\n\n const hiddenPending = pending.length - MAX_PENDING;\n const collapsePending = !showAll && hiddenPending > 0;\n const visiblePending = collapsePending ? pending.slice(0, MAX_PENDING) : pending;\n\n const isTerminal = g.status !== \"running\" && g.status !== \"pending\";\n\n const copyItems: DropdownMenuItem[] = [\n {\n label: \"Copy as JSON\",\n icon: UiJson,\n onSelect: () => copy(taskGroupJson(g, tasks)),\n },\n {\n label: \"Copy errors only\",\n icon: UiWarningTriangle,\n disabled: taskGroupErrorCount(tasks) === 0,\n onSelect: () => copy(taskGroupErrors(g, tasks)),\n },\n ];\n\n return (\n <div className={cn(\"rounded-lg border bg-card\", compact ? \"p-2\" : \"p-4\")}>\n <div className={cn(\"flex items-center justify-between gap-3\", compact ? \"mb-2\" : \"mb-3\")}>\n <h3 className=\"flex min-w-0 items-center gap-1.5 text-sm font-semibold\">\n <Icon\n icon={taskStatusIcon(g.status)}\n className={cn(\n \"shrink-0\",\n taskStatusColor(g.status),\n g.status === \"running\" && \"animate-spin\",\n )}\n />\n <span className=\"truncate\">{g.name}</span>\n {progress && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{progress}</span>\n )}\n {g.kind && (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0 text-[10px] text-muted-foreground\">\n {g.kind}\n </span>\n )}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isTerminal && (\n <span\n className={cn(\n \"rounded-full px-2 py-0.5 text-xs\",\n taskStatusColor(g.status),\n taskStatusBg(g.status),\n )}\n >\n {g.status}\n </span>\n )}\n <SplitButton\n label={copyState === \"copied\" ? \"Copied\" : copyState === \"error\" ? \"Copy failed\" : \"Copy\"}\n icon={copyState === \"copied\" ? UiCheck : UiCopy}\n variant=\"ghost\"\n size=\"sm\"\n title=\"More copy options\"\n onClick={() => copy(taskGroupMarkdown(g, tasks))}\n items={copyItems}\n />\n {onControl && <TaskControls target={g} onControl={onControl} />}\n </div>\n </div>\n\n {total > 0 && (\n <div className={compact ? \"mb-2\" : \"mb-3\"}>\n <ProgressBar segments={taskSegments(counts)} total={total} height=\"h-1.5\" />\n </div>\n )}\n\n {isTaskProcessDetails(g.details) && (\n <TaskProcessDetailsView\n details={g.details}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n\n {!isTaskProcessDetails(g.details) && isTaskExecDetails(g.details) && (\n <TaskExecDetailsView details={g.details} />\n )}\n\n {hiddenCompleted > 0 || hiddenPending > 0 ? (\n <button\n type=\"button\"\n className={cn(\"border-b text-xs text-muted-foreground hover:text-foreground\", compact ? \"py-1\" : \"py-1.5\")}\n onClick={() => setShowAll((v) => !v)}\n >\n {showAll\n ? \"▲ collapse\"\n : `... ${(collapseCompleted ? hiddenCompleted : 0) + (collapsePending ? hiddenPending : 0)} more tasks`}\n </button>\n ) : null}\n\n {[...visibleSuccess, ...alwaysShow, ...running, ...visiblePending].map((t) => (\n <TaskRow\n key={t.id}\n task={t}\n group={g}\n compact={compact}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n promptBasePath={promptBasePath}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskRow({\n task: t,\n group,\n compact,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs: contributeTabs,\n headerExtra,\n promptBasePath,\n}: {\n task: TaskSnapshot;\n group: TaskSnapshot;\n compact: boolean | undefined;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n promptBasePath: string;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(false);\n const logs: LogEntry[] = t.logs ?? [];\n const hasLogs = logs.length > 0;\n const extraTabs = contributeTabs?.(t, group) ?? [];\n // A host that has nothing to add for this task returns null, and the default\n // metadata chips take over — so enriching one kind of task never costs the\n // rest their header.\n const header = headerExtra?.(t, group) ?? <TaskMetadataChips task={t} />;\n const hasOutput = !!t.stdout || !!t.stderr || extraTabs.length > 0;\n const execDetails = isTaskExecDetails(t.details) ? t.details : undefined;\n const processDetails = isTaskProcessDetails(t.details) ? t.details : undefined;\n const expandable = hasLogs || hasOutput || execDetails !== undefined || processDetails !== undefined;\n // Promote the latest warning message inline so a `warning` row shows its\n // reason without expanding. Suppressed when an error is already shown.\n const latestWarn = t.error ? undefined : logs.filter((l) => l.level === \"warn\").at(-1);\n // Bounded per-task progress (e.g. records emitted in a phase): render an x/y\n // count, a percentage, and a thin bar while the task runs.\n const done = t.progress ?? 0;\n // Only surface bounded progress once work has actually started — an untouched\n // task should not render a \"0/100 · 0%\" placeholder.\n const hasProgress = typeof t.maxValue === \"number\" && t.maxValue > 0 && done > 0;\n const pct = hasProgress ? Math.round((done / (t.maxValue as number)) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"group flex items-start border-b last:border-0\",\n compact ? \"gap-2 py-1\" : \"gap-3 py-2\",\n expandable && \"-mx-1 cursor-pointer rounded px-1 hover:bg-muted/50\",\n )}\n onClick={expandable ? () => setExpanded((v) => !v) : undefined}\n >\n <Icon\n icon={taskStatusIcon(t.status)}\n className={cn(taskStatusColor(t.status), \"mt-0.5\", compact ? \"text-base\" : \"text-lg\", t.status === \"running\" && \"animate-spin\")}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm font-medium\">\n <span className=\"truncate\">{t.name}</span>\n {t.error && <span className=\"truncate text-xs font-normal text-red-500\">{t.error}</span>}\n {latestWarn && (\n <span className={cn(\"truncate text-xs font-normal\", logLevelColor(\"warn\"))}>\n {latestWarn.message}\n </span>\n )}\n {expandable && (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {logs.length + (t.stdout ? 1 : 0) + (t.stderr ? 1 : 0) + (execDetails || processDetails ? 1 : 0)}\n </span>\n )}\n </span>\n {header}\n <div className=\"flex shrink-0 items-center gap-1\">\n {t.duration && <span className=\"text-xs text-muted-foreground\">{t.duration}</span>}\n <CopyButton\n value={() => taskMarkdown(t)}\n label={`Copy ${t.name}`}\n className=\"opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 [@media(hover:none)]:opacity-100\"\n iconClassName=\"text-xs\"\n />\n {onTaskControl && (\n <TaskControls\n target={t}\n labelSuffix={t.name}\n stopPropagation\n onControl={(action) => onTaskControl(action, t, group)}\n />\n )}\n </div>\n </div>\n {(t.description || hasProgress) && (\n <div className=\"mt-0.5 flex items-center gap-2\">\n {t.description && (\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{t.description}</span>\n )}\n {hasProgress && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {done}/{t.maxValue} · {pct}%\n </span>\n )}\n </div>\n )}\n {hasProgress && t.status === \"running\" && (\n <div className=\"mt-1\">\n <ProgressBar\n segments={[{ count: done, color: \"bg-blue-500\", label: \"done\" }]}\n total={t.maxValue as number}\n height=\"h-1\"\n />\n </div>\n )}\n {t.prompts && t.prompts.length > 0 && <TaskPrompts prompts={t.prompts} basePath={promptBasePath} />}\n {expanded && execDetails && <TaskExecDetailsView details={execDetails} />}\n {expanded && processDetails && (\n <TaskProcessDetailsView\n details={processDetails}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n {expanded && hasLogs && (\n <div className=\"mt-1 ml-1 max-h-48 space-y-0.5 overflow-y-auto border-l-2 pl-2\">\n {logs.map((l, i) => (\n <div key={i} className={cn(\"text-xs\", logLevelColor(l.level))}>\n <span className=\"mr-1 font-mono text-muted-foreground\">{l.level.substring(0, 3)}</span>\n {l.message}\n </div>\n ))}\n </div>\n )}\n {expanded && <TaskStreamTabs task={t} {...(extraTabs.length > 0 ? { extraTabs } : {})} />}\n </div>\n </div>\n );\n}\n\nfunction TaskControls({\n target,\n onControl,\n labelSuffix,\n stopPropagation,\n}: {\n target: TaskSnapshot;\n onControl: (action: TaskControlAction, target: TaskSnapshot) => void | Promise<void>;\n labelSuffix?: string;\n stopPropagation?: boolean;\n}) {\n const [busy, setBusy] = useState<TaskControlAction | null>(null);\n const [error, setError] = useState(\"\");\n const icons: Record<TaskControlAction, typeof UiPlay> = {\n start: UiPlay,\n stop: UiStop,\n restart: UiRestart,\n drain: UiStop,\n retry: UiRefresh,\n };\n const invoke = async (action: TaskControlAction) => {\n setBusy(action);\n setError(\"\");\n try {\n await onControl(action, target);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : `Failed to ${action} task`);\n } finally {\n setBusy(null);\n }\n };\n return (\n <>\n {(target.controls ?? []).map((action) => {\n const ControlIcon = icons[action];\n const actionLabel = action === \"drain\" ? \"Stop after current\" : action[0]?.toUpperCase() + action.slice(1);\n const label = labelSuffix ? `${actionLabel} ${labelSuffix}` : actionLabel;\n return (\n <Button\n key={action}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n title={label}\n disabled={busy !== null}\n onClick={(event) => {\n if (stopPropagation) event.stopPropagation();\n void invoke(action);\n }}\n >\n <ControlIcon />\n </Button>\n );\n })}\n {error && <span role=\"alert\" className=\"text-xs text-red-600\">{error}</span>}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -24,6 +24,8 @@ export interface TaskProgressProps {
|
|
|
24
24
|
* process metadata.
|
|
25
25
|
*/
|
|
26
26
|
headerExtra?: TaskHeaderExtra;
|
|
27
|
+
/** Base path the prompt API is mounted under; a task's pending prompts are answered there. */
|
|
28
|
+
promptBasePath?: string;
|
|
27
29
|
}
|
|
28
|
-
export declare function TaskProgress({ snapshots, title, compact, initialShowAllTasks, className, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, }: TaskProgressProps): import("react").JSX.Element;
|
|
30
|
+
export declare function TaskProgress({ snapshots, title, compact, initialShowAllTasks, className, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, promptBasePath, }: TaskProgressProps): import("react").JSX.Element;
|
|
29
31
|
//# sourceMappingURL=TaskProgress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskProgress.d.ts","sourceRoot":"","sources":["../../src/data/TaskProgress.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TaskProgress.d.ts","sourceRoot":"","sources":["../../src/data/TaskProgress.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAY,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,KAAK,eAAe,EAAqB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AA6BtE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,YAAY,KAChB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,OAAO,EACP,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,cAAoC,GACrC,EAAE,iBAAiB,+BAiCnB"}
|
|
@@ -22,12 +22,14 @@ import { isFailedOrWarn, taskGroupErrorCount, taskGroupErrors, taskGroupJson, ta
|
|
|
22
22
|
import { taskWorkProgress } from "./task-work-progress.js";
|
|
23
23
|
import { TaskExecDetailsView } from "./TaskExecDetails.js";
|
|
24
24
|
import { TaskProcessDetailsView } from "./TaskProcessDetails.js";
|
|
25
|
+
import { TaskPrompts } from "./TaskPrompts.js";
|
|
25
26
|
import { useState } from "react";
|
|
26
27
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
27
28
|
// src/data/TaskProgress.tsx
|
|
28
29
|
var MAX_COMPLETED = 5;
|
|
29
30
|
var MAX_PENDING = 3;
|
|
30
|
-
|
|
31
|
+
var DEFAULT_PROMPT_BASE = "/api/todos";
|
|
32
|
+
function TaskProgress({ snapshots, title, compact, initialShowAllTasks, className, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, promptBasePath = DEFAULT_PROMPT_BASE }) {
|
|
31
33
|
const groups = snapshots.filter((s) => s.type === "group");
|
|
32
34
|
const tasks = snapshots.filter((s) => s.type === "task");
|
|
33
35
|
if (groups.length === 0) return /* @__PURE__ */ jsxs("div", {
|
|
@@ -49,11 +51,12 @@ function TaskProgress({ snapshots, title, compact, initialShowAllTasks, classNam
|
|
|
49
51
|
...metricsBaseUrl ? { metricsBaseUrl } : {},
|
|
50
52
|
...connectionStatus ? { connectionStatus } : {},
|
|
51
53
|
...extraTabs ? { extraTabs } : {},
|
|
52
|
-
...headerExtra ? { headerExtra } : {}
|
|
54
|
+
...headerExtra ? { headerExtra } : {},
|
|
55
|
+
promptBasePath
|
|
53
56
|
}, g.groupId || g.id))]
|
|
54
57
|
});
|
|
55
58
|
}
|
|
56
|
-
function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra }) {
|
|
59
|
+
function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onControl, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs, headerExtra, promptBasePath }) {
|
|
57
60
|
const [showAll, setShowAll] = useState(initialShowAllTasks ?? false);
|
|
58
61
|
const { state: copyState, copy } = useCopyFlash();
|
|
59
62
|
const work = taskWorkProgress(g);
|
|
@@ -164,12 +167,13 @@ function TaskGroupCard({ group: g, tasks, compact, initialShowAllTasks, onContro
|
|
|
164
167
|
...metricsBaseUrl ? { metricsBaseUrl } : {},
|
|
165
168
|
...connectionStatus ? { connectionStatus } : {},
|
|
166
169
|
...extraTabs ? { extraTabs } : {},
|
|
167
|
-
...headerExtra ? { headerExtra } : {}
|
|
170
|
+
...headerExtra ? { headerExtra } : {},
|
|
171
|
+
promptBasePath
|
|
168
172
|
}, t.id))
|
|
169
173
|
]
|
|
170
174
|
});
|
|
171
175
|
}
|
|
172
|
-
function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs: contributeTabs, headerExtra }) {
|
|
176
|
+
function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, connectionStatus, extraTabs: contributeTabs, headerExtra, promptBasePath }) {
|
|
173
177
|
const [expanded, setExpanded] = useState(false);
|
|
174
178
|
const logs = t.logs ?? [];
|
|
175
179
|
const hasLogs = logs.length > 0;
|
|
@@ -227,7 +231,7 @@ function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, conne
|
|
|
227
231
|
/* @__PURE__ */ jsx(CopyButton, {
|
|
228
232
|
value: () => taskMarkdown(t),
|
|
229
233
|
label: `Copy ${t.name}`,
|
|
230
|
-
className: "opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100",
|
|
234
|
+
className: "opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 [@media(hover:none)]:opacity-100",
|
|
231
235
|
iconClassName: "text-xs"
|
|
232
236
|
}),
|
|
233
237
|
onTaskControl && /* @__PURE__ */ jsx(TaskControls, {
|
|
@@ -269,6 +273,10 @@ function TaskRow({ task: t, group, compact, onTaskControl, metricsBaseUrl, conne
|
|
|
269
273
|
height: "h-1"
|
|
270
274
|
})
|
|
271
275
|
}),
|
|
276
|
+
t.prompts && t.prompts.length > 0 && /* @__PURE__ */ jsx(TaskPrompts, {
|
|
277
|
+
prompts: t.prompts,
|
|
278
|
+
basePath: promptBasePath
|
|
279
|
+
}),
|
|
272
280
|
expanded && execDetails && /* @__PURE__ */ jsx(TaskExecDetailsView, { details: execDetails }),
|
|
273
281
|
expanded && processDetails && /* @__PURE__ */ jsx(TaskProcessDetailsView, {
|
|
274
282
|
details: processDetails,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskProgress.js","names":["_Fragment"],"sources":["../../src/data/TaskProgress.tsx"],"sourcesContent":["import { taskWorkProgress } from \"./task-work-progress\";\nimport { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { SplitButton } from \"../components/SplitButton\";\nimport { useCopyFlash } from \"../components/clipboard\";\nimport { UiCheck, UiCopy, UiJson, UiPlay, UiRefresh, UiRestart, UiStop, UiWarningTriangle } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"./Icon\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport { TaskProcessDetailsView } from \"./TaskProcessDetails\";\nimport { TaskExecDetailsView } from \"./TaskExecDetails\";\nimport type { LogEntry, TaskControlAction, TaskSnapshot } from \"./TaskSnapshot\";\nimport { type TaskHeaderExtra, TaskMetadataChips } from \"./TaskHeaderExtras\";\nimport { type TaskExtraTabs, TaskStreamTabs } from \"./TaskStreamTabs\";\nimport {\n isFailedOrWarn,\n taskGroupErrorCount,\n taskGroupErrors,\n taskGroupJson,\n taskGroupMarkdown,\n taskMarkdown,\n} from \"./task-copy\";\nimport { isTaskExecDetails } from \"./task-exec-details\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport {\n bucketTasks,\n logLevelColor,\n taskSegments,\n taskStatusBg,\n taskStatusColor,\n taskStatusIcon,\n} from \"./task-status\";\n\n// TaskProgress renders one or more clicky task runs (groups) and their child\n// tasks: a segmented progress bar per group plus collapsible per-task rows with\n// status icon, duration, error, and expandable logs. Presentational only —\n// callers feed it snapshots from useTaskRun (SSE) or any other source.\n\nconst MAX_COMPLETED = 5;\nconst MAX_PENDING = 3;\n\nexport interface TaskProgressProps {\n snapshots: TaskSnapshot[];\n title?: string;\n /** Tighter spacing for embedding in a panel. */\n compact?: boolean;\n /** Show every child task when the group first opens. */\n initialShowAllTasks?: boolean;\n className?: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n /**\n * Contributes host-owned output panes alongside a task's own stdout/stderr —\n * an agent's session transcript, say, which this module has no way to fetch.\n */\n extraTabs?: TaskExtraTabs;\n /**\n * Replaces the content beside a task's name in its header row. Returning null\n * for a task falls back to the default, which chips the scalar values of its\n * process metadata.\n */\n headerExtra?: TaskHeaderExtra;\n}\n\nexport function TaskProgress({\n snapshots,\n title,\n compact,\n initialShowAllTasks,\n className,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n}: TaskProgressProps) {\n const groups = snapshots.filter((s) => s.type === \"group\");\n const tasks = snapshots.filter((s) => s.type === \"task\");\n\n if (groups.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)}>\n {title ? `${title}: ` : \"\"}No tasks yet.\n </div>\n );\n }\n\n return (\n <div className={cn(compact ? \"space-y-2\" : \"space-y-3\", className)}>\n {title && <h2 className=\"text-sm font-semibold\">{title}</h2>}\n {groups.map((g) => (\n <TaskGroupCard\n key={g.groupId || g.id}\n group={g}\n tasks={tasks.filter((t) => g.groupId ? t.groupId === g.groupId : t.group === g.id)}\n compact={compact}\n initialShowAllTasks={initialShowAllTasks}\n {...(onControl ? { onControl } : {})}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskGroupCard({\n group: g,\n tasks,\n compact,\n initialShowAllTasks,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n}: {\n group: TaskSnapshot;\n tasks: TaskSnapshot[];\n compact: boolean | undefined;\n initialShowAllTasks: boolean | undefined;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n}) {\n const [showAll, setShowAll] = useState(initialShowAllTasks ?? false);\n const { state: copyState, copy } = useCopyFlash();\n const work = taskWorkProgress(g);\n const total = g.work ? work.total : g.total ?? tasks.length;\n const counts = g.work ? work.counts : bucketTasks(tasks);\n const done = counts.ok + counts.warn + counts.fail + counts.canceled;\n const progress = g.work ? work.label : total > 0 ? `${done}/${total}` : \"\";\n\n const running = tasks.filter((t) => t.status === \"running\");\n const pending = tasks.filter((t) => t.status === \"pending\");\n const completed = tasks.filter((t) => t.status !== \"running\" && t.status !== \"pending\");\n const alwaysShow = completed.filter(isFailedOrWarn);\n const collapsible = completed.filter((t) => !isFailedOrWarn(t));\n\n const hiddenCompleted = collapsible.length - MAX_COMPLETED;\n const collapseCompleted = !showAll && hiddenCompleted > 0;\n const visibleSuccess = collapseCompleted ? collapsible.slice(-MAX_COMPLETED) : collapsible;\n\n const hiddenPending = pending.length - MAX_PENDING;\n const collapsePending = !showAll && hiddenPending > 0;\n const visiblePending = collapsePending ? pending.slice(0, MAX_PENDING) : pending;\n\n const isTerminal = g.status !== \"running\" && g.status !== \"pending\";\n\n const copyItems: DropdownMenuItem[] = [\n {\n label: \"Copy as JSON\",\n icon: UiJson,\n onSelect: () => copy(taskGroupJson(g, tasks)),\n },\n {\n label: \"Copy errors only\",\n icon: UiWarningTriangle,\n disabled: taskGroupErrorCount(tasks) === 0,\n onSelect: () => copy(taskGroupErrors(g, tasks)),\n },\n ];\n\n return (\n <div className={cn(\"rounded-lg border bg-card\", compact ? \"p-2\" : \"p-4\")}>\n <div className={cn(\"flex items-center justify-between gap-3\", compact ? \"mb-2\" : \"mb-3\")}>\n <h3 className=\"flex min-w-0 items-center gap-1.5 text-sm font-semibold\">\n <Icon\n icon={taskStatusIcon(g.status)}\n className={cn(\n \"shrink-0\",\n taskStatusColor(g.status),\n g.status === \"running\" && \"animate-spin\",\n )}\n />\n <span className=\"truncate\">{g.name}</span>\n {progress && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{progress}</span>\n )}\n {g.kind && (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0 text-[10px] text-muted-foreground\">\n {g.kind}\n </span>\n )}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isTerminal && (\n <span\n className={cn(\n \"rounded-full px-2 py-0.5 text-xs\",\n taskStatusColor(g.status),\n taskStatusBg(g.status),\n )}\n >\n {g.status}\n </span>\n )}\n <SplitButton\n label={copyState === \"copied\" ? \"Copied\" : copyState === \"error\" ? \"Copy failed\" : \"Copy\"}\n icon={copyState === \"copied\" ? UiCheck : UiCopy}\n variant=\"ghost\"\n size=\"sm\"\n title=\"More copy options\"\n onClick={() => copy(taskGroupMarkdown(g, tasks))}\n items={copyItems}\n />\n {onControl && <TaskControls target={g} onControl={onControl} />}\n </div>\n </div>\n\n {total > 0 && (\n <div className={compact ? \"mb-2\" : \"mb-3\"}>\n <ProgressBar segments={taskSegments(counts)} total={total} height=\"h-1.5\" />\n </div>\n )}\n\n {isTaskProcessDetails(g.details) && (\n <TaskProcessDetailsView\n details={g.details}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n\n {!isTaskProcessDetails(g.details) && isTaskExecDetails(g.details) && (\n <TaskExecDetailsView details={g.details} />\n )}\n\n {hiddenCompleted > 0 || hiddenPending > 0 ? (\n <button\n type=\"button\"\n className={cn(\"border-b text-xs text-muted-foreground hover:text-foreground\", compact ? \"py-1\" : \"py-1.5\")}\n onClick={() => setShowAll((v) => !v)}\n >\n {showAll\n ? \"▲ collapse\"\n : `... ${(collapseCompleted ? hiddenCompleted : 0) + (collapsePending ? hiddenPending : 0)} more tasks`}\n </button>\n ) : null}\n\n {[...visibleSuccess, ...alwaysShow, ...running, ...visiblePending].map((t) => (\n <TaskRow\n key={t.id}\n task={t}\n group={g}\n compact={compact}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskRow({\n task: t,\n group,\n compact,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs: contributeTabs,\n headerExtra,\n}: {\n task: TaskSnapshot;\n group: TaskSnapshot;\n compact: boolean | undefined;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(false);\n const logs: LogEntry[] = t.logs ?? [];\n const hasLogs = logs.length > 0;\n const extraTabs = contributeTabs?.(t, group) ?? [];\n // A host that has nothing to add for this task returns null, and the default\n // metadata chips take over — so enriching one kind of task never costs the\n // rest their header.\n const header = headerExtra?.(t, group) ?? <TaskMetadataChips task={t} />;\n const hasOutput = !!t.stdout || !!t.stderr || extraTabs.length > 0;\n const execDetails = isTaskExecDetails(t.details) ? t.details : undefined;\n const processDetails = isTaskProcessDetails(t.details) ? t.details : undefined;\n const expandable = hasLogs || hasOutput || execDetails !== undefined || processDetails !== undefined;\n // Promote the latest warning message inline so a `warning` row shows its\n // reason without expanding. Suppressed when an error is already shown.\n const latestWarn = t.error ? undefined : logs.filter((l) => l.level === \"warn\").at(-1);\n // Bounded per-task progress (e.g. records emitted in a phase): render an x/y\n // count, a percentage, and a thin bar while the task runs.\n const done = t.progress ?? 0;\n // Only surface bounded progress once work has actually started — an untouched\n // task should not render a \"0/100 · 0%\" placeholder.\n const hasProgress = typeof t.maxValue === \"number\" && t.maxValue > 0 && done > 0;\n const pct = hasProgress ? Math.round((done / (t.maxValue as number)) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"group flex items-start border-b last:border-0\",\n compact ? \"gap-2 py-1\" : \"gap-3 py-2\",\n expandable && \"-mx-1 cursor-pointer rounded px-1 hover:bg-muted/50\",\n )}\n onClick={expandable ? () => setExpanded((v) => !v) : undefined}\n >\n <Icon\n icon={taskStatusIcon(t.status)}\n className={cn(taskStatusColor(t.status), \"mt-0.5\", compact ? \"text-base\" : \"text-lg\", t.status === \"running\" && \"animate-spin\")}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm font-medium\">\n <span className=\"truncate\">{t.name}</span>\n {t.error && <span className=\"truncate text-xs font-normal text-red-500\">{t.error}</span>}\n {latestWarn && (\n <span className={cn(\"truncate text-xs font-normal\", logLevelColor(\"warn\"))}>\n {latestWarn.message}\n </span>\n )}\n {expandable && (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {logs.length + (t.stdout ? 1 : 0) + (t.stderr ? 1 : 0) + (execDetails || processDetails ? 1 : 0)}\n </span>\n )}\n </span>\n {header}\n <div className=\"flex shrink-0 items-center gap-1\">\n {t.duration && <span className=\"text-xs text-muted-foreground\">{t.duration}</span>}\n <CopyButton\n value={() => taskMarkdown(t)}\n label={`Copy ${t.name}`}\n className=\"opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100\"\n iconClassName=\"text-xs\"\n />\n {onTaskControl && (\n <TaskControls\n target={t}\n labelSuffix={t.name}\n stopPropagation\n onControl={(action) => onTaskControl(action, t, group)}\n />\n )}\n </div>\n </div>\n {(t.description || hasProgress) && (\n <div className=\"mt-0.5 flex items-center gap-2\">\n {t.description && (\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{t.description}</span>\n )}\n {hasProgress && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {done}/{t.maxValue} · {pct}%\n </span>\n )}\n </div>\n )}\n {hasProgress && t.status === \"running\" && (\n <div className=\"mt-1\">\n <ProgressBar\n segments={[{ count: done, color: \"bg-blue-500\", label: \"done\" }]}\n total={t.maxValue as number}\n height=\"h-1\"\n />\n </div>\n )}\n {expanded && execDetails && <TaskExecDetailsView details={execDetails} />}\n {expanded && processDetails && (\n <TaskProcessDetailsView\n details={processDetails}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n {expanded && hasLogs && (\n <div className=\"mt-1 ml-1 max-h-48 space-y-0.5 overflow-y-auto border-l-2 pl-2\">\n {logs.map((l, i) => (\n <div key={i} className={cn(\"text-xs\", logLevelColor(l.level))}>\n <span className=\"mr-1 font-mono text-muted-foreground\">{l.level.substring(0, 3)}</span>\n {l.message}\n </div>\n ))}\n </div>\n )}\n {expanded && <TaskStreamTabs task={t} {...(extraTabs.length > 0 ? { extraTabs } : {})} />}\n </div>\n </div>\n );\n}\n\nfunction TaskControls({\n target,\n onControl,\n labelSuffix,\n stopPropagation,\n}: {\n target: TaskSnapshot;\n onControl: (action: TaskControlAction, target: TaskSnapshot) => void | Promise<void>;\n labelSuffix?: string;\n stopPropagation?: boolean;\n}) {\n const [busy, setBusy] = useState<TaskControlAction | null>(null);\n const [error, setError] = useState(\"\");\n const icons: Record<TaskControlAction, typeof UiPlay> = {\n start: UiPlay,\n stop: UiStop,\n restart: UiRestart,\n drain: UiStop,\n retry: UiRefresh,\n };\n const invoke = async (action: TaskControlAction) => {\n setBusy(action);\n setError(\"\");\n try {\n await onControl(action, target);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : `Failed to ${action} task`);\n } finally {\n setBusy(null);\n }\n };\n return (\n <>\n {(target.controls ?? []).map((action) => {\n const ControlIcon = icons[action];\n const actionLabel = action === \"drain\" ? \"Stop after current\" : action[0]?.toUpperCase() + action.slice(1);\n const label = labelSuffix ? `${actionLabel} ${labelSuffix}` : actionLabel;\n return (\n <Button\n key={action}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n title={label}\n disabled={busy !== null}\n onClick={(event) => {\n if (stopPropagation) event.stopPropagation();\n void invoke(action);\n }}\n >\n <ControlIcon />\n </Button>\n );\n })}\n {error && <span role=\"alert\" className=\"text-xs text-red-600\">{error}</span>}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TaskProgress.js","names":["_Fragment"],"sources":["../../src/data/TaskProgress.tsx"],"sourcesContent":["import { taskWorkProgress } from \"./task-work-progress\";\nimport { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { SplitButton } from \"../components/SplitButton\";\nimport { useCopyFlash } from \"../components/clipboard\";\nimport { UiCheck, UiCopy, UiJson, UiPlay, UiRefresh, UiRestart, UiStop, UiWarningTriangle } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Icon } from \"./Icon\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport { TaskProcessDetailsView } from \"./TaskProcessDetails\";\nimport { TaskExecDetailsView } from \"./TaskExecDetails\";\nimport { TaskPrompts } from \"./TaskPrompts\";\nimport type { LogEntry, TaskControlAction, TaskSnapshot } from \"./TaskSnapshot\";\nimport { type TaskHeaderExtra, TaskMetadataChips } from \"./TaskHeaderExtras\";\nimport { type TaskExtraTabs, TaskStreamTabs } from \"./TaskStreamTabs\";\nimport {\n isFailedOrWarn,\n taskGroupErrorCount,\n taskGroupErrors,\n taskGroupJson,\n taskGroupMarkdown,\n taskMarkdown,\n} from \"./task-copy\";\nimport { isTaskExecDetails } from \"./task-exec-details\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport {\n bucketTasks,\n logLevelColor,\n taskSegments,\n taskStatusBg,\n taskStatusColor,\n taskStatusIcon,\n} from \"./task-status\";\n\n// TaskProgress renders one or more clicky task runs (groups) and their child\n// tasks: a segmented progress bar per group plus collapsible per-task rows with\n// status icon, duration, error, and expandable logs. Presentational only —\n// callers feed it snapshots from useTaskRun (SSE) or any other source.\n\nconst MAX_COMPLETED = 5;\nconst MAX_PENDING = 3;\nconst DEFAULT_PROMPT_BASE = \"/api/todos\";\n\nexport interface TaskProgressProps {\n snapshots: TaskSnapshot[];\n title?: string;\n /** Tighter spacing for embedding in a panel. */\n compact?: boolean;\n /** Show every child task when the group first opens. */\n initialShowAllTasks?: boolean;\n className?: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n /**\n * Contributes host-owned output panes alongside a task's own stdout/stderr —\n * an agent's session transcript, say, which this module has no way to fetch.\n */\n extraTabs?: TaskExtraTabs;\n /**\n * Replaces the content beside a task's name in its header row. Returning null\n * for a task falls back to the default, which chips the scalar values of its\n * process metadata.\n */\n headerExtra?: TaskHeaderExtra;\n /** Base path the prompt API is mounted under; a task's pending prompts are answered there. */\n promptBasePath?: string;\n}\n\nexport function TaskProgress({\n snapshots,\n title,\n compact,\n initialShowAllTasks,\n className,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n promptBasePath = DEFAULT_PROMPT_BASE,\n}: TaskProgressProps) {\n const groups = snapshots.filter((s) => s.type === \"group\");\n const tasks = snapshots.filter((s) => s.type === \"task\");\n\n if (groups.length === 0) {\n return (\n <div className={cn(\"text-sm text-muted-foreground\", className)}>\n {title ? `${title}: ` : \"\"}No tasks yet.\n </div>\n );\n }\n\n return (\n <div className={cn(compact ? \"space-y-2\" : \"space-y-3\", className)}>\n {title && <h2 className=\"text-sm font-semibold\">{title}</h2>}\n {groups.map((g) => (\n <TaskGroupCard\n key={g.groupId || g.id}\n group={g}\n tasks={tasks.filter((t) => g.groupId ? t.groupId === g.groupId : t.group === g.id)}\n compact={compact}\n initialShowAllTasks={initialShowAllTasks}\n {...(onControl ? { onControl } : {})}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n promptBasePath={promptBasePath}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskGroupCard({\n group: g,\n tasks,\n compact,\n initialShowAllTasks,\n onControl,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs,\n headerExtra,\n promptBasePath,\n}: {\n group: TaskSnapshot;\n tasks: TaskSnapshot[];\n compact: boolean | undefined;\n initialShowAllTasks: boolean | undefined;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n promptBasePath: string;\n onControl?: (action: TaskControlAction, group: TaskSnapshot) => void | Promise<void>;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n}) {\n const [showAll, setShowAll] = useState(initialShowAllTasks ?? false);\n const { state: copyState, copy } = useCopyFlash();\n const work = taskWorkProgress(g);\n const total = g.work ? work.total : g.total ?? tasks.length;\n const counts = g.work ? work.counts : bucketTasks(tasks);\n const done = counts.ok + counts.warn + counts.fail + counts.canceled;\n const progress = g.work ? work.label : total > 0 ? `${done}/${total}` : \"\";\n\n const running = tasks.filter((t) => t.status === \"running\");\n const pending = tasks.filter((t) => t.status === \"pending\");\n const completed = tasks.filter((t) => t.status !== \"running\" && t.status !== \"pending\");\n const alwaysShow = completed.filter(isFailedOrWarn);\n const collapsible = completed.filter((t) => !isFailedOrWarn(t));\n\n const hiddenCompleted = collapsible.length - MAX_COMPLETED;\n const collapseCompleted = !showAll && hiddenCompleted > 0;\n const visibleSuccess = collapseCompleted ? collapsible.slice(-MAX_COMPLETED) : collapsible;\n\n const hiddenPending = pending.length - MAX_PENDING;\n const collapsePending = !showAll && hiddenPending > 0;\n const visiblePending = collapsePending ? pending.slice(0, MAX_PENDING) : pending;\n\n const isTerminal = g.status !== \"running\" && g.status !== \"pending\";\n\n const copyItems: DropdownMenuItem[] = [\n {\n label: \"Copy as JSON\",\n icon: UiJson,\n onSelect: () => copy(taskGroupJson(g, tasks)),\n },\n {\n label: \"Copy errors only\",\n icon: UiWarningTriangle,\n disabled: taskGroupErrorCount(tasks) === 0,\n onSelect: () => copy(taskGroupErrors(g, tasks)),\n },\n ];\n\n return (\n <div className={cn(\"rounded-lg border bg-card\", compact ? \"p-2\" : \"p-4\")}>\n <div className={cn(\"flex items-center justify-between gap-3\", compact ? \"mb-2\" : \"mb-3\")}>\n <h3 className=\"flex min-w-0 items-center gap-1.5 text-sm font-semibold\">\n <Icon\n icon={taskStatusIcon(g.status)}\n className={cn(\n \"shrink-0\",\n taskStatusColor(g.status),\n g.status === \"running\" && \"animate-spin\",\n )}\n />\n <span className=\"truncate\">{g.name}</span>\n {progress && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{progress}</span>\n )}\n {g.kind && (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0 text-[10px] text-muted-foreground\">\n {g.kind}\n </span>\n )}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {isTerminal && (\n <span\n className={cn(\n \"rounded-full px-2 py-0.5 text-xs\",\n taskStatusColor(g.status),\n taskStatusBg(g.status),\n )}\n >\n {g.status}\n </span>\n )}\n <SplitButton\n label={copyState === \"copied\" ? \"Copied\" : copyState === \"error\" ? \"Copy failed\" : \"Copy\"}\n icon={copyState === \"copied\" ? UiCheck : UiCopy}\n variant=\"ghost\"\n size=\"sm\"\n title=\"More copy options\"\n onClick={() => copy(taskGroupMarkdown(g, tasks))}\n items={copyItems}\n />\n {onControl && <TaskControls target={g} onControl={onControl} />}\n </div>\n </div>\n\n {total > 0 && (\n <div className={compact ? \"mb-2\" : \"mb-3\"}>\n <ProgressBar segments={taskSegments(counts)} total={total} height=\"h-1.5\" />\n </div>\n )}\n\n {isTaskProcessDetails(g.details) && (\n <TaskProcessDetailsView\n details={g.details}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n\n {!isTaskProcessDetails(g.details) && isTaskExecDetails(g.details) && (\n <TaskExecDetailsView details={g.details} />\n )}\n\n {hiddenCompleted > 0 || hiddenPending > 0 ? (\n <button\n type=\"button\"\n className={cn(\"border-b text-xs text-muted-foreground hover:text-foreground\", compact ? \"py-1\" : \"py-1.5\")}\n onClick={() => setShowAll((v) => !v)}\n >\n {showAll\n ? \"▲ collapse\"\n : `... ${(collapseCompleted ? hiddenCompleted : 0) + (collapsePending ? hiddenPending : 0)} more tasks`}\n </button>\n ) : null}\n\n {[...visibleSuccess, ...alwaysShow, ...running, ...visiblePending].map((t) => (\n <TaskRow\n key={t.id}\n task={t}\n group={g}\n compact={compact}\n {...(onTaskControl ? { onTaskControl } : {})}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n {...(extraTabs ? { extraTabs } : {})}\n {...(headerExtra ? { headerExtra } : {})}\n promptBasePath={promptBasePath}\n />\n ))}\n </div>\n );\n}\n\nfunction TaskRow({\n task: t,\n group,\n compact,\n onTaskControl,\n metricsBaseUrl,\n connectionStatus,\n extraTabs: contributeTabs,\n headerExtra,\n promptBasePath,\n}: {\n task: TaskSnapshot;\n group: TaskSnapshot;\n compact: boolean | undefined;\n metricsBaseUrl?: string;\n connectionStatus?: string;\n extraTabs?: TaskExtraTabs;\n headerExtra?: TaskHeaderExtra;\n promptBasePath: string;\n onTaskControl?: (\n action: TaskControlAction,\n task: TaskSnapshot,\n group: TaskSnapshot,\n ) => void | Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(false);\n const logs: LogEntry[] = t.logs ?? [];\n const hasLogs = logs.length > 0;\n const extraTabs = contributeTabs?.(t, group) ?? [];\n // A host that has nothing to add for this task returns null, and the default\n // metadata chips take over — so enriching one kind of task never costs the\n // rest their header.\n const header = headerExtra?.(t, group) ?? <TaskMetadataChips task={t} />;\n const hasOutput = !!t.stdout || !!t.stderr || extraTabs.length > 0;\n const execDetails = isTaskExecDetails(t.details) ? t.details : undefined;\n const processDetails = isTaskProcessDetails(t.details) ? t.details : undefined;\n const expandable = hasLogs || hasOutput || execDetails !== undefined || processDetails !== undefined;\n // Promote the latest warning message inline so a `warning` row shows its\n // reason without expanding. Suppressed when an error is already shown.\n const latestWarn = t.error ? undefined : logs.filter((l) => l.level === \"warn\").at(-1);\n // Bounded per-task progress (e.g. records emitted in a phase): render an x/y\n // count, a percentage, and a thin bar while the task runs.\n const done = t.progress ?? 0;\n // Only surface bounded progress once work has actually started — an untouched\n // task should not render a \"0/100 · 0%\" placeholder.\n const hasProgress = typeof t.maxValue === \"number\" && t.maxValue > 0 && done > 0;\n const pct = hasProgress ? Math.round((done / (t.maxValue as number)) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"group flex items-start border-b last:border-0\",\n compact ? \"gap-2 py-1\" : \"gap-3 py-2\",\n expandable && \"-mx-1 cursor-pointer rounded px-1 hover:bg-muted/50\",\n )}\n onClick={expandable ? () => setExpanded((v) => !v) : undefined}\n >\n <Icon\n icon={taskStatusIcon(t.status)}\n className={cn(taskStatusColor(t.status), \"mt-0.5\", compact ? \"text-base\" : \"text-lg\", t.status === \"running\" && \"animate-spin\")}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm font-medium\">\n <span className=\"truncate\">{t.name}</span>\n {t.error && <span className=\"truncate text-xs font-normal text-red-500\">{t.error}</span>}\n {latestWarn && (\n <span className={cn(\"truncate text-xs font-normal\", logLevelColor(\"warn\"))}>\n {latestWarn.message}\n </span>\n )}\n {expandable && (\n <span className=\"inline-flex shrink-0 items-center rounded-full bg-muted px-1.5 text-[10px] font-medium text-muted-foreground\">\n {logs.length + (t.stdout ? 1 : 0) + (t.stderr ? 1 : 0) + (execDetails || processDetails ? 1 : 0)}\n </span>\n )}\n </span>\n {header}\n <div className=\"flex shrink-0 items-center gap-1\">\n {t.duration && <span className=\"text-xs text-muted-foreground\">{t.duration}</span>}\n <CopyButton\n value={() => taskMarkdown(t)}\n label={`Copy ${t.name}`}\n className=\"opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100 [@media(hover:none)]:opacity-100\"\n iconClassName=\"text-xs\"\n />\n {onTaskControl && (\n <TaskControls\n target={t}\n labelSuffix={t.name}\n stopPropagation\n onControl={(action) => onTaskControl(action, t, group)}\n />\n )}\n </div>\n </div>\n {(t.description || hasProgress) && (\n <div className=\"mt-0.5 flex items-center gap-2\">\n {t.description && (\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{t.description}</span>\n )}\n {hasProgress && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {done}/{t.maxValue} · {pct}%\n </span>\n )}\n </div>\n )}\n {hasProgress && t.status === \"running\" && (\n <div className=\"mt-1\">\n <ProgressBar\n segments={[{ count: done, color: \"bg-blue-500\", label: \"done\" }]}\n total={t.maxValue as number}\n height=\"h-1\"\n />\n </div>\n )}\n {t.prompts && t.prompts.length > 0 && <TaskPrompts prompts={t.prompts} basePath={promptBasePath} />}\n {expanded && execDetails && <TaskExecDetailsView details={execDetails} />}\n {expanded && processDetails && (\n <TaskProcessDetailsView\n details={processDetails}\n {...(metricsBaseUrl ? { metricsBaseUrl } : {})}\n {...(connectionStatus ? { connectionStatus } : {})}\n />\n )}\n {expanded && hasLogs && (\n <div className=\"mt-1 ml-1 max-h-48 space-y-0.5 overflow-y-auto border-l-2 pl-2\">\n {logs.map((l, i) => (\n <div key={i} className={cn(\"text-xs\", logLevelColor(l.level))}>\n <span className=\"mr-1 font-mono text-muted-foreground\">{l.level.substring(0, 3)}</span>\n {l.message}\n </div>\n ))}\n </div>\n )}\n {expanded && <TaskStreamTabs task={t} {...(extraTabs.length > 0 ? { extraTabs } : {})} />}\n </div>\n </div>\n );\n}\n\nfunction TaskControls({\n target,\n onControl,\n labelSuffix,\n stopPropagation,\n}: {\n target: TaskSnapshot;\n onControl: (action: TaskControlAction, target: TaskSnapshot) => void | Promise<void>;\n labelSuffix?: string;\n stopPropagation?: boolean;\n}) {\n const [busy, setBusy] = useState<TaskControlAction | null>(null);\n const [error, setError] = useState(\"\");\n const icons: Record<TaskControlAction, typeof UiPlay> = {\n start: UiPlay,\n stop: UiStop,\n restart: UiRestart,\n drain: UiStop,\n retry: UiRefresh,\n };\n const invoke = async (action: TaskControlAction) => {\n setBusy(action);\n setError(\"\");\n try {\n await onControl(action, target);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : `Failed to ${action} task`);\n } finally {\n setBusy(null);\n }\n };\n return (\n <>\n {(target.controls ?? []).map((action) => {\n const ControlIcon = icons[action];\n const actionLabel = action === \"drain\" ? \"Stop after current\" : action[0]?.toUpperCase() + action.slice(1);\n const label = labelSuffix ? `${actionLabel} ${labelSuffix}` : actionLabel;\n return (\n <Button\n key={action}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n title={label}\n disabled={busy !== null}\n onClick={(event) => {\n if (stopPropagation) event.stopPropagation();\n void invoke(action);\n }}\n >\n <ControlIcon />\n </Button>\n );\n })}\n {error && <span role=\"alert\" className=\"text-xs text-red-600\">{error}</span>}\n </>\n );\n}\n"],"mappings":"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"}
|