@flanksource/clicky-ui 0.3.54 → 0.3.56
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/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/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 +42 -40
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +20 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +43 -42
- 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/index.d.ts +2 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.cjs +2 -11
- package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
- package/dist/data/test-runner/matrix-marks.d.ts +2 -4
- package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.js +3 -11
- package/dist/data/test-runner/matrix-marks.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 +1 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- 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 +58 -7
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +29 -12
- 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 +76 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -14
- 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 +2 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +2 -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":"SpecRuntimeEditor.model.js","names":[],"sources":["../../../src/data/ai/SpecRuntimeEditor.model.ts"],"sourcesContent":["import type { ChatBudgetConfig } from \"../chat/types\";\nimport {\n normalizeToolPolicyRules,\n type PermissionPolicy,\n} from \"../chat/tool-policy\";\nimport {\n compactRuntimeSandbox,\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeSandbox,\n type SpecPermissionMode,\n} from \"./SpecRuntimeEditor.sandbox-model\";\n\nexport {\n SPEC_PERMISSION_MODES,\n SPEC_SANDBOX_MODES,\n} from \"./SpecRuntimeEditor.sandbox-model\";\nexport type {\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxFilesystemPolicy,\n AISpecRuntimeSandboxNetworkPolicy,\n AISpecRuntimeSandboxPolicy,\n SpecPermissionMode,\n SpecSandboxFilesystemAccess,\n SpecSandboxMode,\n SpecSandboxNetworkAccess,\n} from \"./SpecRuntimeEditor.sandbox-model\";\n\nexport const SPEC_TOOL_POLICIES = [\"auto\", \"ask\", \"allow\", \"deny\"] as const;\nexport type SpecToolPolicy = (typeof SPEC_TOOL_POLICIES)[number];\n\nexport const SPEC_RESOURCE_MODES = [\"enabled\", \"disabled\"] as const;\nexport type SpecResourceMode = (typeof SPEC_RESOURCE_MODES)[number];\n\nexport const SPEC_CHECKOUT_MODES = [\"none\", \"remote\", \"local\"] as const;\nexport type SpecCheckoutMode = (typeof SPEC_CHECKOUT_MODES)[number];\n\n/**\n * Sandbox capabilities an adapter may declare. Mirrors captain's\n * registry.SandboxCapability: the editor reads these to decide what to offer —\n * an agent picker needs `remote-exec`, and `isolate-workspace` conflicts with a\n * worktree or setup checkout.\n */\nexport const SPEC_SANDBOX_CAPABILITIES = [\n \"wrap-command\",\n \"remote-exec\",\n \"isolate-workspace\",\n \"egress-proxy\",\n] as const;\nexport type SpecSandboxCapability = (typeof SPEC_SANDBOX_CAPABILITIES)[number];\n\nexport const SPEC_WORKTREE_MODES = [\"none\", \"new\", \"existing\"] as const;\nexport type SpecWorktreeMode = (typeof SPEC_WORKTREE_MODES)[number];\n\nexport const SPEC_CLONE_MODES = [\"clone\", \"skip\"] as const;\nexport type SpecCloneMode = (typeof SPEC_CLONE_MODES)[number];\n\nexport const SPEC_STASH_MODES = [\n \"none\",\n \"untracked\",\n \"unstaged\",\n \"staged\",\n \"all\",\n] as const;\nexport type SpecStashMode = (typeof SPEC_STASH_MODES)[number];\n\nexport const SPEC_VERIFY_SCOPES = [\"all\", \"changed\"] as const;\nexport type SpecVerifyScope = (typeof SPEC_VERIFY_SCOPES)[number];\n\n// The lifecycle boundary a commit fires on, mirroring captain's api.CommitPhase:\n// \"turn\" after every loop iteration, \"agent\" once the generate/verify loop ends,\n// \"run\" after the worktree is merged away.\nexport const SPEC_COMMIT_PHASES = [\"turn\", \"agent\", \"run\"] as const;\nexport type SpecCommitPhase = (typeof SPEC_COMMIT_PHASES)[number];\n\nexport const SPEC_COMMIT_MODES = [\"commit\", \"fixup\", \"amend\"] as const;\nexport type SpecCommitMode = (typeof SPEC_COMMIT_MODES)[number];\n\nexport const SPEC_COMMIT_CONDITIONS = [\n \"always\",\n \"onSuccess\",\n \"onVerify\",\n] as const;\nexport type SpecCommitCondition = (typeof SPEC_COMMIT_CONDITIONS)[number];\n\nexport const SPEC_COMMIT_STAGES = [\"worktree\", \"changed\"] as const;\nexport type SpecCommitStage = (typeof SPEC_COMMIT_STAGES)[number];\n\nexport const SPEC_COMMIT_GATES = [\"none\", \"cheap\", \"full\"] as const;\nexport type SpecCommitGates = (typeof SPEC_COMMIT_GATES)[number];\n\nexport const SPEC_SCHEMA_STRICTNESS = [\"warning\", \"error\", \"retry\"] as const;\nexport type SpecSchemaStrictness = (typeof SPEC_SCHEMA_STRICTNESS)[number];\n\nexport type AISpecRuntimePrompt = {\n user?: string;\n system?: string;\n appendSystem?: string;\n schemaJSON?: unknown;\n schemaStrictness?: SpecSchemaStrictness | \"\";\n attachments?: AISpecRuntimeAttachment[];\n};\n\nexport type AISpecRuntimeAttachment = {\n id?: string;\n path?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type AISpecRuntimeModelFallback = {\n model?: string;\n id?: string;\n /** The canonical runtime mode: api | agent | cli | cmux. */\n mode?: string;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n};\n\nexport type AISpecRuntimeMemory = {\n skills?: string[];\n skipProject?: boolean;\n skipUser?: boolean;\n skipSkills?: boolean;\n skipHooks?: boolean;\n skipMemory?: boolean;\n bare?: boolean;\n};\n\nexport type AISpecRuntimeToolPolicies = Record<string, SpecToolPolicy>;\n\nexport type AISpecRuntimeLegacyToolPermissions = {\n allow?: string[];\n deny?: string[];\n modes?: Record<string, string>;\n};\n\nexport type AISpecRuntimeResourcePolicies = Record<string, SpecResourceMode>;\n\nexport type AISpecRuntimeMCPPermissions = {\n disabled?: boolean;\n servers?: string[];\n [name: string]: SpecResourceMode | string[] | boolean | undefined;\n};\n\nexport type AISpecRuntimePermissions = {\n // The base posture, independent of the sandbox: isolation bounds what the\n // process can reach, while the mode decides whether the agent asks before\n // acting. A run can ask for `plan` with no sandbox at all.\n mode?: SpecPermissionMode;\n presets?: string[];\n tools?: AISpecRuntimeToolPolicies | AISpecRuntimeLegacyToolPermissions;\n mcp?: AISpecRuntimeMCPPermissions;\n plugins?: AISpecRuntimeResourcePolicies | string[];\n skills?: AISpecRuntimeResourcePolicies | string[];\n};\n\nexport type AISpecRuntimePermissionCatalogItem = {\n id: string;\n label?: string;\n group?: string;\n description?: string;\n source?: string;\n sourcePath?: string;\n configured?: boolean;\n available?: boolean;\n defaultMode?: string;\n};\n\nexport type AISpecRuntimePermissionCatalog = {\n tools?: AISpecRuntimePermissionCatalogItem[];\n mcp?: AISpecRuntimePermissionCatalogItem[];\n plugins?: AISpecRuntimePermissionCatalogItem[];\n skills?: AISpecRuntimePermissionCatalogItem[];\n};\n\nexport type AISpecRuntimeBudget = ChatBudgetConfig & {\n maxTurns?: number;\n timeout?: string;\n};\n\nexport type AISpecRuntimeSpec = {\n model?: string;\n id?: string;\n /** The canonical runtime mode: api | agent | cli | cmux. */\n mode?: string;\n /**\n * Unified sandbox settings. A mode-only ref round-trips as a scalar.\n */\n sandbox?: string | AISpecRuntimeSandbox;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n fallbacks?: AISpecRuntimeModelFallback[];\n prompt?: AISpecRuntimePrompt;\n budget?: AISpecRuntimeBudget;\n memory?: AISpecRuntimeMemory;\n permissions?: AISpecRuntimePermissions;\n /** Ordered, last-match-wins Captain tool authority rules. */\n toolPolicy?: PermissionPolicy;\n setup?: AISpecRuntimeSetup;\n workflow?: AISpecRuntimeWorkflow;\n sessionId?: string;\n /** Extra cmux CLI args (api.Spec.cliArgs), keyed by option json name. */\n cliArgs?: Record<string, unknown>;\n};\n\nexport type AISpecRuntimeEnvVarSource = {\n secretKeyRef?: { name?: string; key?: string };\n configMapKeyRef?: { name?: string; key?: string };\n serviceAccount?: string;\n helmRef?: { name?: string; key?: string };\n onePassword?: string;\n};\n\nexport type AISpecRuntimeEnvVar = {\n name?: string;\n value?: string;\n valueFrom?: string | AISpecRuntimeEnvVarSource;\n};\n\nexport type AISpecRuntimeConnections = {\n fromConfigItem?: string;\n eksPodIdentity?: boolean;\n serviceAccount?: boolean;\n aws?: {\n connection?: string;\n accessKey?: AISpecRuntimeEnvVar;\n secretKey?: AISpecRuntimeEnvVar;\n sessionToken?: AISpecRuntimeEnvVar;\n assumeRole?: string;\n region?: string;\n endpoint?: string;\n skipTLSVerify?: boolean;\n };\n gcp?: {\n connection?: string;\n credentials?: AISpecRuntimeEnvVar;\n endpoint?: string;\n project?: string;\n skipTLSVerify?: boolean;\n };\n azure?: {\n connection?: string;\n clientID?: AISpecRuntimeEnvVar;\n clientSecret?: AISpecRuntimeEnvVar;\n tenantID?: string;\n };\n kubernetes?: {\n connection?: string;\n kubeconfig?: AISpecRuntimeEnvVar;\n eks?: Record<string, unknown>;\n gke?: Record<string, unknown>;\n cnrm?: Record<string, unknown>;\n };\n};\n\nexport type AISpecRuntimeSetup = {\n cwd?: string;\n baseDir?: string;\n dotenv?: string[];\n envVars?: AISpecRuntimeEnvVar[];\n connections?: AISpecRuntimeConnections;\n checkout?: {\n mode?: SpecCheckoutMode | \"\";\n url?: string;\n path?: string;\n connection?: string;\n ref?: string;\n depth?: number;\n since?: string;\n worktree?: {\n mode?: SpecWorktreeMode | \"\";\n prefix?: string;\n base?: string;\n path?: string;\n keep?: boolean;\n uncommitted?: SpecCloneMode | \"\";\n ignored?: SpecCloneMode | \"\";\n };\n dirty?: {\n stash?: SpecStashMode | \"\";\n since?: string;\n };\n };\n};\n\nexport type AISpecRuntimeVerify = {\n fixture?: string;\n scope?: SpecVerifyScope | \"\";\n maxIterations?: number;\n /** Shell commands run as part of verification, alongside the fixture. */\n commands?: string[];\n /** Named prompt templates run as part of verification. */\n prompts?: string[];\n};\n\n// Mirrors captain's api.Commit: one commit policy keyed to a lifecycle phase.\n// Every field is optional because an omitted field means \"captain's default\",\n// which is why an empty stanza is still meaningful — see compactCommits.\nexport type AISpecRuntimeCommit = {\n on?: SpecCommitPhase | \"\";\n mode?: SpecCommitMode | \"\";\n when?: SpecCommitCondition | \"\";\n message?: string;\n anchor?: string;\n squash?: boolean;\n base?: string;\n stage?: SpecCommitStage | \"\";\n gates?: SpecCommitGates | \"\";\n dryRun?: boolean;\n};\n\n// Mirrors captain's api.Workflow (verify + commits) so the SpecRuntimeEditor's\n// Verify/Commit sections round-trip through the spec frontmatter. Unlike the\n// prior client-only shape, this is part of the compacted spec.\nexport type AISpecRuntimeWorkflow = {\n verify?: AISpecRuntimeVerify;\n commits?: AISpecRuntimeCommit[];\n};\n\nexport type AISpecRuntimeValue = AISpecRuntimeSpec;\n\nexport type AISpecRuntimePayload = {\n spec?: AISpecRuntimeSpec;\n};\n\nexport function buildAISpecRuntimePayload(\n value: AISpecRuntimeValue,\n): AISpecRuntimePayload {\n const payload: AISpecRuntimePayload = {};\n const spec = compactAISpecRuntime(value);\n if (hasKeys(spec)) payload.spec = spec;\n return payload;\n}\n\nexport function compactAISpecRuntime(\n value: AISpecRuntimeValue,\n): AISpecRuntimeSpec {\n const spec: AISpecRuntimeSpec = {};\n\n const model = cleanString(value.model);\n if (model) spec.model = model;\n const id = cleanString(value.id);\n if (id) spec.id = id;\n const specMode = cleanString(value.mode);\n if (specMode) spec.mode = specMode;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n spec.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) spec.effort = effort;\n if (value.noCache) spec.noCache = true;\n const fallbacks = compactFallbacks(value.fallbacks);\n if (fallbacks) spec.fallbacks = fallbacks;\n\n const prompt = compactPrompt(value.prompt);\n if (prompt) spec.prompt = prompt;\n const budget = compactBudget(value.budget);\n if (budget) spec.budget = budget;\n const memory = compactMemory(value.memory);\n if (memory) spec.memory = memory;\n const permissions = compactPermissions(\n value.permissions,\n value.memory?.skills,\n );\n if (permissions) spec.permissions = permissions;\n const toolPolicy = normalizeToolPolicyRules(value.toolPolicy);\n if (toolPolicy.length > 0) spec.toolPolicy = toolPolicy;\n const setup = compactSetup(value.setup);\n if (setup) spec.setup = setup;\n const workflow = compactWorkflow(value.workflow);\n if (workflow) spec.workflow = workflow;\n const sessionId = cleanString(value.sessionId);\n if (sessionId) spec.sessionId = sessionId;\n const sandbox = compactRuntimeSandbox(value.sandbox);\n if (sandbox !== undefined) spec.sandbox = sandbox;\n if (value.cliArgs && hasKeys(value.cliArgs)) spec.cliArgs = value.cliArgs;\n return spec;\n}\n\nfunction compactWorkflow(\n value: AISpecRuntimeWorkflow | undefined,\n): AISpecRuntimeWorkflow | undefined {\n if (!value) return undefined;\n const workflow: AISpecRuntimeWorkflow = {};\n const verify = compactVerify(value.verify);\n if (verify) workflow.verify = verify;\n const commits = compactCommits(value.commits);\n if (commits) workflow.commits = commits;\n return hasKeys(workflow) ? workflow : undefined;\n}\n\nfunction compactVerify(\n value: AISpecRuntimeVerify | undefined,\n): AISpecRuntimeVerify | undefined {\n if (!value) return undefined;\n const verify: AISpecRuntimeVerify = {};\n const fixture = cleanString(value.fixture);\n if (fixture) verify.fixture = fixture;\n if (value.scope === \"all\" || value.scope === \"changed\")\n verify.scope = value.scope;\n if (\n value.maxIterations != null &&\n Number.isFinite(value.maxIterations) &&\n value.maxIterations > 0\n ) {\n verify.maxIterations = Math.trunc(value.maxIterations);\n }\n const commands = compactList(value.commands);\n if (commands) verify.commands = commands;\n const prompts = compactList(value.prompts);\n if (prompts) verify.prompts = prompts;\n return hasKeys(verify) ? verify : undefined;\n}\n\n// Presence in the list is what turns committing on, so an empty stanza survives\n// compaction: `commits: [{}]` reads as \"one commit at the end of the run with\n// every default\". An absent list inherits; an explicit empty list disables commits.\nfunction compactCommits(\n value: AISpecRuntimeCommit[] | undefined,\n): AISpecRuntimeCommit[] | undefined {\n if (value === undefined) return undefined;\n return value.map(compactCommit);\n}\n\nfunction compactCommit(value: AISpecRuntimeCommit): AISpecRuntimeCommit {\n const commit: AISpecRuntimeCommit = {};\n const on = pickEnum(SPEC_COMMIT_PHASES, value.on);\n if (on) commit.on = on;\n const mode = pickEnum(SPEC_COMMIT_MODES, value.mode);\n if (mode) commit.mode = mode;\n const when = pickEnum(SPEC_COMMIT_CONDITIONS, value.when);\n if (when) commit.when = when;\n const message = cleanString(value.message);\n if (message) commit.message = message;\n const anchor = cleanString(value.anchor);\n if (anchor) commit.anchor = anchor;\n // Squash is a *bool in captain: `squash: false` is the instruction to keep the\n // fixup chain for review, so it cannot be pruned the way a plain flag is.\n if (value.squash != null) commit.squash = value.squash;\n const base = cleanString(value.base);\n if (base) commit.base = base;\n const stage = pickEnum(SPEC_COMMIT_STAGES, value.stage);\n if (stage) commit.stage = stage;\n const gates = pickEnum(SPEC_COMMIT_GATES, value.gates);\n if (gates) commit.gates = gates;\n if (value.dryRun) commit.dryRun = true;\n return commit;\n}\n\nfunction compactPrompt(\n value: AISpecRuntimePrompt | undefined,\n): AISpecRuntimePrompt | undefined {\n if (!value) return undefined;\n const prompt: AISpecRuntimePrompt = {};\n const user = cleanString(value.user);\n if (user) prompt.user = user;\n const system = cleanString(value.system);\n if (system) prompt.system = system;\n const appendSystem = cleanString(value.appendSystem);\n if (appendSystem) prompt.appendSystem = appendSystem;\n const schemaJSON = compactJSONValue(value.schemaJSON);\n if (schemaJSON !== undefined) prompt.schemaJSON = schemaJSON;\n if (\n value.schemaStrictness === \"warning\" ||\n value.schemaStrictness === \"error\" ||\n value.schemaStrictness === \"retry\"\n ) {\n prompt.schemaStrictness = value.schemaStrictness;\n }\n const attachments = value.attachments\n ?.map((attachment) => compactAttachment(attachment))\n .filter(\n (attachment): attachment is AISpecRuntimeAttachment =>\n attachment !== undefined,\n );\n if (attachments && attachments.length > 0) prompt.attachments = attachments;\n return hasKeys(prompt) ? prompt : undefined;\n}\n\nfunction compactAttachment(\n value: AISpecRuntimeAttachment,\n): AISpecRuntimeAttachment | undefined {\n const attachment: AISpecRuntimeAttachment = {};\n for (const key of [\n \"id\",\n \"path\",\n \"url\",\n \"filename\",\n \"mediaType\",\n \"sha256\",\n ] as const) {\n const text = cleanString(value[key]);\n if (text) attachment[key] = text;\n }\n if (value.size != null && Number.isFinite(value.size) && value.size >= 0) {\n attachment.size = value.size;\n }\n return attachment.id || attachment.path || attachment.url\n ? attachment\n : undefined;\n}\n\nfunction compactFallbacks(\n value: AISpecRuntimeModelFallback[] | undefined,\n): AISpecRuntimeModelFallback[] | undefined {\n if (!value) return undefined;\n const out: AISpecRuntimeModelFallback[] = [];\n for (const item of value) {\n const model = cleanString(item.model);\n if (!model) continue;\n const fallback: AISpecRuntimeModelFallback = { model };\n const id = cleanString(item.id);\n if (id) fallback.id = id;\n const itemMode = cleanString(item.mode);\n if (itemMode) fallback.mode = itemMode;\n if (item.temperature != null && Number.isFinite(item.temperature)) {\n fallback.temperature = item.temperature;\n }\n const effort = cleanString(item.effort);\n if (effort) fallback.effort = effort;\n if (item.noCache) fallback.noCache = true;\n out.push(fallback);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction compactBudget(\n value: AISpecRuntimeBudget | undefined,\n): AISpecRuntimeBudget | undefined {\n if (!value) return undefined;\n const budget: AISpecRuntimeBudget = {};\n if (value.cost != null && Number.isFinite(value.cost) && value.cost > 0) {\n budget.cost = value.cost;\n }\n if (\n value.maxTokens != null &&\n Number.isFinite(value.maxTokens) &&\n value.maxTokens > 0\n ) {\n budget.maxTokens = Math.trunc(value.maxTokens);\n }\n if (\n value.maxTurns != null &&\n Number.isFinite(value.maxTurns) &&\n value.maxTurns > 0\n ) {\n budget.maxTurns = Math.trunc(value.maxTurns);\n }\n const timeout = cleanString(value.timeout);\n if (timeout) budget.timeout = timeout;\n return hasKeys(budget) ? budget : undefined;\n}\n\nfunction compactMemory(\n value: AISpecRuntimeMemory | undefined,\n): AISpecRuntimeMemory | undefined {\n if (!value) return undefined;\n const memory: AISpecRuntimeMemory = {};\n if (value.skipProject) memory.skipProject = true;\n if (value.skipUser) memory.skipUser = true;\n if (value.skipHooks) memory.skipHooks = true;\n if (value.skipMemory) memory.skipMemory = true;\n if (value.bare) memory.bare = true;\n return hasKeys(memory) ? memory : undefined;\n}\n\nfunction compactPermissions(\n value: AISpecRuntimePermissions | undefined,\n legacySkills?: string[] | undefined,\n): AISpecRuntimePermissions | undefined {\n if (!value && !legacySkills?.length) return undefined;\n const permissions: AISpecRuntimePermissions = {};\n const mode = cleanString(value?.mode);\n if (mode) {\n if (!SPEC_PERMISSION_MODES.includes(mode as SpecPermissionMode)) {\n throw new Error(`permissions.mode ${JSON.stringify(mode)} is invalid`);\n }\n permissions.mode = mode as SpecPermissionMode;\n }\n const presets = compactList(value?.presets);\n if (presets) permissions.presets = presets;\n\n const tools = compactToolPolicies(value?.tools);\n if (tools) permissions.tools = tools;\n\n const mcp = compactMCPPermissions(value?.mcp);\n if (mcp) permissions.mcp = mcp;\n\n const plugins = compactResourcePolicies(value?.plugins);\n if (plugins) permissions.plugins = plugins;\n const skills = compactResourcePolicies(value?.skills, legacySkills);\n if (skills) permissions.skills = skills;\n return hasKeys(permissions) ? permissions : undefined;\n}\n\nfunction compactSetup(\n value: AISpecRuntimeSetup | undefined,\n): AISpecRuntimeSetup | undefined {\n if (!value) return undefined;\n const setup: AISpecRuntimeSetup = {};\n const cwd = cleanString(value.cwd);\n if (cwd) setup.cwd = cwd;\n const baseDir = cleanString(value.baseDir);\n if (baseDir) setup.baseDir = baseDir;\n const dotenv = compactList(value.dotenv);\n if (dotenv) setup.dotenv = dotenv;\n const envVars = compactEnvVars(value.envVars);\n if (envVars) setup.envVars = envVars;\n if (value.connections && hasKeys(value.connections)) {\n setup.connections = structuredClone(value.connections);\n }\n const checkout = compactSetupCheckout(value.checkout);\n if (checkout) setup.checkout = checkout;\n return hasKeys(setup) ? setup : undefined;\n}\n\nfunction compactEnvVars(value: AISpecRuntimeEnvVar[] | undefined) {\n if (!value) return undefined;\n const out: AISpecRuntimeEnvVar[] = [];\n for (const item of value) {\n const name = cleanString(item.name);\n if (!name) continue;\n const env: AISpecRuntimeEnvVar = { name };\n const literal = cleanString(item.value);\n const valueFrom =\n typeof item.valueFrom === \"string\"\n ? compactEnvVarSource(item.valueFrom)\n : compactStructuredEnvVarSource(item.valueFrom);\n if (literal) env.value = literal;\n if (valueFrom) env.valueFrom = valueFrom;\n if (env.value || env.valueFrom) out.push(env);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction compactEnvVarSource(\n value: string | undefined,\n): AISpecRuntimeEnvVarSource | undefined {\n const source = cleanString(value);\n if (!source) return undefined;\n const [kind, rest = \"\"] = source.split(\"://\", 2);\n const [name = \"\", key = \"\"] = rest.split(\"/\", 2).map((part) => part.trim());\n if (!name) return undefined;\n if (kind === \"secret\" && key) return { secretKeyRef: { name, key } };\n if (kind === \"configmap\" && key) return { configMapKeyRef: { name, key } };\n if (kind === \"serviceaccount\") return { serviceAccount: name };\n if (kind === \"helm\" && key) return { helmRef: { name, key } };\n if (kind === \"op\" && rest) return { onePassword: source };\n return undefined;\n}\n\nfunction compactStructuredEnvVarSource(\n value: AISpecRuntimeEnvVarSource | undefined,\n): AISpecRuntimeEnvVarSource | undefined {\n if (!value) return undefined;\n const source: AISpecRuntimeEnvVarSource = {};\n const secretName = cleanString(value.secretKeyRef?.name);\n const secretKey = cleanString(value.secretKeyRef?.key);\n if (secretName && secretKey)\n source.secretKeyRef = { name: secretName, key: secretKey };\n const configMapName = cleanString(value.configMapKeyRef?.name);\n const configMapKey = cleanString(value.configMapKeyRef?.key);\n if (configMapName && configMapKey) {\n source.configMapKeyRef = { name: configMapName, key: configMapKey };\n }\n const serviceAccount = cleanString(value.serviceAccount);\n if (serviceAccount) source.serviceAccount = serviceAccount;\n const helmName = cleanString(value.helmRef?.name);\n const helmKey = cleanString(value.helmRef?.key);\n if (helmName && helmKey) source.helmRef = { name: helmName, key: helmKey };\n const onePassword = cleanString(value.onePassword);\n if (onePassword) source.onePassword = onePassword;\n return hasKeys(source) ? source : undefined;\n}\n\nfunction compactSetupCheckout(\n value: AISpecRuntimeSetup[\"checkout\"] | undefined,\n): NonNullable<AISpecRuntimeSetup[\"checkout\"]> | undefined {\n if (!value) return undefined;\n const checkout: NonNullable<AISpecRuntimeSetup[\"checkout\"]> = {};\n if (value.mode === \"remote\" || value.mode === \"local\")\n checkout.mode = value.mode;\n const url = cleanString(value.url);\n if (url) checkout.url = url;\n const path = cleanString(value.path);\n if (path) checkout.path = path;\n const connection = cleanString(value.connection);\n if (connection) checkout.connection = connection;\n const ref = cleanString(value.ref);\n if (ref) checkout.ref = ref;\n if (value.depth != null && Number.isFinite(value.depth) && value.depth > 0) {\n checkout.depth = Math.trunc(value.depth);\n }\n const since = cleanString(value.since);\n if (since) checkout.since = since;\n\n const worktree: NonNullable<\n NonNullable<AISpecRuntimeSetup[\"checkout\"]>[\"worktree\"]\n > = {};\n const worktreeMode = value.worktree?.mode;\n if (worktreeMode === \"new\" || worktreeMode === \"existing\") {\n worktree.mode = worktreeMode;\n }\n const worktreePrefix = cleanString(value.worktree?.prefix);\n if (worktreePrefix) worktree.prefix = worktreePrefix;\n const worktreeBase = cleanString(value.worktree?.base);\n if (worktreeBase) worktree.base = worktreeBase;\n const worktreePath = cleanString(value.worktree?.path);\n if (worktreePath) worktree.path = worktreePath;\n if (worktree.mode === \"new\" && value.worktree?.keep) worktree.keep = true;\n if (\n value.worktree?.uncommitted === \"clone\" ||\n value.worktree?.uncommitted === \"skip\"\n ) {\n worktree.uncommitted = value.worktree.uncommitted;\n }\n if (\n value.worktree?.ignored === \"clone\" ||\n value.worktree?.ignored === \"skip\"\n ) {\n worktree.ignored = value.worktree.ignored;\n }\n if (hasKeys(worktree)) checkout.worktree = worktree;\n\n const dirty: NonNullable<\n NonNullable<AISpecRuntimeSetup[\"checkout\"]>[\"dirty\"]\n > = {};\n const stash = value.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n dirty.stash = stash;\n }\n const dirtySince = cleanString(value.dirty?.since);\n if (dirtySince) dirty.since = dirtySince;\n if (hasKeys(dirty)) checkout.dirty = dirty;\n\n return hasKeys(checkout) ? checkout : undefined;\n}\n\nfunction compactToolPolicies(\n value: AISpecRuntimePermissions[\"tools\"] | undefined,\n) {\n const normalized = normalizeToolPolicies(value);\n return hasKeys(normalized) ? normalized : undefined;\n}\n\nfunction compactResourcePolicies(\n value: AISpecRuntimePermissions[\"plugins\"] | undefined,\n legacyEnabled?: string[] | undefined,\n) {\n const normalized = normalizeResourcePolicies(value, legacyEnabled);\n return hasKeys(normalized) ? normalized : undefined;\n}\n\nfunction compactMCPPermissions(\n value: AISpecRuntimeMCPPermissions | undefined,\n): AISpecRuntimeMCPPermissions | undefined {\n if (!value) return undefined;\n const out: AISpecRuntimeMCPPermissions = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key) continue;\n if (key === \"servers\") {\n const servers = Array.isArray(rawValue)\n ? compactList(\n rawValue.filter((item): item is string => typeof item === \"string\"),\n )\n : undefined;\n if (servers) out.servers = servers;\n continue;\n }\n if (key === \"disabled\") {\n if (rawValue === true) out.disabled = true;\n continue;\n }\n if (isSpecResourceMode(rawValue)) out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nexport function normalizeToolPolicies(\n value: AISpecRuntimePermissions[\"tools\"] | undefined,\n): AISpecRuntimeToolPolicies {\n const out: AISpecRuntimeToolPolicies = {};\n if (!value) return out;\n const legacy = value as AISpecRuntimeLegacyToolPermissions;\n for (const tool of compactList(legacy.allow) ?? []) out[tool] = \"allow\";\n for (const tool of compactList(legacy.deny) ?? []) out[tool] = \"deny\";\n for (const [rawKey, rawMode] of Object.entries(legacy.modes ?? {})) {\n const key = rawKey.trim();\n if (!key) continue;\n if (rawMode === \"enabled\") out[key] = \"auto\";\n if (rawMode === \"ask\") out[key] = \"ask\";\n if (rawMode === \"disabled\") out[key] = \"deny\";\n }\n for (const [rawKey, policy] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || key === \"allow\" || key === \"deny\" || key === \"modes\") {\n continue;\n }\n if (isSpecToolPolicy(policy)) out[key] = policy;\n }\n return out;\n}\n\nexport function normalizeResourcePolicies(\n value: AISpecRuntimePermissions[\"plugins\"] | undefined,\n legacyEnabled?: string[] | undefined,\n): AISpecRuntimeResourcePolicies {\n const out: AISpecRuntimeResourcePolicies = {};\n for (const id of compactList(legacyEnabled) ?? []) out[id] = \"enabled\";\n if (!value) return out;\n if (Array.isArray(value)) {\n for (const id of compactList(value) ?? []) out[id] = \"enabled\";\n return out;\n }\n for (const [rawKey, rawMode] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key) continue;\n if (isSpecResourceMode(rawMode)) out[key] = rawMode;\n }\n return out;\n}\n\nexport function normalizeMCPPermissions(\n value: AISpecRuntimeMCPPermissions | undefined,\n): AISpecRuntimeMCPPermissions {\n const out: AISpecRuntimeMCPPermissions = {};\n if (!value) return out;\n const servers = compactList(value.servers);\n if (servers) out.servers = servers;\n if (value.disabled) out.disabled = true;\n for (const [rawKey, rawMode] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || key === \"servers\" || key === \"disabled\") continue;\n if (isSpecResourceMode(rawMode)) out[key] = rawMode;\n }\n return out;\n}\n\nfunction compactJSONValue(value: unknown) {\n if (value == null) return undefined;\n if (typeof value === \"string\") {\n const raw = value.trim();\n if (!raw) return undefined;\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n return value;\n}\n\nfunction compactList(value: string[] | undefined) {\n if (!value) return undefined;\n const out = Array.from(\n new Set(value.map((item) => item.trim()).filter(Boolean)),\n );\n return out.length > 0 ? out : undefined;\n}\n\nfunction cleanString(value: string | undefined) {\n return value?.trim() ?? \"\";\n}\n\n// Narrows an editor-held string (which may be \"\" while unset) to a member of an\n// enum, dropping anything the Go side would reject.\nfunction pickEnum<T extends string>(\n options: readonly T[],\n value: string | undefined,\n): T | undefined {\n return options.find((option) => option === value);\n}\n\nfunction hasKeys(value: object) {\n return Object.keys(value).length > 0;\n}\n\nfunction isSpecToolPolicy(value: unknown): value is SpecToolPolicy {\n return (\n value === \"auto\" || value === \"ask\" || value === \"allow\" || value === \"deny\"\n );\n}\n\nfunction isSpecResourceMode(value: unknown): value is SpecResourceMode {\n return value === \"enabled\" || value === \"disabled\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SpecRuntimeEditor.model.js","names":[],"sources":["../../../src/data/ai/SpecRuntimeEditor.model.ts"],"sourcesContent":["import type { ChatBudgetConfig } from \"../chat/types\";\nimport {\n normalizeToolPolicyRules,\n type PermissionPolicy,\n} from \"../chat/tool-policy\";\nimport {\n compactRuntimeSandbox,\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeSandbox,\n type SpecPermissionMode,\n} from \"./SpecRuntimeEditor.sandbox-model\";\n\nexport {\n SPEC_PERMISSION_MODES,\n SPEC_SANDBOX_MODES,\n} from \"./SpecRuntimeEditor.sandbox-model\";\nexport type {\n AISpecRuntimeSandbox,\n AISpecRuntimeSandboxDispatch,\n AISpecRuntimeSandboxFilesystemPolicy,\n AISpecRuntimeSandboxNetworkPolicy,\n AISpecRuntimeSandboxPolicy,\n SpecPermissionMode,\n SpecSandboxFilesystemAccess,\n SpecSandboxMode,\n SpecSandboxNetworkAccess,\n} from \"./SpecRuntimeEditor.sandbox-model\";\n\nexport const SPEC_TOOL_POLICIES = [\"auto\", \"ask\", \"allow\", \"deny\"] as const;\nexport type SpecToolPolicy = (typeof SPEC_TOOL_POLICIES)[number];\n\nexport const SPEC_RESOURCE_MODES = [\"enabled\", \"disabled\"] as const;\nexport type SpecResourceMode = (typeof SPEC_RESOURCE_MODES)[number];\n\nexport const SPEC_CHECKOUT_MODES = [\"none\", \"remote\", \"local\"] as const;\nexport type SpecCheckoutMode = (typeof SPEC_CHECKOUT_MODES)[number];\n\n/**\n * Sandbox capabilities an adapter may declare. Mirrors captain's\n * registry.SandboxCapability: the editor reads these to decide what to offer —\n * an agent picker needs `remote-exec`, and `isolate-workspace` conflicts with a\n * worktree or setup checkout.\n */\nexport const SPEC_SANDBOX_CAPABILITIES = [\n \"wrap-command\",\n \"remote-exec\",\n \"isolate-workspace\",\n \"egress-proxy\",\n] as const;\nexport type SpecSandboxCapability = (typeof SPEC_SANDBOX_CAPABILITIES)[number];\n\nexport const SPEC_WORKTREE_MODES = [\"none\", \"new\", \"existing\"] as const;\nexport type SpecWorktreeMode = (typeof SPEC_WORKTREE_MODES)[number];\n\nexport const SPEC_CLONE_MODES = [\"clone\", \"skip\"] as const;\nexport type SpecCloneMode = (typeof SPEC_CLONE_MODES)[number];\n\nexport const SPEC_STASH_MODES = [\n \"none\",\n \"untracked\",\n \"unstaged\",\n \"staged\",\n \"all\",\n] as const;\nexport type SpecStashMode = (typeof SPEC_STASH_MODES)[number];\n\nexport const SPEC_VERIFY_SCOPES = [\"all\", \"changed\"] as const;\nexport type SpecVerifyScope = (typeof SPEC_VERIFY_SCOPES)[number];\n\n// The lifecycle boundary a commit fires on, mirroring captain's api.CommitPhase:\n// \"turn\" after every loop iteration, \"agent\" once the generate/verify loop ends,\n// \"run\" after the worktree is merged away.\nexport const SPEC_COMMIT_PHASES = [\"turn\", \"agent\", \"run\"] as const;\nexport type SpecCommitPhase = (typeof SPEC_COMMIT_PHASES)[number];\n\nexport const SPEC_COMMIT_MODES = [\"commit\", \"fixup\", \"amend\"] as const;\nexport type SpecCommitMode = (typeof SPEC_COMMIT_MODES)[number];\n\nexport const SPEC_COMMIT_CONDITIONS = [\n \"always\",\n \"onSuccess\",\n \"onVerify\",\n] as const;\nexport type SpecCommitCondition = (typeof SPEC_COMMIT_CONDITIONS)[number];\n\nexport const SPEC_COMMIT_STAGES = [\"worktree\", \"changed\"] as const;\nexport type SpecCommitStage = (typeof SPEC_COMMIT_STAGES)[number];\n\nexport const SPEC_COMMIT_GATES = [\"none\", \"cheap\", \"full\"] as const;\nexport type SpecCommitGates = (typeof SPEC_COMMIT_GATES)[number];\n\nexport const SPEC_SCHEMA_STRICTNESS = [\"warning\", \"error\", \"repair\"] as const;\nexport type SpecSchemaStrictness = (typeof SPEC_SCHEMA_STRICTNESS)[number];\n\nexport type AISpecRuntimePrompt = {\n user?: string;\n system?: string;\n appendSystem?: string;\n schemaJSON?: unknown;\n schemaStrictness?: SpecSchemaStrictness | \"retry\" | \"\";\n attachments?: AISpecRuntimeAttachment[];\n};\n\nexport type AISpecRuntimeAttachment = {\n id?: string;\n path?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n size?: number;\n sha256?: string;\n};\n\nexport type AISpecRuntimeModelFallback = {\n model?: string;\n id?: string;\n /** The canonical runtime mode: api | agent | cli | cmux. */\n mode?: string;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n};\n\nexport type AISpecRuntimeMemory = {\n skills?: string[];\n skipProject?: boolean;\n skipUser?: boolean;\n skipSkills?: boolean;\n skipHooks?: boolean;\n skipMemory?: boolean;\n bare?: boolean;\n};\n\nexport type AISpecRuntimeToolPolicies = Record<string, SpecToolPolicy>;\n\nexport type AISpecRuntimeLegacyToolPermissions = {\n allow?: string[];\n deny?: string[];\n modes?: Record<string, string>;\n};\n\nexport type AISpecRuntimeResourcePolicies = Record<string, SpecResourceMode>;\n\nexport type AISpecRuntimeMCPPermissions = {\n disabled?: boolean;\n servers?: string[];\n [name: string]: SpecResourceMode | string[] | boolean | undefined;\n};\n\nexport type AISpecRuntimePermissions = {\n // The base posture, independent of the sandbox: isolation bounds what the\n // process can reach, while the mode decides whether the agent asks before\n // acting. A run can ask for `plan` with no sandbox at all.\n mode?: SpecPermissionMode;\n presets?: string[];\n tools?: AISpecRuntimeToolPolicies | AISpecRuntimeLegacyToolPermissions;\n mcp?: AISpecRuntimeMCPPermissions;\n plugins?: AISpecRuntimeResourcePolicies | string[];\n skills?: AISpecRuntimeResourcePolicies | string[];\n};\n\nexport type AISpecRuntimePermissionCatalogItem = {\n id: string;\n label?: string;\n group?: string;\n description?: string;\n source?: string;\n sourcePath?: string;\n configured?: boolean;\n available?: boolean;\n defaultMode?: string;\n};\n\nexport type AISpecRuntimePermissionCatalog = {\n tools?: AISpecRuntimePermissionCatalogItem[];\n mcp?: AISpecRuntimePermissionCatalogItem[];\n plugins?: AISpecRuntimePermissionCatalogItem[];\n skills?: AISpecRuntimePermissionCatalogItem[];\n};\n\nexport type AISpecRuntimeBudget = ChatBudgetConfig & {\n maxTurns?: number;\n timeout?: string;\n};\n\nexport type AISpecRuntimeSpec = {\n model?: string;\n id?: string;\n /** The canonical runtime mode: api | agent | cli | cmux. */\n mode?: string;\n /**\n * Unified sandbox settings. A mode-only ref round-trips as a scalar.\n */\n sandbox?: string | AISpecRuntimeSandbox;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n fallbacks?: AISpecRuntimeModelFallback[];\n prompt?: AISpecRuntimePrompt;\n budget?: AISpecRuntimeBudget;\n memory?: AISpecRuntimeMemory;\n permissions?: AISpecRuntimePermissions;\n /** Ordered, last-match-wins Captain tool authority rules. */\n toolPolicy?: PermissionPolicy;\n setup?: AISpecRuntimeSetup;\n workflow?: AISpecRuntimeWorkflow;\n sessionId?: string;\n /** Extra cmux CLI args (api.Spec.cliArgs), keyed by option json name. */\n cliArgs?: Record<string, unknown>;\n};\n\nexport type AISpecRuntimeEnvVarSource = {\n secretKeyRef?: { name?: string; key?: string };\n configMapKeyRef?: { name?: string; key?: string };\n serviceAccount?: string;\n helmRef?: { name?: string; key?: string };\n onePassword?: string;\n};\n\nexport type AISpecRuntimeEnvVar = {\n name?: string;\n value?: string;\n valueFrom?: string | AISpecRuntimeEnvVarSource;\n};\n\nexport type AISpecRuntimeConnections = {\n fromConfigItem?: string;\n eksPodIdentity?: boolean;\n serviceAccount?: boolean;\n aws?: {\n connection?: string;\n accessKey?: AISpecRuntimeEnvVar;\n secretKey?: AISpecRuntimeEnvVar;\n sessionToken?: AISpecRuntimeEnvVar;\n assumeRole?: string;\n region?: string;\n endpoint?: string;\n skipTLSVerify?: boolean;\n };\n gcp?: {\n connection?: string;\n credentials?: AISpecRuntimeEnvVar;\n endpoint?: string;\n project?: string;\n skipTLSVerify?: boolean;\n };\n azure?: {\n connection?: string;\n clientID?: AISpecRuntimeEnvVar;\n clientSecret?: AISpecRuntimeEnvVar;\n tenantID?: string;\n };\n kubernetes?: {\n connection?: string;\n kubeconfig?: AISpecRuntimeEnvVar;\n eks?: Record<string, unknown>;\n gke?: Record<string, unknown>;\n cnrm?: Record<string, unknown>;\n };\n};\n\nexport type AISpecRuntimeSetup = {\n cwd?: string;\n baseDir?: string;\n dotenv?: string[];\n envVars?: AISpecRuntimeEnvVar[];\n connections?: AISpecRuntimeConnections;\n checkout?: {\n mode?: SpecCheckoutMode | \"\";\n url?: string;\n path?: string;\n connection?: string;\n ref?: string;\n depth?: number;\n since?: string;\n worktree?: {\n mode?: SpecWorktreeMode | \"\";\n prefix?: string;\n base?: string;\n path?: string;\n keep?: boolean;\n uncommitted?: SpecCloneMode | \"\";\n ignored?: SpecCloneMode | \"\";\n };\n dirty?: {\n stash?: SpecStashMode | \"\";\n since?: string;\n };\n };\n};\n\nexport type AISpecRuntimeVerify = {\n fixture?: string;\n scope?: SpecVerifyScope | \"\";\n maxIterations?: number;\n /** Shell commands run as part of verification, alongside the fixture. */\n commands?: string[];\n /** Named prompt templates run as part of verification. */\n prompts?: string[];\n};\n\n// Mirrors captain's api.Commit: one commit policy keyed to a lifecycle phase.\n// Every field is optional because an omitted field means \"captain's default\",\n// which is why an empty stanza is still meaningful — see compactCommits.\nexport type AISpecRuntimeCommit = {\n on?: SpecCommitPhase | \"\";\n mode?: SpecCommitMode | \"\";\n when?: SpecCommitCondition | \"\";\n message?: string;\n anchor?: string;\n squash?: boolean;\n base?: string;\n stage?: SpecCommitStage | \"\";\n gates?: SpecCommitGates | \"\";\n dryRun?: boolean;\n};\n\n// Mirrors captain's api.Workflow (verify + commits) so the SpecRuntimeEditor's\n// Verify/Commit sections round-trip through the spec frontmatter. Unlike the\n// prior client-only shape, this is part of the compacted spec.\nexport type AISpecRuntimeWorkflow = {\n verify?: AISpecRuntimeVerify;\n commits?: AISpecRuntimeCommit[];\n};\n\nexport type AISpecRuntimeValue = AISpecRuntimeSpec;\n\nexport type AISpecRuntimePayload = {\n spec?: AISpecRuntimeSpec;\n};\n\nexport function buildAISpecRuntimePayload(\n value: AISpecRuntimeValue,\n): AISpecRuntimePayload {\n const payload: AISpecRuntimePayload = {};\n const spec = compactAISpecRuntime(value);\n if (hasKeys(spec)) payload.spec = spec;\n return payload;\n}\n\nexport function compactAISpecRuntime(\n value: AISpecRuntimeValue,\n): AISpecRuntimeSpec {\n const spec: AISpecRuntimeSpec = {};\n\n const model = cleanString(value.model);\n if (model) spec.model = model;\n const id = cleanString(value.id);\n if (id) spec.id = id;\n const specMode = cleanString(value.mode);\n if (specMode) spec.mode = specMode;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n spec.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) spec.effort = effort;\n if (value.noCache) spec.noCache = true;\n const fallbacks = compactFallbacks(value.fallbacks);\n if (fallbacks) spec.fallbacks = fallbacks;\n\n const prompt = compactPrompt(value.prompt);\n if (prompt) spec.prompt = prompt;\n const budget = compactBudget(value.budget);\n if (budget) spec.budget = budget;\n const memory = compactMemory(value.memory);\n if (memory) spec.memory = memory;\n const permissions = compactPermissions(\n value.permissions,\n value.memory?.skills,\n );\n if (permissions) spec.permissions = permissions;\n const toolPolicy = normalizeToolPolicyRules(value.toolPolicy);\n if (toolPolicy.length > 0) spec.toolPolicy = toolPolicy;\n const setup = compactSetup(value.setup);\n if (setup) spec.setup = setup;\n const workflow = compactWorkflow(value.workflow);\n if (workflow) spec.workflow = workflow;\n const sessionId = cleanString(value.sessionId);\n if (sessionId) spec.sessionId = sessionId;\n const sandbox = compactRuntimeSandbox(value.sandbox);\n if (sandbox !== undefined) spec.sandbox = sandbox;\n if (value.cliArgs && hasKeys(value.cliArgs)) spec.cliArgs = value.cliArgs;\n return spec;\n}\n\nfunction compactWorkflow(\n value: AISpecRuntimeWorkflow | undefined,\n): AISpecRuntimeWorkflow | undefined {\n if (!value) return undefined;\n const workflow: AISpecRuntimeWorkflow = {};\n const verify = compactVerify(value.verify);\n if (verify) workflow.verify = verify;\n const commits = compactCommits(value.commits);\n if (commits) workflow.commits = commits;\n return hasKeys(workflow) ? workflow : undefined;\n}\n\nfunction compactVerify(\n value: AISpecRuntimeVerify | undefined,\n): AISpecRuntimeVerify | undefined {\n if (!value) return undefined;\n const verify: AISpecRuntimeVerify = {};\n const fixture = cleanString(value.fixture);\n if (fixture) verify.fixture = fixture;\n if (value.scope === \"all\" || value.scope === \"changed\")\n verify.scope = value.scope;\n if (\n value.maxIterations != null &&\n Number.isFinite(value.maxIterations) &&\n value.maxIterations > 0\n ) {\n verify.maxIterations = Math.trunc(value.maxIterations);\n }\n const commands = compactList(value.commands);\n if (commands) verify.commands = commands;\n const prompts = compactList(value.prompts);\n if (prompts) verify.prompts = prompts;\n return hasKeys(verify) ? verify : undefined;\n}\n\n// Presence in the list is what turns committing on, so an empty stanza survives\n// compaction: `commits: [{}]` reads as \"one commit at the end of the run with\n// every default\". An absent list inherits; an explicit empty list disables commits.\nfunction compactCommits(\n value: AISpecRuntimeCommit[] | undefined,\n): AISpecRuntimeCommit[] | undefined {\n if (value === undefined) return undefined;\n return value.map(compactCommit);\n}\n\nfunction compactCommit(value: AISpecRuntimeCommit): AISpecRuntimeCommit {\n const commit: AISpecRuntimeCommit = {};\n const on = pickEnum(SPEC_COMMIT_PHASES, value.on);\n if (on) commit.on = on;\n const mode = pickEnum(SPEC_COMMIT_MODES, value.mode);\n if (mode) commit.mode = mode;\n const when = pickEnum(SPEC_COMMIT_CONDITIONS, value.when);\n if (when) commit.when = when;\n const message = cleanString(value.message);\n if (message) commit.message = message;\n const anchor = cleanString(value.anchor);\n if (anchor) commit.anchor = anchor;\n // Squash is a *bool in captain: `squash: false` is the instruction to keep the\n // fixup chain for review, so it cannot be pruned the way a plain flag is.\n if (value.squash != null) commit.squash = value.squash;\n const base = cleanString(value.base);\n if (base) commit.base = base;\n const stage = pickEnum(SPEC_COMMIT_STAGES, value.stage);\n if (stage) commit.stage = stage;\n const gates = pickEnum(SPEC_COMMIT_GATES, value.gates);\n if (gates) commit.gates = gates;\n if (value.dryRun) commit.dryRun = true;\n return commit;\n}\n\nfunction compactPrompt(\n value: AISpecRuntimePrompt | undefined,\n): AISpecRuntimePrompt | undefined {\n if (!value) return undefined;\n const prompt: AISpecRuntimePrompt = {};\n const user = cleanString(value.user);\n if (user) prompt.user = user;\n const system = cleanString(value.system);\n if (system) prompt.system = system;\n const appendSystem = cleanString(value.appendSystem);\n if (appendSystem) prompt.appendSystem = appendSystem;\n const schemaJSON = compactJSONValue(value.schemaJSON);\n if (schemaJSON !== undefined) prompt.schemaJSON = schemaJSON;\n if (\n value.schemaStrictness === \"warning\" ||\n value.schemaStrictness === \"error\" ||\n value.schemaStrictness === \"repair\" ||\n value.schemaStrictness === \"retry\"\n ) {\n prompt.schemaStrictness = value.schemaStrictness === \"retry\" ? \"repair\" : value.schemaStrictness;\n }\n const attachments = value.attachments\n ?.map((attachment) => compactAttachment(attachment))\n .filter(\n (attachment): attachment is AISpecRuntimeAttachment =>\n attachment !== undefined,\n );\n if (attachments && attachments.length > 0) prompt.attachments = attachments;\n return hasKeys(prompt) ? prompt : undefined;\n}\n\nfunction compactAttachment(\n value: AISpecRuntimeAttachment,\n): AISpecRuntimeAttachment | undefined {\n const attachment: AISpecRuntimeAttachment = {};\n for (const key of [\n \"id\",\n \"path\",\n \"url\",\n \"filename\",\n \"mediaType\",\n \"sha256\",\n ] as const) {\n const text = cleanString(value[key]);\n if (text) attachment[key] = text;\n }\n if (value.size != null && Number.isFinite(value.size) && value.size >= 0) {\n attachment.size = value.size;\n }\n return attachment.id || attachment.path || attachment.url\n ? attachment\n : undefined;\n}\n\nfunction compactFallbacks(\n value: AISpecRuntimeModelFallback[] | undefined,\n): AISpecRuntimeModelFallback[] | undefined {\n if (!value) return undefined;\n const out: AISpecRuntimeModelFallback[] = [];\n for (const item of value) {\n const model = cleanString(item.model);\n if (!model) continue;\n const fallback: AISpecRuntimeModelFallback = { model };\n const id = cleanString(item.id);\n if (id) fallback.id = id;\n const itemMode = cleanString(item.mode);\n if (itemMode) fallback.mode = itemMode;\n if (item.temperature != null && Number.isFinite(item.temperature)) {\n fallback.temperature = item.temperature;\n }\n const effort = cleanString(item.effort);\n if (effort) fallback.effort = effort;\n if (item.noCache) fallback.noCache = true;\n out.push(fallback);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction compactBudget(\n value: AISpecRuntimeBudget | undefined,\n): AISpecRuntimeBudget | undefined {\n if (!value) return undefined;\n const budget: AISpecRuntimeBudget = {};\n if (value.cost != null && Number.isFinite(value.cost) && value.cost > 0) {\n budget.cost = value.cost;\n }\n if (\n value.maxTokens != null &&\n Number.isFinite(value.maxTokens) &&\n value.maxTokens > 0\n ) {\n budget.maxTokens = Math.trunc(value.maxTokens);\n }\n if (\n value.maxTurns != null &&\n Number.isFinite(value.maxTurns) &&\n value.maxTurns > 0\n ) {\n budget.maxTurns = Math.trunc(value.maxTurns);\n }\n const timeout = cleanString(value.timeout);\n if (timeout) budget.timeout = timeout;\n return hasKeys(budget) ? budget : undefined;\n}\n\nfunction compactMemory(\n value: AISpecRuntimeMemory | undefined,\n): AISpecRuntimeMemory | undefined {\n if (!value) return undefined;\n const memory: AISpecRuntimeMemory = {};\n if (value.skipProject) memory.skipProject = true;\n if (value.skipUser) memory.skipUser = true;\n if (value.skipHooks) memory.skipHooks = true;\n if (value.skipMemory) memory.skipMemory = true;\n if (value.bare) memory.bare = true;\n return hasKeys(memory) ? memory : undefined;\n}\n\nfunction compactPermissions(\n value: AISpecRuntimePermissions | undefined,\n legacySkills?: string[] | undefined,\n): AISpecRuntimePermissions | undefined {\n if (!value && !legacySkills?.length) return undefined;\n const permissions: AISpecRuntimePermissions = {};\n const mode = cleanString(value?.mode);\n if (mode) {\n if (!SPEC_PERMISSION_MODES.includes(mode as SpecPermissionMode)) {\n throw new Error(`permissions.mode ${JSON.stringify(mode)} is invalid`);\n }\n permissions.mode = mode as SpecPermissionMode;\n }\n const presets = compactList(value?.presets);\n if (presets) permissions.presets = presets;\n\n const tools = compactToolPolicies(value?.tools);\n if (tools) permissions.tools = tools;\n\n const mcp = compactMCPPermissions(value?.mcp);\n if (mcp) permissions.mcp = mcp;\n\n const plugins = compactResourcePolicies(value?.plugins);\n if (plugins) permissions.plugins = plugins;\n const skills = compactResourcePolicies(value?.skills, legacySkills);\n if (skills) permissions.skills = skills;\n return hasKeys(permissions) ? permissions : undefined;\n}\n\nfunction compactSetup(\n value: AISpecRuntimeSetup | undefined,\n): AISpecRuntimeSetup | undefined {\n if (!value) return undefined;\n const setup: AISpecRuntimeSetup = {};\n const cwd = cleanString(value.cwd);\n if (cwd) setup.cwd = cwd;\n const baseDir = cleanString(value.baseDir);\n if (baseDir) setup.baseDir = baseDir;\n const dotenv = compactList(value.dotenv);\n if (dotenv) setup.dotenv = dotenv;\n const envVars = compactEnvVars(value.envVars);\n if (envVars) setup.envVars = envVars;\n if (value.connections && hasKeys(value.connections)) {\n setup.connections = structuredClone(value.connections);\n }\n const checkout = compactSetupCheckout(value.checkout);\n if (checkout) setup.checkout = checkout;\n return hasKeys(setup) ? setup : undefined;\n}\n\nfunction compactEnvVars(value: AISpecRuntimeEnvVar[] | undefined) {\n if (!value) return undefined;\n const out: AISpecRuntimeEnvVar[] = [];\n for (const item of value) {\n const name = cleanString(item.name);\n if (!name) continue;\n const env: AISpecRuntimeEnvVar = { name };\n const literal = cleanString(item.value);\n const valueFrom =\n typeof item.valueFrom === \"string\"\n ? compactEnvVarSource(item.valueFrom)\n : compactStructuredEnvVarSource(item.valueFrom);\n if (literal) env.value = literal;\n if (valueFrom) env.valueFrom = valueFrom;\n if (env.value || env.valueFrom) out.push(env);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction compactEnvVarSource(\n value: string | undefined,\n): AISpecRuntimeEnvVarSource | undefined {\n const source = cleanString(value);\n if (!source) return undefined;\n const [kind, rest = \"\"] = source.split(\"://\", 2);\n const [name = \"\", key = \"\"] = rest.split(\"/\", 2).map((part) => part.trim());\n if (!name) return undefined;\n if (kind === \"secret\" && key) return { secretKeyRef: { name, key } };\n if (kind === \"configmap\" && key) return { configMapKeyRef: { name, key } };\n if (kind === \"serviceaccount\") return { serviceAccount: name };\n if (kind === \"helm\" && key) return { helmRef: { name, key } };\n if (kind === \"op\" && rest) return { onePassword: source };\n return undefined;\n}\n\nfunction compactStructuredEnvVarSource(\n value: AISpecRuntimeEnvVarSource | undefined,\n): AISpecRuntimeEnvVarSource | undefined {\n if (!value) return undefined;\n const source: AISpecRuntimeEnvVarSource = {};\n const secretName = cleanString(value.secretKeyRef?.name);\n const secretKey = cleanString(value.secretKeyRef?.key);\n if (secretName && secretKey)\n source.secretKeyRef = { name: secretName, key: secretKey };\n const configMapName = cleanString(value.configMapKeyRef?.name);\n const configMapKey = cleanString(value.configMapKeyRef?.key);\n if (configMapName && configMapKey) {\n source.configMapKeyRef = { name: configMapName, key: configMapKey };\n }\n const serviceAccount = cleanString(value.serviceAccount);\n if (serviceAccount) source.serviceAccount = serviceAccount;\n const helmName = cleanString(value.helmRef?.name);\n const helmKey = cleanString(value.helmRef?.key);\n if (helmName && helmKey) source.helmRef = { name: helmName, key: helmKey };\n const onePassword = cleanString(value.onePassword);\n if (onePassword) source.onePassword = onePassword;\n return hasKeys(source) ? source : undefined;\n}\n\nfunction compactSetupCheckout(\n value: AISpecRuntimeSetup[\"checkout\"] | undefined,\n): NonNullable<AISpecRuntimeSetup[\"checkout\"]> | undefined {\n if (!value) return undefined;\n const checkout: NonNullable<AISpecRuntimeSetup[\"checkout\"]> = {};\n if (value.mode === \"remote\" || value.mode === \"local\")\n checkout.mode = value.mode;\n const url = cleanString(value.url);\n if (url) checkout.url = url;\n const path = cleanString(value.path);\n if (path) checkout.path = path;\n const connection = cleanString(value.connection);\n if (connection) checkout.connection = connection;\n const ref = cleanString(value.ref);\n if (ref) checkout.ref = ref;\n if (value.depth != null && Number.isFinite(value.depth) && value.depth > 0) {\n checkout.depth = Math.trunc(value.depth);\n }\n const since = cleanString(value.since);\n if (since) checkout.since = since;\n\n const worktree: NonNullable<\n NonNullable<AISpecRuntimeSetup[\"checkout\"]>[\"worktree\"]\n > = {};\n const worktreeMode = value.worktree?.mode;\n if (worktreeMode === \"new\" || worktreeMode === \"existing\") {\n worktree.mode = worktreeMode;\n }\n const worktreePrefix = cleanString(value.worktree?.prefix);\n if (worktreePrefix) worktree.prefix = worktreePrefix;\n const worktreeBase = cleanString(value.worktree?.base);\n if (worktreeBase) worktree.base = worktreeBase;\n const worktreePath = cleanString(value.worktree?.path);\n if (worktreePath) worktree.path = worktreePath;\n if (worktree.mode === \"new\" && value.worktree?.keep) worktree.keep = true;\n if (\n value.worktree?.uncommitted === \"clone\" ||\n value.worktree?.uncommitted === \"skip\"\n ) {\n worktree.uncommitted = value.worktree.uncommitted;\n }\n if (\n value.worktree?.ignored === \"clone\" ||\n value.worktree?.ignored === \"skip\"\n ) {\n worktree.ignored = value.worktree.ignored;\n }\n if (hasKeys(worktree)) checkout.worktree = worktree;\n\n const dirty: NonNullable<\n NonNullable<AISpecRuntimeSetup[\"checkout\"]>[\"dirty\"]\n > = {};\n const stash = value.dirty?.stash;\n if (\n stash === \"untracked\" ||\n stash === \"unstaged\" ||\n stash === \"staged\" ||\n stash === \"all\"\n ) {\n dirty.stash = stash;\n }\n const dirtySince = cleanString(value.dirty?.since);\n if (dirtySince) dirty.since = dirtySince;\n if (hasKeys(dirty)) checkout.dirty = dirty;\n\n return hasKeys(checkout) ? checkout : undefined;\n}\n\nfunction compactToolPolicies(\n value: AISpecRuntimePermissions[\"tools\"] | undefined,\n) {\n const normalized = normalizeToolPolicies(value);\n return hasKeys(normalized) ? normalized : undefined;\n}\n\nfunction compactResourcePolicies(\n value: AISpecRuntimePermissions[\"plugins\"] | undefined,\n legacyEnabled?: string[] | undefined,\n) {\n const normalized = normalizeResourcePolicies(value, legacyEnabled);\n return hasKeys(normalized) ? normalized : undefined;\n}\n\nfunction compactMCPPermissions(\n value: AISpecRuntimeMCPPermissions | undefined,\n): AISpecRuntimeMCPPermissions | undefined {\n if (!value) return undefined;\n const out: AISpecRuntimeMCPPermissions = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key) continue;\n if (key === \"servers\") {\n const servers = Array.isArray(rawValue)\n ? compactList(\n rawValue.filter((item): item is string => typeof item === \"string\"),\n )\n : undefined;\n if (servers) out.servers = servers;\n continue;\n }\n if (key === \"disabled\") {\n if (rawValue === true) out.disabled = true;\n continue;\n }\n if (isSpecResourceMode(rawValue)) out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nexport function normalizeToolPolicies(\n value: AISpecRuntimePermissions[\"tools\"] | undefined,\n): AISpecRuntimeToolPolicies {\n const out: AISpecRuntimeToolPolicies = {};\n if (!value) return out;\n const legacy = value as AISpecRuntimeLegacyToolPermissions;\n for (const tool of compactList(legacy.allow) ?? []) out[tool] = \"allow\";\n for (const tool of compactList(legacy.deny) ?? []) out[tool] = \"deny\";\n for (const [rawKey, rawMode] of Object.entries(legacy.modes ?? {})) {\n const key = rawKey.trim();\n if (!key) continue;\n if (rawMode === \"enabled\") out[key] = \"auto\";\n if (rawMode === \"ask\") out[key] = \"ask\";\n if (rawMode === \"disabled\") out[key] = \"deny\";\n }\n for (const [rawKey, policy] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || key === \"allow\" || key === \"deny\" || key === \"modes\") {\n continue;\n }\n if (isSpecToolPolicy(policy)) out[key] = policy;\n }\n return out;\n}\n\nexport function normalizeResourcePolicies(\n value: AISpecRuntimePermissions[\"plugins\"] | undefined,\n legacyEnabled?: string[] | undefined,\n): AISpecRuntimeResourcePolicies {\n const out: AISpecRuntimeResourcePolicies = {};\n for (const id of compactList(legacyEnabled) ?? []) out[id] = \"enabled\";\n if (!value) return out;\n if (Array.isArray(value)) {\n for (const id of compactList(value) ?? []) out[id] = \"enabled\";\n return out;\n }\n for (const [rawKey, rawMode] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key) continue;\n if (isSpecResourceMode(rawMode)) out[key] = rawMode;\n }\n return out;\n}\n\nexport function normalizeMCPPermissions(\n value: AISpecRuntimeMCPPermissions | undefined,\n): AISpecRuntimeMCPPermissions {\n const out: AISpecRuntimeMCPPermissions = {};\n if (!value) return out;\n const servers = compactList(value.servers);\n if (servers) out.servers = servers;\n if (value.disabled) out.disabled = true;\n for (const [rawKey, rawMode] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || key === \"servers\" || key === \"disabled\") continue;\n if (isSpecResourceMode(rawMode)) out[key] = rawMode;\n }\n return out;\n}\n\nfunction compactJSONValue(value: unknown) {\n if (value == null) return undefined;\n if (typeof value === \"string\") {\n const raw = value.trim();\n if (!raw) return undefined;\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n return value;\n}\n\nfunction compactList(value: string[] | undefined) {\n if (!value) return undefined;\n const out = Array.from(\n new Set(value.map((item) => item.trim()).filter(Boolean)),\n );\n return out.length > 0 ? out : undefined;\n}\n\nfunction cleanString(value: string | undefined) {\n return value?.trim() ?? \"\";\n}\n\n// Narrows an editor-held string (which may be \"\" while unset) to a member of an\n// enum, dropping anything the Go side would reject.\nfunction pickEnum<T extends string>(\n options: readonly T[],\n value: string | undefined,\n): T | undefined {\n return options.find((option) => option === value);\n}\n\nfunction hasKeys(value: object) {\n return Object.keys(value).length > 0;\n}\n\nfunction isSpecToolPolicy(value: unknown): value is SpecToolPolicy {\n return (\n value === \"auto\" || value === \"ask\" || value === \"allow\" || value === \"deny\"\n );\n}\n\nfunction isSpecResourceMode(value: unknown): value is SpecResourceMode {\n return value === \"enabled\" || value === \"disabled\";\n}\n"],"mappings":"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"}
|
|
@@ -199,7 +199,7 @@ function ThreadPicker({ threadId, onSelect, onNew, api = "/api/chat/sessions", s
|
|
|
199
199
|
canRename && renaming?.id !== t.id && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
200
200
|
type: "button",
|
|
201
201
|
"aria-label": "Rename conversation",
|
|
202
|
-
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100",
|
|
202
|
+
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100",
|
|
203
203
|
onClick: () => {
|
|
204
204
|
setRenaming({
|
|
205
205
|
id: t.id,
|
|
@@ -214,7 +214,7 @@ function ThreadPicker({ threadId, onSelect, onNew, api = "/api/chat/sessions", s
|
|
|
214
214
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
215
215
|
type: "button",
|
|
216
216
|
"aria-label": "Delete conversation",
|
|
217
|
-
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100",
|
|
217
|
+
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100",
|
|
218
218
|
onClick: () => void handleDelete(t.id),
|
|
219
219
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
|
|
220
220
|
icon: require_UiTrash.UiTrash,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadPicker.cjs","names":["useState","useRef","useCallback","DropdownMenu","Icon","UiComment","UiChevronDown","UiAdd","cn","UiPencilSimpleLine","UiTrash"],"sources":["../../../src/data/ai/ThreadPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n UiComment,\n UiAdd,\n UiTrash,\n UiChevronDown,\n UiPencilSimpleLine,\n} from \"../../icons\";\n\n/** One conversation as returned by the sessions endpoint. Only `id` is required;\n * `title`/cost are rendered when present so the picker works against minimal\n * backends (e.g. clicky's in-memory ThreadStore, which has no cost). */\nexport interface ThreadSummary {\n id: string;\n title?: string | null;\n totalCostUsd?: number | null;\n updatedAt?: string;\n}\n\n/** An injectable thread data source, for apps that load conversations through\n * their own client (e.g. react-query) rather than a plain `${api}` fetch — and\n * for backend-free stories/demos. When supplied it replaces the `api` calls. */\nexport interface ThreadSource {\n /** Returns the conversation list (re-invoked whenever the menu opens). */\n load: () => Promise<ThreadSummary[]>;\n /** Creates a durable conversation before its first message is sent. */\n create?: () => Promise<ThreadSummary>;\n /** Deletes a conversation. Omit to hide the delete affordance's effect. */\n remove?: (id: string) => Promise<void>;\n /** Renames a conversation. Omit to hide the rename affordance. */\n rename?: (id: string, title: string) => Promise<void>;\n}\n\nexport type ThreadPickerProps = {\n /** Currently selected thread, or null for an unsaved/new conversation. */\n threadId: string | null;\n onSelect: (threadId: string) => void;\n onNew: () => void;\n /** Base endpoint for session CRUD. GET lists, `${api}/${id}` DELETE removes\n * and PATCH renames. Defaults to Captain's \"/api/chat/sessions\". Ignored when\n * `source` is set. */\n api?: string;\n /** Inject the thread list/delete/rename directly instead of fetching `api`. */\n source?: ThreadSource;\n /** Optional query string appended to the list request (e.g. a scope id). */\n query?: string;\n /** Changing this refetches the list, so a title the backend derived during a\n * turn appears without reopening the menu. */\n refreshToken?: number;\n className?: string;\n};\n\n/** A dropdown to switch between, create, and delete conversation threads. The\n * list is (re)fetched whenever the menu opens, so newly-persisted threads\n * appear without a manual refresh. */\nexport function ThreadPicker({\n threadId,\n onSelect,\n onNew,\n api = \"/api/chat/sessions\",\n source,\n query,\n refreshToken,\n className = \"\",\n}: ThreadPickerProps) {\n const [threads, setThreads] = useState<ThreadSummary[]>([]);\n const [loading, setLoading] = useState(false);\n const [renaming, setRenaming] = useState<{ id: string; title: string }>();\n const loadRequest = useRef(0);\n const canRename = source ? Boolean(source.rename) : Boolean(api);\n\n const listUrl = query ? `${api}?${query}` : api;\n\n const fetchThreads = useCallback(async () => {\n const request = ++loadRequest.current;\n setLoading(true);\n try {\n let loaded: ThreadSummary[];\n if (source) {\n loaded = await source.load();\n } else {\n const res = await fetch(listUrl);\n if (!res.ok) throw new Error(`load failed with status ${res.status}`);\n loaded = await res.json();\n }\n if (request === loadRequest.current) setThreads(loaded);\n } catch (err) {\n console.warn(\"clicky-ui: failed to load threads\", err);\n } finally {\n if (request === loadRequest.current) setLoading(false);\n }\n }, [source, listUrl]);\n\n useEffect(() => {\n void fetchThreads();\n return () => {\n loadRequest.current += 1;\n };\n }, [fetchThreads, refreshToken]);\n\n const commitRename = useCallback(async () => {\n if (!renaming) return;\n const { id, title } = renaming;\n setRenaming(undefined);\n const trimmed = title.trim();\n const previous = threads.find((t) => t.id === id)?.title ?? null;\n if (!trimmed || trimmed === previous) return;\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: trimmed } : t)),\n );\n try {\n if (source) {\n await source.rename?.(id, trimmed);\n } else {\n const res = await fetch(`${api}/${id}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: trimmed }),\n });\n if (!res.ok) throw new Error(`rename failed with status ${res.status}`);\n }\n } catch (err) {\n console.warn(\"clicky-ui: failed to rename thread\", err);\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: previous } : t)),\n );\n }\n }, [api, renaming, source, threads]);\n\n const handleDelete = useCallback(\n async (id: string) => {\n try {\n if (source) {\n await source.remove?.(id);\n } else {\n await fetch(`${api}/${id}`, { method: \"DELETE\" });\n }\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === threadId) onNew();\n } catch (err) {\n console.warn(\"clicky-ui: failed to delete thread\", err);\n }\n },\n [source, api, threadId, onNew],\n );\n\n const current = threads.find((t) => t.id === threadId);\n const label = current?.title || \"New Chat\";\n\n return (\n <DropdownMenu\n align=\"left\"\n className={className}\n onOpenChange={(open) => {\n if (open) void fetchThreads();\n }}\n menuClassName=\"min-w-[220px] max-w-[320px] max-h-72 overflow-y-auto\"\n trigger={\n <button\n type=\"button\"\n className=\"flex max-w-[200px] items-center gap-1 truncate rounded px-2 py-1 text-sm font-medium hover:bg-muted\"\n >\n <Icon icon={UiComment} className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n <Icon icon={UiChevronDown} className=\"size-3 shrink-0 opacity-50\" />\n </button>\n }\n >\n {(closeMenu) => (\n <div className=\"py-1\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent\"\n onClick={() => {\n onNew();\n closeMenu();\n }}\n >\n <Icon icon={UiAdd} className=\"size-3\" /> New Chat\n </button>\n <div className=\"my-1 border-t border-border\" />\n {loading && threads.length === 0 && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n Loading…\n </div>\n )}\n {threads.length === 0 && !loading && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n No previous conversations\n </div>\n )}\n {threads.map((t) => (\n <div\n key={t.id}\n className={cn(\n \"group/thread flex w-full items-center gap-1 px-1 py-0.5 text-left text-xs hover:bg-accent\",\n t.id === threadId && \"font-semibold\",\n )}\n >\n {renaming?.id === t.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1\">\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <input\n autoFocus\n aria-label=\"Conversation title\"\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={renaming.title}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) =>\n setRenaming({ id: t.id, title: e.target.value })\n }\n onBlur={() => setRenaming(undefined)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") void commitRename();\n if (e.key === \"Escape\") setRenaming(undefined);\n }}\n />\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1 text-left\"\n onClick={() => {\n onSelect(t.id);\n closeMenu();\n }}\n >\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{t.title || \"Untitled\"}</span>\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </button>\n )}\n {canRename && renaming?.id !== t.id && (\n <button\n type=\"button\"\n aria-label=\"Rename conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100\"\n onClick={() => {\n setRenaming({ id: t.id, title: t.title ?? \"\" });\n }}\n >\n <Icon icon={UiPencilSimpleLine} className=\"size-3\" />\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Delete conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100\"\n onClick={() => void handleDelete(t.id)}\n >\n <Icon icon={UiTrash} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThreadPicker.cjs","names":["useState","useRef","useCallback","DropdownMenu","Icon","UiComment","UiChevronDown","UiAdd","cn","UiPencilSimpleLine","UiTrash"],"sources":["../../../src/data/ai/ThreadPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n UiComment,\n UiAdd,\n UiTrash,\n UiChevronDown,\n UiPencilSimpleLine,\n} from \"../../icons\";\n\n/** One conversation as returned by the sessions endpoint. Only `id` is required;\n * `title`/cost are rendered when present so the picker works against minimal\n * backends (e.g. clicky's in-memory ThreadStore, which has no cost). */\nexport interface ThreadSummary {\n id: string;\n title?: string | null;\n totalCostUsd?: number | null;\n updatedAt?: string;\n}\n\n/** An injectable thread data source, for apps that load conversations through\n * their own client (e.g. react-query) rather than a plain `${api}` fetch — and\n * for backend-free stories/demos. When supplied it replaces the `api` calls. */\nexport interface ThreadSource {\n /** Returns the conversation list (re-invoked whenever the menu opens). */\n load: () => Promise<ThreadSummary[]>;\n /** Creates a durable conversation before its first message is sent. */\n create?: () => Promise<ThreadSummary>;\n /** Deletes a conversation. Omit to hide the delete affordance's effect. */\n remove?: (id: string) => Promise<void>;\n /** Renames a conversation. Omit to hide the rename affordance. */\n rename?: (id: string, title: string) => Promise<void>;\n}\n\nexport type ThreadPickerProps = {\n /** Currently selected thread, or null for an unsaved/new conversation. */\n threadId: string | null;\n onSelect: (threadId: string) => void;\n onNew: () => void;\n /** Base endpoint for session CRUD. GET lists, `${api}/${id}` DELETE removes\n * and PATCH renames. Defaults to Captain's \"/api/chat/sessions\". Ignored when\n * `source` is set. */\n api?: string;\n /** Inject the thread list/delete/rename directly instead of fetching `api`. */\n source?: ThreadSource;\n /** Optional query string appended to the list request (e.g. a scope id). */\n query?: string;\n /** Changing this refetches the list, so a title the backend derived during a\n * turn appears without reopening the menu. */\n refreshToken?: number;\n className?: string;\n};\n\n/** A dropdown to switch between, create, and delete conversation threads. The\n * list is (re)fetched whenever the menu opens, so newly-persisted threads\n * appear without a manual refresh. */\nexport function ThreadPicker({\n threadId,\n onSelect,\n onNew,\n api = \"/api/chat/sessions\",\n source,\n query,\n refreshToken,\n className = \"\",\n}: ThreadPickerProps) {\n const [threads, setThreads] = useState<ThreadSummary[]>([]);\n const [loading, setLoading] = useState(false);\n const [renaming, setRenaming] = useState<{ id: string; title: string }>();\n const loadRequest = useRef(0);\n const canRename = source ? Boolean(source.rename) : Boolean(api);\n\n const listUrl = query ? `${api}?${query}` : api;\n\n const fetchThreads = useCallback(async () => {\n const request = ++loadRequest.current;\n setLoading(true);\n try {\n let loaded: ThreadSummary[];\n if (source) {\n loaded = await source.load();\n } else {\n const res = await fetch(listUrl);\n if (!res.ok) throw new Error(`load failed with status ${res.status}`);\n loaded = await res.json();\n }\n if (request === loadRequest.current) setThreads(loaded);\n } catch (err) {\n console.warn(\"clicky-ui: failed to load threads\", err);\n } finally {\n if (request === loadRequest.current) setLoading(false);\n }\n }, [source, listUrl]);\n\n useEffect(() => {\n void fetchThreads();\n return () => {\n loadRequest.current += 1;\n };\n }, [fetchThreads, refreshToken]);\n\n const commitRename = useCallback(async () => {\n if (!renaming) return;\n const { id, title } = renaming;\n setRenaming(undefined);\n const trimmed = title.trim();\n const previous = threads.find((t) => t.id === id)?.title ?? null;\n if (!trimmed || trimmed === previous) return;\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: trimmed } : t)),\n );\n try {\n if (source) {\n await source.rename?.(id, trimmed);\n } else {\n const res = await fetch(`${api}/${id}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: trimmed }),\n });\n if (!res.ok) throw new Error(`rename failed with status ${res.status}`);\n }\n } catch (err) {\n console.warn(\"clicky-ui: failed to rename thread\", err);\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: previous } : t)),\n );\n }\n }, [api, renaming, source, threads]);\n\n const handleDelete = useCallback(\n async (id: string) => {\n try {\n if (source) {\n await source.remove?.(id);\n } else {\n await fetch(`${api}/${id}`, { method: \"DELETE\" });\n }\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === threadId) onNew();\n } catch (err) {\n console.warn(\"clicky-ui: failed to delete thread\", err);\n }\n },\n [source, api, threadId, onNew],\n );\n\n const current = threads.find((t) => t.id === threadId);\n const label = current?.title || \"New Chat\";\n\n return (\n <DropdownMenu\n align=\"left\"\n className={className}\n onOpenChange={(open) => {\n if (open) void fetchThreads();\n }}\n menuClassName=\"min-w-[220px] max-w-[320px] max-h-72 overflow-y-auto\"\n trigger={\n <button\n type=\"button\"\n className=\"flex max-w-[200px] items-center gap-1 truncate rounded px-2 py-1 text-sm font-medium hover:bg-muted\"\n >\n <Icon icon={UiComment} className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n <Icon icon={UiChevronDown} className=\"size-3 shrink-0 opacity-50\" />\n </button>\n }\n >\n {(closeMenu) => (\n <div className=\"py-1\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent\"\n onClick={() => {\n onNew();\n closeMenu();\n }}\n >\n <Icon icon={UiAdd} className=\"size-3\" /> New Chat\n </button>\n <div className=\"my-1 border-t border-border\" />\n {loading && threads.length === 0 && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n Loading…\n </div>\n )}\n {threads.length === 0 && !loading && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n No previous conversations\n </div>\n )}\n {threads.map((t) => (\n <div\n key={t.id}\n className={cn(\n \"group/thread flex w-full items-center gap-1 px-1 py-0.5 text-left text-xs hover:bg-accent\",\n t.id === threadId && \"font-semibold\",\n )}\n >\n {renaming?.id === t.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1\">\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <input\n autoFocus\n aria-label=\"Conversation title\"\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={renaming.title}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) =>\n setRenaming({ id: t.id, title: e.target.value })\n }\n onBlur={() => setRenaming(undefined)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") void commitRename();\n if (e.key === \"Escape\") setRenaming(undefined);\n }}\n />\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1 text-left\"\n onClick={() => {\n onSelect(t.id);\n closeMenu();\n }}\n >\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{t.title || \"Untitled\"}</span>\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </button>\n )}\n {canRename && renaming?.id !== t.id && (\n <button\n type=\"button\"\n aria-label=\"Rename conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100\"\n onClick={() => {\n setRenaming({ id: t.id, title: t.title ?? \"\" });\n }}\n >\n <Icon icon={UiPencilSimpleLine} className=\"size-3\" />\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Delete conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100\"\n onClick={() => void handleDelete(t.id)}\n >\n <Icon icon={UiTrash} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n"],"mappings":"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"}
|
|
@@ -199,7 +199,7 @@ function ThreadPicker({ threadId, onSelect, onNew, api = "/api/chat/sessions", s
|
|
|
199
199
|
canRename && renaming?.id !== t.id && /* @__PURE__ */ jsx("button", {
|
|
200
200
|
type: "button",
|
|
201
201
|
"aria-label": "Rename conversation",
|
|
202
|
-
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100",
|
|
202
|
+
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100",
|
|
203
203
|
onClick: () => {
|
|
204
204
|
setRenaming({
|
|
205
205
|
id: t.id,
|
|
@@ -214,7 +214,7 @@ function ThreadPicker({ threadId, onSelect, onNew, api = "/api/chat/sessions", s
|
|
|
214
214
|
/* @__PURE__ */ jsx("button", {
|
|
215
215
|
type: "button",
|
|
216
216
|
"aria-label": "Delete conversation",
|
|
217
|
-
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100",
|
|
217
|
+
className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100",
|
|
218
218
|
onClick: () => void handleDelete(t.id),
|
|
219
219
|
children: /* @__PURE__ */ jsx(Icon, {
|
|
220
220
|
icon: UiTrash,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadPicker.js","names":[],"sources":["../../../src/data/ai/ThreadPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n UiComment,\n UiAdd,\n UiTrash,\n UiChevronDown,\n UiPencilSimpleLine,\n} from \"../../icons\";\n\n/** One conversation as returned by the sessions endpoint. Only `id` is required;\n * `title`/cost are rendered when present so the picker works against minimal\n * backends (e.g. clicky's in-memory ThreadStore, which has no cost). */\nexport interface ThreadSummary {\n id: string;\n title?: string | null;\n totalCostUsd?: number | null;\n updatedAt?: string;\n}\n\n/** An injectable thread data source, for apps that load conversations through\n * their own client (e.g. react-query) rather than a plain `${api}` fetch — and\n * for backend-free stories/demos. When supplied it replaces the `api` calls. */\nexport interface ThreadSource {\n /** Returns the conversation list (re-invoked whenever the menu opens). */\n load: () => Promise<ThreadSummary[]>;\n /** Creates a durable conversation before its first message is sent. */\n create?: () => Promise<ThreadSummary>;\n /** Deletes a conversation. Omit to hide the delete affordance's effect. */\n remove?: (id: string) => Promise<void>;\n /** Renames a conversation. Omit to hide the rename affordance. */\n rename?: (id: string, title: string) => Promise<void>;\n}\n\nexport type ThreadPickerProps = {\n /** Currently selected thread, or null for an unsaved/new conversation. */\n threadId: string | null;\n onSelect: (threadId: string) => void;\n onNew: () => void;\n /** Base endpoint for session CRUD. GET lists, `${api}/${id}` DELETE removes\n * and PATCH renames. Defaults to Captain's \"/api/chat/sessions\". Ignored when\n * `source` is set. */\n api?: string;\n /** Inject the thread list/delete/rename directly instead of fetching `api`. */\n source?: ThreadSource;\n /** Optional query string appended to the list request (e.g. a scope id). */\n query?: string;\n /** Changing this refetches the list, so a title the backend derived during a\n * turn appears without reopening the menu. */\n refreshToken?: number;\n className?: string;\n};\n\n/** A dropdown to switch between, create, and delete conversation threads. The\n * list is (re)fetched whenever the menu opens, so newly-persisted threads\n * appear without a manual refresh. */\nexport function ThreadPicker({\n threadId,\n onSelect,\n onNew,\n api = \"/api/chat/sessions\",\n source,\n query,\n refreshToken,\n className = \"\",\n}: ThreadPickerProps) {\n const [threads, setThreads] = useState<ThreadSummary[]>([]);\n const [loading, setLoading] = useState(false);\n const [renaming, setRenaming] = useState<{ id: string; title: string }>();\n const loadRequest = useRef(0);\n const canRename = source ? Boolean(source.rename) : Boolean(api);\n\n const listUrl = query ? `${api}?${query}` : api;\n\n const fetchThreads = useCallback(async () => {\n const request = ++loadRequest.current;\n setLoading(true);\n try {\n let loaded: ThreadSummary[];\n if (source) {\n loaded = await source.load();\n } else {\n const res = await fetch(listUrl);\n if (!res.ok) throw new Error(`load failed with status ${res.status}`);\n loaded = await res.json();\n }\n if (request === loadRequest.current) setThreads(loaded);\n } catch (err) {\n console.warn(\"clicky-ui: failed to load threads\", err);\n } finally {\n if (request === loadRequest.current) setLoading(false);\n }\n }, [source, listUrl]);\n\n useEffect(() => {\n void fetchThreads();\n return () => {\n loadRequest.current += 1;\n };\n }, [fetchThreads, refreshToken]);\n\n const commitRename = useCallback(async () => {\n if (!renaming) return;\n const { id, title } = renaming;\n setRenaming(undefined);\n const trimmed = title.trim();\n const previous = threads.find((t) => t.id === id)?.title ?? null;\n if (!trimmed || trimmed === previous) return;\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: trimmed } : t)),\n );\n try {\n if (source) {\n await source.rename?.(id, trimmed);\n } else {\n const res = await fetch(`${api}/${id}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: trimmed }),\n });\n if (!res.ok) throw new Error(`rename failed with status ${res.status}`);\n }\n } catch (err) {\n console.warn(\"clicky-ui: failed to rename thread\", err);\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: previous } : t)),\n );\n }\n }, [api, renaming, source, threads]);\n\n const handleDelete = useCallback(\n async (id: string) => {\n try {\n if (source) {\n await source.remove?.(id);\n } else {\n await fetch(`${api}/${id}`, { method: \"DELETE\" });\n }\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === threadId) onNew();\n } catch (err) {\n console.warn(\"clicky-ui: failed to delete thread\", err);\n }\n },\n [source, api, threadId, onNew],\n );\n\n const current = threads.find((t) => t.id === threadId);\n const label = current?.title || \"New Chat\";\n\n return (\n <DropdownMenu\n align=\"left\"\n className={className}\n onOpenChange={(open) => {\n if (open) void fetchThreads();\n }}\n menuClassName=\"min-w-[220px] max-w-[320px] max-h-72 overflow-y-auto\"\n trigger={\n <button\n type=\"button\"\n className=\"flex max-w-[200px] items-center gap-1 truncate rounded px-2 py-1 text-sm font-medium hover:bg-muted\"\n >\n <Icon icon={UiComment} className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n <Icon icon={UiChevronDown} className=\"size-3 shrink-0 opacity-50\" />\n </button>\n }\n >\n {(closeMenu) => (\n <div className=\"py-1\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent\"\n onClick={() => {\n onNew();\n closeMenu();\n }}\n >\n <Icon icon={UiAdd} className=\"size-3\" /> New Chat\n </button>\n <div className=\"my-1 border-t border-border\" />\n {loading && threads.length === 0 && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n Loading…\n </div>\n )}\n {threads.length === 0 && !loading && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n No previous conversations\n </div>\n )}\n {threads.map((t) => (\n <div\n key={t.id}\n className={cn(\n \"group/thread flex w-full items-center gap-1 px-1 py-0.5 text-left text-xs hover:bg-accent\",\n t.id === threadId && \"font-semibold\",\n )}\n >\n {renaming?.id === t.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1\">\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <input\n autoFocus\n aria-label=\"Conversation title\"\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={renaming.title}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) =>\n setRenaming({ id: t.id, title: e.target.value })\n }\n onBlur={() => setRenaming(undefined)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") void commitRename();\n if (e.key === \"Escape\") setRenaming(undefined);\n }}\n />\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1 text-left\"\n onClick={() => {\n onSelect(t.id);\n closeMenu();\n }}\n >\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{t.title || \"Untitled\"}</span>\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </button>\n )}\n {canRename && renaming?.id !== t.id && (\n <button\n type=\"button\"\n aria-label=\"Rename conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100\"\n onClick={() => {\n setRenaming({ id: t.id, title: t.title ?? \"\" });\n }}\n >\n <Icon icon={UiPencilSimpleLine} className=\"size-3\" />\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Delete conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100\"\n onClick={() => void handleDelete(t.id)}\n >\n <Icon icon={UiTrash} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA0DA,SAAgB,aAAa,EAC3B,UACA,UACA,OACA,MAAM,sBACN,QACA,OACA,cACA,YAAY,MACQ;CACpB,MAAM,CAAC,SAAS,cAAc,SAA0B,CAAC,CAAC;CAC1D,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,UAAU,eAAe,SAAwC;CACxE,MAAM,cAAc,OAAO,CAAC;CAC5B,MAAM,YAAY,SAAS,QAAQ,OAAO,MAAM,IAAI,QAAQ,GAAG;CAE/D,MAAM,UAAU,QAAQ,GAAG,IAAI,GAAG,UAAU;CAE5C,MAAM,eAAe,YAAY,YAAY;EAC3C,MAAM,UAAU,EAAE,YAAY;EAC9B,WAAW,IAAI;EACf,IAAI;GACF,IAAI;GACJ,IAAI,QACF,SAAS,MAAM,OAAO,KAAK;QACtB;IACL,MAAM,MAAM,MAAM,MAAM,OAAO;IAC/B,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,2BAA2B,IAAI,QAAQ;IACpE,SAAS,MAAM,IAAI,KAAK;GAC1B;GACA,IAAI,YAAY,YAAY,SAAS,WAAW,MAAM;EACxD,SAAS,KAAK;GACZ,QAAQ,KAAK,qCAAqC,GAAG;EACvD,UAAU;GACR,IAAI,YAAY,YAAY,SAAS,WAAW,KAAK;EACvD;CACF,GAAG,CAAC,QAAQ,OAAO,CAAC;CAEpB,gBAAgB;EACd,aAAkB;EAClB,aAAa;GACX,YAAY,WAAW;EACzB;CACF,GAAG,CAAC,cAAc,YAAY,CAAC;CAE/B,MAAM,eAAe,YAAY,YAAY;EAC3C,IAAI,CAAC,UAAU;EACf,MAAM,EAAE,IAAI,UAAU;EACtB,YAAY,KAAA,CAAS;EACrB,MAAM,UAAU,MAAM,KAAK;EAC3B,MAAM,WAAW,QAAQ,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS;EAC5D,IAAI,CAAC,WAAW,YAAY,UAAU;EACtC,YAAY,SACV,KAAK,KAAK,MAAO,EAAE,OAAO,KAAK;GAAE,GAAG;GAAG,OAAO;EAAQ,IAAI,CAAE,CAC9D;EACA,IAAI;GACF,IAAI,QACF,MAAM,OAAO,SAAS,IAAI,OAAO;QAC5B;IACL,MAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM;KACtC,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,6BAA6B,IAAI,QAAQ;GACxE;EACF,SAAS,KAAK;GACZ,QAAQ,KAAK,sCAAsC,GAAG;GACtD,YAAY,SACV,KAAK,KAAK,MAAO,EAAE,OAAO,KAAK;IAAE,GAAG;IAAG,OAAO;GAAS,IAAI,CAAE,CAC/D;EACF;CACF,GAAG;EAAC;EAAK;EAAU;EAAQ;CAAO,CAAC;CAEnC,MAAM,eAAe,YACnB,OAAO,OAAe;EACpB,IAAI;GACF,IAAI,QACF,MAAM,OAAO,SAAS,EAAE;QAExB,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,QAAQ,SAAS,CAAC;GAElD,YAAY,SAAS,KAAK,QAAQ,MAAM,EAAE,OAAO,EAAE,CAAC;GACpD,IAAI,OAAO,UAAU,MAAM;EAC7B,SAAS,KAAK;GACZ,QAAQ,KAAK,sCAAsC,GAAG;EACxD;CACF,GACA;EAAC;EAAQ;EAAK;EAAU;CAAK,CAC/B;CAGA,MAAM,QADU,QAAQ,MAAM,MAAM,EAAE,OAAO,QAC/B,CAAA,EAAS,SAAS;CAEhC,OACE,oBAAC,cAAD;EACE,OAAM;EACK;EACX,eAAe,SAAS;GACtB,IAAI,MAAM,aAAkB;EAC9B;EACA,eAAc;EACd,SACE,qBAAC,UAAD;GACE,MAAK;GACL,WAAU;GAFZ,UAAA;IAIE,oBAAC,MAAD;KAAM,MAAM;KAAW,WAAU;IAAqB,CAAA;IACtD,oBAAC,QAAD;KAAM,WAAU;KAAY,UAAA;IAAY,CAAA;IACxC,oBAAC,MAAD;KAAM,MAAM;KAAe,WAAU;IAA8B,CAAA;GAC7D;;EAGR,WAAA,cACA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,qBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe;MACb,MAAM;MACN,UAAU;KACZ;KANF,UAAA,CAQE,oBAAC,MAAD;MAAM,MAAM;MAAO,WAAU;KAAU,CAAA,GAAC,WAClC;;IACR,oBAAC,OAAD,EAAK,WAAU,8BAA+B,CAAA;IAC7C,WAAW,QAAQ,WAAW,KAC7B,oBAAC,OAAD;KAAK,WAAU;KAA4C,UAAA;IAEtD,CAAA;IAEN,QAAQ,WAAW,KAAK,CAAC,WACxB,oBAAC,OAAD;KAAK,WAAU;KAA4C,UAAA;IAEtD,CAAA;IAEN,QAAQ,KAAK,MACZ,qBAAC,OAAD;KAEE,WAAW,GACT,6FACA,EAAE,OAAO,YAAY,eACvB;KALF,UAAA;MAOG,UAAU,OAAO,EAAE,KAClB,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,oBAAC,MAAD;SAAM,MAAM;SAAW,WAAU;QAAmB,CAAA;QACpD,oBAAC,SAAD;SACE,WAAA;SACA,cAAW;SACX,WAAU;SACV,OAAO,SAAS;SAChB,UAAU,MAAM,EAAE,gBAAgB;SAClC,WAAW,MACT,YAAY;UAAE,IAAI,EAAE;UAAI,OAAO,EAAE,OAAO;SAAM,CAAC;SAEjD,cAAc,YAAY,KAAA,CAAS;SACnC,YAAY,MAAM;UAChB,EAAE,gBAAgB;UAClB,IAAI,EAAE,QAAQ,SAAS,aAAkB;UACzC,IAAI,EAAE,QAAQ,UAAU,YAAY,KAAA,CAAS;SAC/C;QACD,CAAA;QACA,EAAE,gBAAgB,QAAQ,EAAE,eAAe,KAC1C,qBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CAA6D,KACzD,EAAE,aAAa,QAAQ,CAAC,CACtB;;OAEL;MAEL,CAAA,IAAA,qBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,eAAe;QACb,SAAS,EAAE,EAAE;QACb,UAAU;OACZ;OANF,UAAA;QAQE,oBAAC,MAAD;SAAM,MAAM;SAAW,WAAU;QAAmB,CAAA;QACpD,oBAAC,QAAD;SAAM,WAAU;SAA2B,UAAA,EAAE,SAAS;QAAiB,CAAA;QACtE,EAAE,gBAAgB,QAAQ,EAAE,eAAe,KAC1C,qBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CAA6D,KACzD,EAAE,aAAa,QAAQ,CAAC,CACtB;;OAEF;;MAET,aAAa,UAAU,OAAO,EAAE,MAC/B,oBAAC,UAAD;OACE,MAAK;OACL,cAAW;OACX,WAAU;OACV,eAAe;QACb,YAAY;SAAE,IAAI,EAAE;SAAI,OAAO,EAAE,SAAS;QAAG,CAAC;OAChD;OAEA,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAoB,WAAU;OAAU,CAAA;MAC9C,CAAA;MAEV,oBAAC,UAAD;OACE,MAAK;OACL,cAAW;OACX,WAAU;OACV,eAAe,KAAK,aAAa,EAAE,EAAE;OAErC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAS,WAAU;OAAU,CAAA;MACnC,CAAA;KACL;IArEE,GAAA,EAAE,EAqEJ,CACN;GACE;;CAEK,CAAA;AAElB"}
|
|
1
|
+
{"version":3,"file":"ThreadPicker.js","names":[],"sources":["../../../src/data/ai/ThreadPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n UiComment,\n UiAdd,\n UiTrash,\n UiChevronDown,\n UiPencilSimpleLine,\n} from \"../../icons\";\n\n/** One conversation as returned by the sessions endpoint. Only `id` is required;\n * `title`/cost are rendered when present so the picker works against minimal\n * backends (e.g. clicky's in-memory ThreadStore, which has no cost). */\nexport interface ThreadSummary {\n id: string;\n title?: string | null;\n totalCostUsd?: number | null;\n updatedAt?: string;\n}\n\n/** An injectable thread data source, for apps that load conversations through\n * their own client (e.g. react-query) rather than a plain `${api}` fetch — and\n * for backend-free stories/demos. When supplied it replaces the `api` calls. */\nexport interface ThreadSource {\n /** Returns the conversation list (re-invoked whenever the menu opens). */\n load: () => Promise<ThreadSummary[]>;\n /** Creates a durable conversation before its first message is sent. */\n create?: () => Promise<ThreadSummary>;\n /** Deletes a conversation. Omit to hide the delete affordance's effect. */\n remove?: (id: string) => Promise<void>;\n /** Renames a conversation. Omit to hide the rename affordance. */\n rename?: (id: string, title: string) => Promise<void>;\n}\n\nexport type ThreadPickerProps = {\n /** Currently selected thread, or null for an unsaved/new conversation. */\n threadId: string | null;\n onSelect: (threadId: string) => void;\n onNew: () => void;\n /** Base endpoint for session CRUD. GET lists, `${api}/${id}` DELETE removes\n * and PATCH renames. Defaults to Captain's \"/api/chat/sessions\". Ignored when\n * `source` is set. */\n api?: string;\n /** Inject the thread list/delete/rename directly instead of fetching `api`. */\n source?: ThreadSource;\n /** Optional query string appended to the list request (e.g. a scope id). */\n query?: string;\n /** Changing this refetches the list, so a title the backend derived during a\n * turn appears without reopening the menu. */\n refreshToken?: number;\n className?: string;\n};\n\n/** A dropdown to switch between, create, and delete conversation threads. The\n * list is (re)fetched whenever the menu opens, so newly-persisted threads\n * appear without a manual refresh. */\nexport function ThreadPicker({\n threadId,\n onSelect,\n onNew,\n api = \"/api/chat/sessions\",\n source,\n query,\n refreshToken,\n className = \"\",\n}: ThreadPickerProps) {\n const [threads, setThreads] = useState<ThreadSummary[]>([]);\n const [loading, setLoading] = useState(false);\n const [renaming, setRenaming] = useState<{ id: string; title: string }>();\n const loadRequest = useRef(0);\n const canRename = source ? Boolean(source.rename) : Boolean(api);\n\n const listUrl = query ? `${api}?${query}` : api;\n\n const fetchThreads = useCallback(async () => {\n const request = ++loadRequest.current;\n setLoading(true);\n try {\n let loaded: ThreadSummary[];\n if (source) {\n loaded = await source.load();\n } else {\n const res = await fetch(listUrl);\n if (!res.ok) throw new Error(`load failed with status ${res.status}`);\n loaded = await res.json();\n }\n if (request === loadRequest.current) setThreads(loaded);\n } catch (err) {\n console.warn(\"clicky-ui: failed to load threads\", err);\n } finally {\n if (request === loadRequest.current) setLoading(false);\n }\n }, [source, listUrl]);\n\n useEffect(() => {\n void fetchThreads();\n return () => {\n loadRequest.current += 1;\n };\n }, [fetchThreads, refreshToken]);\n\n const commitRename = useCallback(async () => {\n if (!renaming) return;\n const { id, title } = renaming;\n setRenaming(undefined);\n const trimmed = title.trim();\n const previous = threads.find((t) => t.id === id)?.title ?? null;\n if (!trimmed || trimmed === previous) return;\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: trimmed } : t)),\n );\n try {\n if (source) {\n await source.rename?.(id, trimmed);\n } else {\n const res = await fetch(`${api}/${id}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: trimmed }),\n });\n if (!res.ok) throw new Error(`rename failed with status ${res.status}`);\n }\n } catch (err) {\n console.warn(\"clicky-ui: failed to rename thread\", err);\n setThreads((prev) =>\n prev.map((t) => (t.id === id ? { ...t, title: previous } : t)),\n );\n }\n }, [api, renaming, source, threads]);\n\n const handleDelete = useCallback(\n async (id: string) => {\n try {\n if (source) {\n await source.remove?.(id);\n } else {\n await fetch(`${api}/${id}`, { method: \"DELETE\" });\n }\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === threadId) onNew();\n } catch (err) {\n console.warn(\"clicky-ui: failed to delete thread\", err);\n }\n },\n [source, api, threadId, onNew],\n );\n\n const current = threads.find((t) => t.id === threadId);\n const label = current?.title || \"New Chat\";\n\n return (\n <DropdownMenu\n align=\"left\"\n className={className}\n onOpenChange={(open) => {\n if (open) void fetchThreads();\n }}\n menuClassName=\"min-w-[220px] max-w-[320px] max-h-72 overflow-y-auto\"\n trigger={\n <button\n type=\"button\"\n className=\"flex max-w-[200px] items-center gap-1 truncate rounded px-2 py-1 text-sm font-medium hover:bg-muted\"\n >\n <Icon icon={UiComment} className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n <Icon icon={UiChevronDown} className=\"size-3 shrink-0 opacity-50\" />\n </button>\n }\n >\n {(closeMenu) => (\n <div className=\"py-1\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent\"\n onClick={() => {\n onNew();\n closeMenu();\n }}\n >\n <Icon icon={UiAdd} className=\"size-3\" /> New Chat\n </button>\n <div className=\"my-1 border-t border-border\" />\n {loading && threads.length === 0 && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n Loading…\n </div>\n )}\n {threads.length === 0 && !loading && (\n <div className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n No previous conversations\n </div>\n )}\n {threads.map((t) => (\n <div\n key={t.id}\n className={cn(\n \"group/thread flex w-full items-center gap-1 px-1 py-0.5 text-left text-xs hover:bg-accent\",\n t.id === threadId && \"font-semibold\",\n )}\n >\n {renaming?.id === t.id ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1\">\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <input\n autoFocus\n aria-label=\"Conversation title\"\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={renaming.title}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) =>\n setRenaming({ id: t.id, title: e.target.value })\n }\n onBlur={() => setRenaming(undefined)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") void commitRename();\n if (e.key === \"Escape\") setRenaming(undefined);\n }}\n />\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1 text-left\"\n onClick={() => {\n onSelect(t.id);\n closeMenu();\n }}\n >\n <Icon icon={UiComment} className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{t.title || \"Untitled\"}</span>\n {t.totalCostUsd != null && t.totalCostUsd > 0 && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n ${t.totalCostUsd.toFixed(2)}\n </span>\n )}\n </button>\n )}\n {canRename && renaming?.id !== t.id && (\n <button\n type=\"button\"\n aria-label=\"Rename conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100\"\n onClick={() => {\n setRenaming({ id: t.id, title: t.title ?? \"\" });\n }}\n >\n <Icon icon={UiPencilSimpleLine} className=\"size-3\" />\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Delete conversation\"\n className=\"shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-destructive group-hover/thread:opacity-100 [@media(hover:none)]:opacity-100\"\n onClick={() => void handleDelete(t.id)}\n >\n <Icon icon={UiTrash} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n"],"mappings":"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"}
|
package/dist/data/ai/index.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export { runtimeSpecFields } from './runtime-spec-fields.js';
|
|
|
33
33
|
export { SpecRuntimeBar, type SpecRuntimeBarProps } from './SpecRuntimeBar.js';
|
|
34
34
|
export { useRuntimePresetMenu, type RuntimePresetMenuOptions, type RuntimePresetMenuValue, } from './runtime-preset-menu/index.js';
|
|
35
35
|
export { RuntimeBarActions, type RuntimeBarAction, type RuntimeBarActionsProps, } from '../runtime/RuntimeBarActions.js';
|
|
36
|
+
export { SEGMENT_CAPTION_CLASS, SEGMENT_KEY_CLASS, SegmentItemLabel, } from '../runtime/RuntimeBarSegment.js';
|
|
36
37
|
export { ProviderStatusPanel, type ProviderStatusPanelProps, } from '../runtime/ProviderStatusPanel.js';
|
|
37
38
|
export { RuntimeModePicker, type RuntimeModePickerProps, } from './RuntimeModePicker.js';
|
|
38
39
|
export { SPEC_RUNTIME_MODES, SPEC_RUNTIME_FAMILIES, modeForFamily, familiesFromRuntimeCatalog, familyById, familyForModel, familyForMode, labelForMode, modeOptionFor, modelBelongsToFamily, modelsForFamily, runtimeModeError, runtimeModeFromModel, runtimeModelError, runtimeModeOptions, selectionForMode, selectionForRuntime, type RuntimeCatalogFamily, type RuntimeCatalogMode, type RuntimeArgumentImplementation, type RuntimeArgumentMapping, type RuntimePermissionCapabilities, type RuntimePermissionSupport, type RuntimePermissionSupportKind, type RuntimeSpecSchema, type SpecRuntimeMode, type SpecRuntimeFamily, type SpecRuntimeModeOption, } from '../runtime/runtime-mode.js';
|
|
@@ -42,6 +43,7 @@ export { SessionContextMeter } from './SessionViewer.header.js';
|
|
|
42
43
|
export { serializeContext, parseContextPrefix, makeContextId, type ChatContextItem, type ContextTypeConfig, type ContextTypeStyle, } from './context.js';
|
|
43
44
|
export { SessionViewer, type SessionViewerProps, type SessionPendingTool, type SessionToolDecision, type SessionEntry, type SessionEvent, type SessionInput, type SessionThemeOverride, type SessionTokenSizer, type SessionTokenSize, type SessionTokenSizingRequest, type SessionTokenSizingResult, } from './SessionViewer.js';
|
|
44
45
|
export type { ApprovalDecisionFields, ApprovalKind, ApprovalQuestion, ApprovalRequest, ApprovalScope, CommandApproval, ElicitationApproval, ElicitationMode, FileChange, FilesystemApproval, FilesystemOperation, NativeSandboxPolicy, NetworkApproval, SandboxCommandPolicy, SandboxCredentialsPolicy, SandboxFilesystemAccess, SandboxFilesystemPolicy, SandboxNetworkAccess, SandboxNetworkPolicy, SandboxPlatformPolicy, StdinWrite, } from './approval-request.js';
|
|
46
|
+
export { usePromptRunStream, type PromptRunFrame, type PromptRunStreamOptions, type PromptRunStreamState, type PromptRunStreamStatus, type PromptRunSummary, } from './use-prompt-run-stream.js';
|
|
45
47
|
export { SessionTail, type SessionTailProps } from './SessionTail.js';
|
|
46
48
|
export { SessionInspector, type SessionInspectorOptions, type SessionInspectorProps, type SessionInspectorTab, } from './SessionInspector.js';
|
|
47
49
|
export { fetchRemoteSession, isTerminalSessionLifecycle, mergeSessionMessages, openRemoteSession, sessionUrl, DEFAULT_SESSION_PAGE_SIZE, TERMINAL_SESSION_LIFECYCLES, useRemoteSession, type RemoteSessionHandle, type RemoteSessionOptions, type RemoteSessionState, type RemoteSessionView, type SessionFollowState, type SessionInspectorLoadState, } from './SessionInspector.remote.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/ai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const require_event_source = require("../../hooks/event-source.cjs");
|
|
2
|
+
let react = require("react");
|
|
3
|
+
// src/data/ai/use-prompt-run-stream.ts
|
|
4
|
+
var IDLE = {
|
|
5
|
+
status: "idle",
|
|
6
|
+
entries: []
|
|
7
|
+
};
|
|
8
|
+
var RUNNING = {
|
|
9
|
+
status: "running",
|
|
10
|
+
entries: []
|
|
11
|
+
};
|
|
12
|
+
function upsertEntry(entries, entry) {
|
|
13
|
+
const index = entry.id ? entries.findIndex((existing) => existing.id === entry.id) : -1;
|
|
14
|
+
if (index < 0) return [...entries, entry];
|
|
15
|
+
const next = entries.slice();
|
|
16
|
+
next[index] = entry;
|
|
17
|
+
return next;
|
|
18
|
+
}
|
|
19
|
+
function frameData(event) {
|
|
20
|
+
return JSON.parse(event.data);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Follows a Captain prompt run by id: `idle` without one, `running` (with the
|
|
24
|
+
* session id from the `run` frame) until a terminal frame, then `succeeded` or
|
|
25
|
+
* `failed`. Callbacks are held in a ref, so passing a fresh `onDone` each render
|
|
26
|
+
* does not reopen the stream.
|
|
27
|
+
*/
|
|
28
|
+
function usePromptRunStream(runId, options = {}) {
|
|
29
|
+
const { baseUrl = "", onDone } = options;
|
|
30
|
+
const openStream = require_event_source.useEventSourceFactory();
|
|
31
|
+
const [tracked, setTracked] = (0, react.useState)();
|
|
32
|
+
const callbacks = (0, react.useRef)({ onDone });
|
|
33
|
+
callbacks.current = { onDone };
|
|
34
|
+
const openRef = (0, react.useRef)(openStream);
|
|
35
|
+
openRef.current = openStream;
|
|
36
|
+
(0, react.useEffect)(() => {
|
|
37
|
+
if (!runId) return;
|
|
38
|
+
let stale = false;
|
|
39
|
+
const runPath = `${baseUrl}/api/captain/prompt/runs/${encodeURIComponent(runId)}`;
|
|
40
|
+
const stream = openRef.current(`${runPath}/stream`);
|
|
41
|
+
const update = (next) => {
|
|
42
|
+
if (stale) return;
|
|
43
|
+
setTracked((tracked) => ({
|
|
44
|
+
runId,
|
|
45
|
+
state: next(tracked?.runId === runId ? tracked.state : RUNNING)
|
|
46
|
+
}));
|
|
47
|
+
};
|
|
48
|
+
const finish = (summary, fallbackError = "The prompt run failed.") => {
|
|
49
|
+
stream.close();
|
|
50
|
+
update((current) => {
|
|
51
|
+
const base = {
|
|
52
|
+
entries: current.entries,
|
|
53
|
+
...current.run ? { run: current.run } : {},
|
|
54
|
+
...summary.sessionId ? { sessionId: summary.sessionId } : current.sessionId ? { sessionId: current.sessionId } : {},
|
|
55
|
+
summary
|
|
56
|
+
};
|
|
57
|
+
return summary.success ? {
|
|
58
|
+
status: "succeeded",
|
|
59
|
+
...base
|
|
60
|
+
} : {
|
|
61
|
+
status: "failed",
|
|
62
|
+
...base,
|
|
63
|
+
error: summary.error || fallbackError
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
callbacks.current.onDone?.(summary);
|
|
67
|
+
};
|
|
68
|
+
stream.addEventListener("run", (event) => {
|
|
69
|
+
const { runId, status, model, provider, mode, sessionId } = frameData(event);
|
|
70
|
+
const run = {
|
|
71
|
+
...runId ? { runId } : {},
|
|
72
|
+
...status ? { status } : {},
|
|
73
|
+
...model ? { model } : {},
|
|
74
|
+
...provider ? { provider } : {},
|
|
75
|
+
...mode ? { mode } : {},
|
|
76
|
+
...sessionId ? { sessionId } : {}
|
|
77
|
+
};
|
|
78
|
+
update((current) => ({
|
|
79
|
+
...current,
|
|
80
|
+
run: {
|
|
81
|
+
...current.run,
|
|
82
|
+
...run
|
|
83
|
+
},
|
|
84
|
+
...sessionId ? { sessionId } : {}
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
stream.addEventListener("entry", (event) => {
|
|
88
|
+
const entry = frameData(event);
|
|
89
|
+
update((current) => ({
|
|
90
|
+
...current,
|
|
91
|
+
entries: upsertEntry(current.entries, entry)
|
|
92
|
+
}));
|
|
93
|
+
});
|
|
94
|
+
stream.addEventListener("done", (event) => {
|
|
95
|
+
finish(frameData(event), "The prompt run did not succeed.");
|
|
96
|
+
});
|
|
97
|
+
stream.addEventListener("error", (event) => {
|
|
98
|
+
const data = event.data;
|
|
99
|
+
if (data) {
|
|
100
|
+
finish({
|
|
101
|
+
...JSON.parse(data),
|
|
102
|
+
success: false
|
|
103
|
+
});
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
fetch(runPath).then((response) => {
|
|
107
|
+
if (response.status !== 404 || stale) return;
|
|
108
|
+
finish({
|
|
109
|
+
success: false,
|
|
110
|
+
error: "Captain no longer knows this prompt run; check its result before retrying."
|
|
111
|
+
});
|
|
112
|
+
}).catch((error) => {
|
|
113
|
+
console.warn(`prompt run ${runId}: snapshot probe after a dropped stream failed`, error);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
return () => {
|
|
117
|
+
stale = true;
|
|
118
|
+
stream.close();
|
|
119
|
+
};
|
|
120
|
+
}, [runId, baseUrl]);
|
|
121
|
+
if (!runId) return IDLE;
|
|
122
|
+
return tracked?.runId === runId ? tracked.state : RUNNING;
|
|
123
|
+
}
|
|
124
|
+
exports.usePromptRunStream = usePromptRunStream;
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=use-prompt-run-stream.cjs.map
|