@flanksource/clicky-ui 0.3.24 → 0.3.26
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 +1 -0
- package/dist/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +6 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +8 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +9 -1
- package/dist/chat.js.map +1 -1
- package/dist/comments/CommentCard.cjs +89 -14
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +90 -15
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +25 -2
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +25 -2
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +21 -14
- 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 +21 -14
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +1 -1
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.js +1 -1
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +6 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/DimensionField.cjs +56 -0
- package/dist/components/DimensionField.cjs.map +1 -0
- package/dist/components/DimensionField.d.ts +17 -0
- package/dist/components/DimensionField.d.ts.map +1 -0
- package/dist/components/DimensionField.js +56 -0
- package/dist/components/DimensionField.js.map +1 -0
- package/dist/components.cjs +4 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +4 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -5
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -5
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/TaskExecDetails.cjs +8 -3
- package/dist/data/TaskExecDetails.cjs.map +1 -1
- package/dist/data/TaskExecDetails.d.ts +4 -0
- package/dist/data/TaskExecDetails.d.ts.map +1 -1
- package/dist/data/TaskExecDetails.js +9 -4
- package/dist/data/TaskExecDetails.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +101 -7
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts +6 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +103 -9
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +2 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +2 -0
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -4
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.js +14 -4
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +1 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +18 -23
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +19 -24
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js +12 -21
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +2 -2
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +2 -2
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +2 -2
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
- package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
- package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.js +4 -2
- package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +5 -5
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +6 -5
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +5 -5
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +61 -37
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +62 -38
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +17 -20
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +18 -21
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +1 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -7
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +1 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/chat/Chat.cjs +8 -4
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +8 -4
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +11 -7
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +11 -7
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +64 -27
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +11 -4
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +64 -27
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.js +2 -1
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
- package/dist/data/chat/index.d.ts +2 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.cjs +132 -0
- package/dist/data/chat/tool-policy.cjs.map +1 -0
- package/dist/data/chat/tool-policy.d.ts +81 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -0
- package/dist/data/chat/tool-policy.js +132 -0
- package/dist/data/chat/tool-policy.js.map +1 -0
- package/dist/data/chat/types.cjs +20 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +41 -2
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +20 -0
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +10 -1
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +10 -1
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/debugConsoleSignal.cjs +64 -0
- package/dist/data/debugConsoleSignal.cjs.map +1 -0
- package/dist/data/debugConsoleSignal.d.ts +83 -0
- package/dist/data/debugConsoleSignal.d.ts.map +1 -0
- package/dist/data/debugConsoleSignal.js +64 -0
- package/dist/data/debugConsoleSignal.js.map +1 -0
- package/dist/data/har/HarPanel.cjs +20 -14
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +20 -14
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/types.d.ts +18 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.cjs +4 -42
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.js +5 -43
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
- package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
- package/dist/data/useDebugAction.cjs +29 -0
- package/dist/data/useDebugAction.cjs.map +1 -0
- package/dist/data/useDebugAction.d.ts +16 -0
- package/dist/data/useDebugAction.d.ts.map +1 -0
- package/dist/data/useDebugAction.js +29 -0
- package/dist/data/useDebugAction.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +16 -8
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -8
- package/dist/devtools/DebugConsole.cjs +138 -0
- package/dist/devtools/DebugConsole.cjs.map +1 -0
- package/dist/devtools/DebugConsole.d.ts +23 -0
- package/dist/devtools/DebugConsole.d.ts.map +1 -0
- package/dist/devtools/DebugConsole.js +138 -0
- package/dist/devtools/DebugConsole.js.map +1 -0
- package/dist/devtools/DebugConsoleButton.cjs +59 -0
- package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
- package/dist/devtools/DebugConsoleButton.d.ts +20 -0
- package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
- package/dist/devtools/DebugConsoleButton.js +59 -0
- package/dist/devtools/DebugConsoleButton.js.map +1 -0
- package/dist/devtools/DebugConsoleDock.cjs +112 -0
- package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
- package/dist/devtools/DebugConsoleDock.d.ts +26 -0
- package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
- package/dist/devtools/DebugConsoleDock.js +112 -0
- package/dist/devtools/DebugConsoleDock.js.map +1 -0
- package/dist/devtools/ExecutionDetail.cjs +135 -0
- package/dist/devtools/ExecutionDetail.cjs.map +1 -0
- package/dist/devtools/ExecutionDetail.d.ts +19 -0
- package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
- package/dist/devtools/ExecutionDetail.js +135 -0
- package/dist/devtools/ExecutionDetail.js.map +1 -0
- package/dist/devtools/debugClient.cjs +172 -0
- package/dist/devtools/debugClient.cjs.map +1 -0
- package/dist/devtools/debugClient.d.ts +98 -0
- package/dist/devtools/debugClient.d.ts.map +1 -0
- package/dist/devtools/debugClient.js +172 -0
- package/dist/devtools/debugClient.js.map +1 -0
- package/dist/devtools/debugStore.cjs +115 -0
- package/dist/devtools/debugStore.cjs.map +1 -0
- package/dist/devtools/debugStore.d.ts +83 -0
- package/dist/devtools/debugStore.d.ts.map +1 -0
- package/dist/devtools/debugStore.js +115 -0
- package/dist/devtools/debugStore.js.map +1 -0
- package/dist/devtools/dockState.cjs +51 -0
- package/dist/devtools/dockState.cjs.map +1 -0
- package/dist/devtools/dockState.d.ts +31 -0
- package/dist/devtools/dockState.d.ts.map +1 -0
- package/dist/devtools/dockState.js +51 -0
- package/dist/devtools/dockState.js.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
- package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
- package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.js +36 -0
- package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
- package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
- package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.js +150 -0
- package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
- package/dist/devtools/tabs/InspectionTab.cjs +316 -0
- package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
- package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
- package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
- package/dist/devtools/tabs/InspectionTab.js +316 -0
- package/dist/devtools/tabs/InspectionTab.js.map +1 -0
- package/dist/devtools/tabs/NetworkTab.cjs +91 -0
- package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
- package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
- package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
- package/dist/devtools/tabs/NetworkTab.js +91 -0
- package/dist/devtools/tabs/NetworkTab.js.map +1 -0
- package/dist/devtools/tabs/QueriesTab.cjs +85 -0
- package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
- package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
- package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
- package/dist/devtools/tabs/QueriesTab.js +85 -0
- package/dist/devtools/tabs/QueriesTab.js.map +1 -0
- package/dist/devtools/types.cjs +26 -0
- package/dist/devtools/types.cjs.map +1 -0
- package/dist/devtools/types.d.ts +235 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/devtools/types.js +26 -0
- package/dist/devtools/types.js.map +1 -0
- package/dist/devtools/useDebugStream.cjs +46 -0
- package/dist/devtools/useDebugStream.cjs.map +1 -0
- package/dist/devtools/useDebugStream.d.ts +23 -0
- package/dist/devtools/useDebugStream.d.ts.map +1 -0
- package/dist/devtools/useDebugStream.js +46 -0
- package/dist/devtools/useDebugStream.js.map +1 -0
- package/dist/devtools.cjs +51 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.ts +37 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +51 -0
- package/dist/devtools.js.map +1 -0
- package/dist/icons/components/UiOpenScad.cjs +10 -0
- package/dist/icons/components/UiOpenScad.cjs.map +1 -0
- package/dist/icons/components/UiOpenScad.d.ts +9 -0
- package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
- package/dist/icons/components/UiOpenScad.js +10 -0
- package/dist/icons/components/UiOpenScad.js.map +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +2 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +2 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +2 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +2 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +20 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -8
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +15 -10
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +11 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +15 -10
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +170 -49
- 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 +170 -49
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/overlay/CellActions.cjs +18 -124
- package/dist/overlay/CellActions.cjs.map +1 -1
- package/dist/overlay/CellActions.d.ts +1 -1
- package/dist/overlay/CellActions.d.ts.map +1 -1
- package/dist/overlay/CellActions.js +18 -124
- package/dist/overlay/CellActions.js.map +1 -1
- package/dist/overlay/ContextMenu.cjs +144 -0
- package/dist/overlay/ContextMenu.cjs.map +1 -0
- package/dist/overlay/ContextMenu.d.ts +8 -0
- package/dist/overlay/ContextMenu.d.ts.map +1 -0
- package/dist/overlay/ContextMenu.js +144 -0
- package/dist/overlay/ContextMenu.js.map +1 -0
- package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
- package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
- package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
- package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
- package/dist/profiles/connections/connectionBrowserModel.js +14 -65
- package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
- package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
- package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
- package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
- package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
- package/dist/profiles/connections/index.d.ts +1 -0
- package/dist/profiles/connections/index.d.ts.map +1 -1
- package/dist/profiles/connections/inspectionStatus.cjs +44 -0
- package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
- package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
- package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
- package/dist/profiles/connections/inspectionStatus.js +44 -0
- package/dist/profiles/connections/inspectionStatus.js.map +1 -0
- package/dist/profiles/connections/useInspection.cjs +123 -0
- package/dist/profiles/connections/useInspection.cjs.map +1 -0
- package/dist/profiles/connections/useInspection.d.ts +35 -0
- package/dist/profiles/connections/useInspection.d.ts.map +1 -0
- package/dist/profiles/connections/useInspection.js +123 -0
- package/dist/profiles/connections/useInspection.js.map +1 -0
- package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
- package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
- package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
- package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
- package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
- package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
- package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
- package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
- package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.js +137 -22
- package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
- package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
- package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
- package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
- package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.js +6 -3
- package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
- package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
- package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
- package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
- package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
- package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
- package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
- package/dist/profiles/query/profileSamplePayload.cjs +6 -4
- package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
- package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
- package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
- package/dist/profiles/query/profileSamplePayload.js +6 -4
- package/dist/profiles/query/profileSamplePayload.js.map +1 -1
- package/dist/profiles/query/profileSampleResult.cjs +26 -0
- package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
- package/dist/profiles/query/profileSampleResult.d.ts +11 -0
- package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
- package/dist/profiles/query/profileSampleResult.js +26 -0
- package/dist/profiles/query/profileSampleResult.js.map +1 -0
- package/dist/profiles/query/queryTargetPicker.cjs +5 -3
- package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
- package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
- package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
- package/dist/profiles/query/queryTargetPicker.js +5 -3
- package/dist/profiles/query/queryTargetPicker.js.map +1 -1
- package/dist/profiles/wizard/profileWizard.cjs +14 -5
- package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizard.js +15 -6
- package/dist/profiles/wizard/profileWizard.js.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
- package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
- package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.js +35 -6
- package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
- package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
- package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
- package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
- package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.js +33 -2
- package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
- package/dist/profiles.cjs +8 -2
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js +10 -4
- package/dist/profiles.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +21 -237
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +3 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +21 -237
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/FilterFormFields.cjs +240 -0
- package/dist/rpc/FilterFormFields.cjs.map +1 -0
- package/dist/rpc/FilterFormFields.d.ts +12 -0
- package/dist/rpc/FilterFormFields.d.ts.map +1 -0
- package/dist/rpc/FilterFormFields.js +240 -0
- package/dist/rpc/FilterFormFields.js.map +1 -0
- package/dist/rpc/router.cjs +3 -2
- package/dist/rpc/router.cjs.map +1 -1
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/router.js +3 -2
- package/dist/rpc/router.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +3 -1
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
- package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
- package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
- package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
- package/dist/data/query-info/QueryInfoDialog.js +0 -106
- package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
- package/dist/data/query-info/index.d.ts +0 -4
- package/dist/data/query-info/index.d.ts.map +0 -1
- package/dist/data/query-info/queryInfo.cjs +0 -42
- package/dist/data/query-info/queryInfo.cjs.map +0 -1
- package/dist/data/query-info/queryInfo.d.ts +0 -45
- package/dist/data/query-info/queryInfo.d.ts.map +0 -1
- package/dist/data/query-info/queryInfo.js +0 -42
- package/dist/data/query-info/queryInfo.js.map +0 -1
- package/dist/data/query-info/useQueryInfo.cjs +0 -48
- package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
- package/dist/data/query-info/useQueryInfo.d.ts +0 -26
- package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
- package/dist/data/query-info/useQueryInfo.js +0 -48
- package/dist/data/query-info/useQueryInfo.js.map +0 -1
|
@@ -1,25 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { normalizeToolPolicy } from "../chat/types.js";
|
|
2
|
+
import { resolveToolPolicy } from "../chat/tool-policy.js";
|
|
3
|
+
const POLICY_CYCLE = ["auto", "ask", "deny", "allow"];
|
|
4
|
+
const POLICY_LABEL = {
|
|
5
|
+
allow: "On",
|
|
4
6
|
auto: "Auto",
|
|
5
7
|
ask: "Ask",
|
|
6
|
-
|
|
8
|
+
deny: "Off"
|
|
7
9
|
};
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
+
const POLICY_DESCRIPTION = {
|
|
11
|
+
allow: "Always allow this tool to run automatically.",
|
|
10
12
|
auto: "Use the backend's default permission policy.",
|
|
11
13
|
ask: "Ask before running this tool.",
|
|
12
|
-
|
|
14
|
+
deny: "Hide this tool from the model."
|
|
13
15
|
};
|
|
14
16
|
const BADGE_LABEL = {
|
|
15
|
-
...
|
|
17
|
+
...POLICY_LABEL,
|
|
16
18
|
mixed: "Mixed"
|
|
17
19
|
};
|
|
18
20
|
const BADGE_DESCRIPTION = {
|
|
19
|
-
...
|
|
21
|
+
...POLICY_DESCRIPTION,
|
|
20
22
|
mixed: "Members have different permissions."
|
|
21
23
|
};
|
|
22
24
|
const NO_PARENT = "\0no-parent";
|
|
25
|
+
const RULE_RANKS = [
|
|
26
|
+
(rule) => rule.name === void 0 && rule.parent === void 0,
|
|
27
|
+
(rule) => rule.name === void 0,
|
|
28
|
+
() => true
|
|
29
|
+
];
|
|
30
|
+
function ruleRank(rule) {
|
|
31
|
+
return RULE_RANKS.findIndex((matches) => matches(rule));
|
|
32
|
+
}
|
|
33
|
+
function ruleKey(patterns) {
|
|
34
|
+
if (patterns === void 0) return "";
|
|
35
|
+
return (typeof patterns === "string" ? [patterns] : patterns).join(",");
|
|
36
|
+
}
|
|
37
|
+
function sameSubject(a, b) {
|
|
38
|
+
return ruleKey(a.name) === ruleKey(b.name) && ruleKey(a.group) === ruleKey(b.group) && ruleKey(a.parent) === ruleKey(b.parent);
|
|
39
|
+
}
|
|
40
|
+
function withUserRule(rules, rule) {
|
|
41
|
+
const replaced = rules.map(
|
|
42
|
+
(existing) => sameSubject(existing, rule) ? rule : existing
|
|
43
|
+
);
|
|
44
|
+
const next = replaced.includes(rule) ? replaced : [...replaced, rule];
|
|
45
|
+
return [...next].sort((a, b) => ruleRank(a) - ruleRank(b));
|
|
46
|
+
}
|
|
47
|
+
function effectiveToolPolicies({
|
|
48
|
+
tools,
|
|
49
|
+
surfacePolicy,
|
|
50
|
+
userRules,
|
|
51
|
+
fallback
|
|
52
|
+
}) {
|
|
53
|
+
const policy = [...surfacePolicy ?? [], ...userRules ?? []];
|
|
54
|
+
const resolved = {};
|
|
55
|
+
for (const tool of tools) {
|
|
56
|
+
const matched = resolveToolPolicy(policy, tool);
|
|
57
|
+
resolved[tool.name] = matched ?? tool.defaultPermission ?? fallback;
|
|
58
|
+
}
|
|
59
|
+
return resolved;
|
|
60
|
+
}
|
|
23
61
|
function groupedToolEntries(tools) {
|
|
24
62
|
const groups = {};
|
|
25
63
|
for (const tool of tools) {
|
|
@@ -61,7 +99,7 @@ function groupedToolEntriesWithPreferences(tools, value) {
|
|
|
61
99
|
const groups = groupedToolEntries(tools);
|
|
62
100
|
const known = new Set(tools.map((tool) => tool.name));
|
|
63
101
|
const customEntries = Object.entries(value).flatMap(([name, mode]) => {
|
|
64
|
-
const normalizedMode =
|
|
102
|
+
const normalizedMode = normalizeToolPolicy(mode);
|
|
65
103
|
if (known.has(name) || !normalizedMode) return [];
|
|
66
104
|
return [
|
|
67
105
|
{
|
|
@@ -81,29 +119,13 @@ function groupedToolEntriesWithPreferences(tools, value) {
|
|
|
81
119
|
if (customEntries.length === 0) return groups;
|
|
82
120
|
return [...groups, buildToolGroup("Custom", customEntries)];
|
|
83
121
|
}
|
|
84
|
-
function normalizeToolMode(value) {
|
|
85
|
-
switch (value.trim().toLowerCase()) {
|
|
86
|
-
case "on":
|
|
87
|
-
case "enabled":
|
|
88
|
-
return "on";
|
|
89
|
-
case "auto":
|
|
90
|
-
return "auto";
|
|
91
|
-
case "ask":
|
|
92
|
-
return "ask";
|
|
93
|
-
case "off":
|
|
94
|
-
case "disabled":
|
|
95
|
-
return "off";
|
|
96
|
-
default:
|
|
97
|
-
return void 0;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
122
|
function entryMode(entry, value) {
|
|
101
|
-
return
|
|
123
|
+
return normalizeToolPolicy(value[entry.key] ?? "") ?? entry.defaultPermission;
|
|
102
124
|
}
|
|
103
|
-
function
|
|
125
|
+
function groupToolPolicy(entries, value) {
|
|
104
126
|
return entries.reduce(
|
|
105
127
|
(mode, entry) => mostRestrictiveMode(mode, entryMode(entry, value)),
|
|
106
|
-
"
|
|
128
|
+
"allow"
|
|
107
129
|
);
|
|
108
130
|
}
|
|
109
131
|
function commonMode(entries, value) {
|
|
@@ -113,36 +135,38 @@ function commonMode(entries, value) {
|
|
|
113
135
|
return entries.every((entry) => entryMode(entry, value) === firstMode) ? firstMode : "mixed";
|
|
114
136
|
}
|
|
115
137
|
function nextMode(mode) {
|
|
116
|
-
const current =
|
|
117
|
-
return
|
|
138
|
+
const current = POLICY_CYCLE.indexOf(mode);
|
|
139
|
+
return POLICY_CYCLE[((current >= 0 ? current : 0) + 1) % POLICY_CYCLE.length];
|
|
118
140
|
}
|
|
119
141
|
function mostRestrictiveMode(a, b) {
|
|
120
142
|
return modeRank(a) >= modeRank(b) ? a : b;
|
|
121
143
|
}
|
|
122
144
|
function modeRank(mode) {
|
|
123
145
|
switch (mode) {
|
|
124
|
-
case "
|
|
146
|
+
case "allow":
|
|
125
147
|
return 0;
|
|
126
148
|
case "auto":
|
|
127
149
|
return 1;
|
|
128
150
|
case "ask":
|
|
129
151
|
return 2;
|
|
130
|
-
case "
|
|
152
|
+
case "deny":
|
|
131
153
|
return 3;
|
|
132
154
|
}
|
|
133
155
|
}
|
|
134
156
|
export {
|
|
135
157
|
BADGE_DESCRIPTION,
|
|
136
158
|
BADGE_LABEL,
|
|
137
|
-
MODE_CYCLE,
|
|
138
|
-
MODE_DESCRIPTION,
|
|
139
|
-
MODE_LABEL,
|
|
140
159
|
NO_PARENT,
|
|
160
|
+
POLICY_CYCLE,
|
|
161
|
+
POLICY_DESCRIPTION,
|
|
162
|
+
POLICY_LABEL,
|
|
141
163
|
commonMode,
|
|
164
|
+
effectiveToolPolicies,
|
|
142
165
|
entryMode,
|
|
143
|
-
|
|
166
|
+
groupToolPolicy,
|
|
144
167
|
groupedToolEntries,
|
|
145
168
|
groupedToolEntriesWithPreferences,
|
|
146
|
-
nextMode
|
|
169
|
+
nextMode,
|
|
170
|
+
withUserRule
|
|
147
171
|
};
|
|
148
172
|
//# sourceMappingURL=ToolPreferences.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.model.js","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"sourcesContent":["import type { ToolMeta, ToolMode } from \"../chat/types\";\n\nexport const MODE_CYCLE: ToolMode[] = [\"auto\", \"ask\", \"off\", \"on\"];\n\nexport const MODE_LABEL: Record<ToolMode, string> = {\n on: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n off: \"Off\",\n};\n\nexport const MODE_DESCRIPTION: Record<ToolMode, string> = {\n on: \"Always allow this tool to run automatically.\",\n auto: \"Use the backend's default permission policy.\",\n ask: \"Ask before running this tool.\",\n off: \"Hide this tool from the model.\",\n};\n\nexport type BadgeMode = ToolMode | \"mixed\";\n\nexport const BADGE_LABEL: Record<BadgeMode, string> = {\n ...MODE_LABEL,\n mixed: \"Mixed\",\n};\n\nexport const BADGE_DESCRIPTION: Record<BadgeMode, string> = {\n ...MODE_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\nexport type ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolMode;\n};\n\nexport const NO_PARENT = \"\\u0000no-parent\";\n\nexport type ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\nexport type ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport function groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const group = tool.group ?? \"Tools\";\n const entry: ToolPreferenceEntry = {\n key: tool.name,\n label: tool.label || tool.name,\n group,\n tool,\n defaultPermission: tool.defaultPermission ?? \"auto\",\n };\n (groups[group] ??= []).push(entry);\n }\n return Object.entries(groups)\n .map(([group, entries]) => buildToolGroup(group, entries))\n .sort((a, b) => a.group.localeCompare(b.group));\n}\n\nfunction buildToolGroup(\n group: string,\n entries: ToolPreferenceEntry[],\n): ToolGroup {\n const byParent: Record<string, ToolPreferenceEntry[]> = {};\n for (const entry of entries) {\n const parent = entry.tool.parent?.trim() || NO_PARENT;\n (byParent[parent] ??= []).push(entry);\n }\n const subGroups = Object.entries(byParent)\n .map(([parent, subEntries]) => ({\n parent,\n entries: [...subEntries].sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort(compareSubGroups);\n return {\n group,\n entries: [...entries].sort((a, b) => a.label.localeCompare(b.label)),\n subGroups,\n };\n}\n\nfunction compareSubGroups(a: ToolSubGroup, b: ToolSubGroup): number {\n if (a.parent === NO_PARENT) return b.parent === NO_PARENT ? 0 : -1;\n if (b.parent === NO_PARENT) return 1;\n return a.parent.localeCompare(b.parent);\n}\n\nexport function groupedToolEntriesWithPreferences(\n tools: ToolMeta[],\n value: Record<string, ToolMode>,\n): ToolGroup[] {\n const groups = groupedToolEntries(tools);\n const known = new Set(tools.map((tool) => tool.name));\n const customEntries = Object.entries(value).flatMap(([name, mode]) => {\n const normalizedMode = normalizeToolMode(mode);\n if (known.has(name) || !normalizedMode) return [];\n return [\n {\n key: name,\n label: name,\n group: \"Custom\",\n tool: {\n name,\n label: name,\n group: \"Custom\",\n defaultPermission: normalizedMode,\n },\n defaultPermission: normalizedMode,\n },\n ];\n });\n if (customEntries.length === 0) return groups;\n return [...groups, buildToolGroup(\"Custom\", customEntries)];\n}\n\nfunction normalizeToolMode(value: string): ToolMode | undefined {\n switch (value.trim().toLowerCase()) {\n case \"on\":\n case \"enabled\":\n return \"on\";\n case \"auto\":\n return \"auto\";\n case \"ask\":\n return \"ask\";\n case \"off\":\n case \"disabled\":\n return \"off\";\n default:\n return undefined;\n }\n}\n\nexport function entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolMode>,\n): ToolMode {\n return normalizeToolMode(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\nexport function groupToolMode(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolMode>,\n): ToolMode {\n return entries.reduce<ToolMode>(\n (mode, entry) => mostRestrictiveMode(mode, entryMode(entry, value)),\n \"on\",\n );\n}\n\nexport function commonMode(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolMode>,\n): BadgeMode {\n const first = entries[0];\n if (!first) return \"mixed\";\n const firstMode = entryMode(first, value);\n return entries.every((entry) => entryMode(entry, value) === firstMode)\n ? firstMode\n : \"mixed\";\n}\n\nexport function nextMode(mode: ToolMode): ToolMode {\n const current = MODE_CYCLE.indexOf(mode);\n return MODE_CYCLE[((current >= 0 ? current : 0) + 1) % MODE_CYCLE.length]!;\n}\n\nfunction mostRestrictiveMode(a: ToolMode, b: ToolMode): ToolMode {\n return modeRank(a) >= modeRank(b) ? a : b;\n}\n\nfunction modeRank(mode: ToolMode): number {\n switch (mode) {\n case \"on\":\n return 0;\n case \"auto\":\n return 1;\n case \"ask\":\n return 2;\n case \"off\":\n return 3;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolPreferences.model.js","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"sourcesContent":["import type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport { normalizeToolPolicy } from \"../chat/types\";\nimport {\n resolveToolPolicy,\n type PermissionPolicy,\n type PermissionRule,\n} from \"../chat/tool-policy\";\n\nexport const POLICY_CYCLE: ToolPolicy[] = [\"auto\", \"ask\", \"deny\", \"allow\"];\n\n/** On and Off stay as the control's labels — they read better on a toggle than\n * allow/deny do. The wire vocabulary is the policy; this is presentation. */\nexport const POLICY_LABEL: Record<ToolPolicy, string> = {\n allow: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n deny: \"Off\",\n};\n\nexport const POLICY_DESCRIPTION: Record<ToolPolicy, string> = {\n allow: \"Always allow this tool to run automatically.\",\n auto: \"Use the backend's default permission policy.\",\n ask: \"Ask before running this tool.\",\n deny: \"Hide this tool from the model.\",\n};\n\nexport type BadgePolicy = ToolPolicy | \"mixed\";\n\nexport const BADGE_LABEL: Record<BadgePolicy, string> = {\n ...POLICY_LABEL,\n mixed: \"Mixed\",\n};\n\nexport const BADGE_DESCRIPTION: Record<BadgePolicy, string> = {\n ...POLICY_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\nexport type ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolPolicy;\n};\n\nexport const NO_PARENT = \"\\u0000no-parent\";\n\nexport type ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\n/** A toggle in the popover emits one rule rather than writing a mode per tool.\n * Which control was used is the thing worth recording: a group toggle means\n * \"this whole family\", so it keeps applying to tools that arrive later, while\n * writing every current member's name would silently stop at today's catalog.\n *\n * Rules are held in specificity order — group, then group+parent, then name —\n * so a per-tool toggle beats the group toggle above it however they were\n * clicked. Position, not a precedence number, is what encodes that. */\nconst RULE_RANKS: ((rule: PermissionRule) => boolean)[] = [\n (rule) => rule.name === undefined && rule.parent === undefined,\n (rule) => rule.name === undefined,\n () => true,\n];\n\nfunction ruleRank(rule: PermissionRule): number {\n return RULE_RANKS.findIndex((matches) => matches(rule));\n}\n\nfunction ruleKey(patterns: PermissionRule[\"name\"]): string {\n if (patterns === undefined) return \"\";\n return (typeof patterns === \"string\" ? [patterns] : patterns).join(\",\");\n}\n\nfunction sameSubject(a: PermissionRule, b: PermissionRule): boolean {\n return (\n ruleKey(a.name) === ruleKey(b.name) &&\n ruleKey(a.group) === ruleKey(b.group) &&\n ruleKey(a.parent) === ruleKey(b.parent)\n );\n}\n\n/** Adds one toggle's rule to the user's list, replacing any earlier rule for the\n * same subject in place so re-toggling a control does not grow the list, and\n * keeping the list in specificity order. */\nexport function withUserRule(\n rules: PermissionPolicy,\n rule: PermissionRule,\n): PermissionPolicy {\n const replaced = rules.map((existing) =>\n sameSubject(existing, rule) ? rule : existing,\n );\n const next = replaced.includes(rule) ? replaced : [...replaced, rule];\n return [...next].sort((a, b) => ruleRank(a) - ruleRank(b));\n}\n\n/** The mode to show for each tool: the user's own rules over the surface's, then\n * what the catalog says about the tool, then the fallback.\n *\n * An explicit `auto` remains visible here so the control can advance from it\n * on the next toggle. The server applies its catalog fallback when enforcing\n * the emitted rule. */\nexport function effectiveToolPolicies({\n tools,\n surfacePolicy,\n userRules,\n fallback,\n}: {\n tools: ToolMeta[];\n surfacePolicy?: PermissionPolicy | undefined;\n userRules?: PermissionPolicy | undefined;\n fallback: ToolPolicy;\n}): Record<string, ToolPolicy> {\n const policy = [...(surfacePolicy ?? []), ...(userRules ?? [])];\n const resolved: Record<string, ToolPolicy> = {};\n for (const tool of tools) {\n const matched = resolveToolPolicy(policy, tool);\n resolved[tool.name] = matched ?? tool.defaultPermission ?? fallback;\n }\n return resolved;\n}\n\nexport type ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport function groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const group = tool.group ?? \"Tools\";\n const entry: ToolPreferenceEntry = {\n key: tool.name,\n label: tool.label || tool.name,\n group,\n tool,\n defaultPermission: tool.defaultPermission ?? \"auto\",\n };\n (groups[group] ??= []).push(entry);\n }\n return Object.entries(groups)\n .map(([group, entries]) => buildToolGroup(group, entries))\n .sort((a, b) => a.group.localeCompare(b.group));\n}\n\nfunction buildToolGroup(\n group: string,\n entries: ToolPreferenceEntry[],\n): ToolGroup {\n const byParent: Record<string, ToolPreferenceEntry[]> = {};\n for (const entry of entries) {\n const parent = entry.tool.parent?.trim() || NO_PARENT;\n (byParent[parent] ??= []).push(entry);\n }\n const subGroups = Object.entries(byParent)\n .map(([parent, subEntries]) => ({\n parent,\n entries: [...subEntries].sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort(compareSubGroups);\n return {\n group,\n entries: [...entries].sort((a, b) => a.label.localeCompare(b.label)),\n subGroups,\n };\n}\n\nfunction compareSubGroups(a: ToolSubGroup, b: ToolSubGroup): number {\n if (a.parent === NO_PARENT) return b.parent === NO_PARENT ? 0 : -1;\n if (b.parent === NO_PARENT) return 1;\n return a.parent.localeCompare(b.parent);\n}\n\nexport function groupedToolEntriesWithPreferences(\n tools: ToolMeta[],\n value: Record<string, ToolPolicy>,\n): ToolGroup[] {\n const groups = groupedToolEntries(tools);\n const known = new Set(tools.map((tool) => tool.name));\n const customEntries = Object.entries(value).flatMap(([name, mode]) => {\n const normalizedMode = normalizeToolPolicy(mode);\n if (known.has(name) || !normalizedMode) return [];\n return [\n {\n key: name,\n label: name,\n group: \"Custom\",\n tool: {\n name,\n label: name,\n group: \"Custom\",\n defaultPermission: normalizedMode,\n },\n defaultPermission: normalizedMode,\n },\n ];\n });\n if (customEntries.length === 0) return groups;\n return [...groups, buildToolGroup(\"Custom\", customEntries)];\n}\n\nexport function entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return normalizeToolPolicy(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\nexport function groupToolPolicy(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return entries.reduce<ToolPolicy>(\n (mode, entry) => mostRestrictiveMode(mode, entryMode(entry, value)),\n \"allow\",\n );\n}\n\nexport function commonMode(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): BadgePolicy {\n const first = entries[0];\n if (!first) return \"mixed\";\n const firstMode = entryMode(first, value);\n return entries.every((entry) => entryMode(entry, value) === firstMode)\n ? firstMode\n : \"mixed\";\n}\n\nexport function nextMode(mode: ToolPolicy): ToolPolicy {\n const current = POLICY_CYCLE.indexOf(mode);\n return POLICY_CYCLE[\n ((current >= 0 ? current : 0) + 1) % POLICY_CYCLE.length\n ]!;\n}\n\nfunction mostRestrictiveMode(a: ToolPolicy, b: ToolPolicy): ToolPolicy {\n return modeRank(a) >= modeRank(b) ? a : b;\n}\n\nfunction modeRank(mode: ToolPolicy): number {\n switch (mode) {\n case \"allow\":\n return 0;\n case \"auto\":\n return 1;\n case \"ask\":\n return 2;\n case \"deny\":\n return 3;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,10 @@ function ModeBadge({ mode }) {
|
|
|
13
13
|
{
|
|
14
14
|
className: utils.cn(
|
|
15
15
|
"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium",
|
|
16
|
-
mode === "
|
|
16
|
+
mode === "allow" && "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",
|
|
17
17
|
mode === "auto" && "bg-sky-500/10 text-sky-600 dark:text-sky-400",
|
|
18
18
|
mode === "ask" && "bg-amber-500/10 text-amber-600 dark:text-amber-500",
|
|
19
|
-
mode === "
|
|
19
|
+
mode === "deny" && "text-muted-foreground",
|
|
20
20
|
mode === "mixed" && "bg-muted text-muted-foreground ring-1 ring-inset ring-border"
|
|
21
21
|
),
|
|
22
22
|
title: ToolPreferences_model.BADGE_DESCRIPTION[mode],
|
|
@@ -91,7 +91,7 @@ function ToolRow({
|
|
|
91
91
|
{
|
|
92
92
|
className: utils.cn(
|
|
93
93
|
"min-w-0 truncate text-xs",
|
|
94
|
-
mode === "
|
|
94
|
+
mode === "deny" && "text-muted-foreground line-through"
|
|
95
95
|
),
|
|
96
96
|
children: entry.label
|
|
97
97
|
}
|
|
@@ -152,7 +152,7 @@ function ToolSubGroupBlock({
|
|
|
152
152
|
open,
|
|
153
153
|
onToggle,
|
|
154
154
|
onToggleEntry,
|
|
155
|
-
|
|
155
|
+
onCycleSubGroup
|
|
156
156
|
}) {
|
|
157
157
|
const hasParent = subGroup.parent !== ToolPreferences_model.NO_PARENT;
|
|
158
158
|
const rows = subGroup.entries.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -175,10 +175,7 @@ function ToolSubGroupBlock({
|
|
|
175
175
|
collapsed: !open,
|
|
176
176
|
mode: ToolPreferences_model.commonMode(subGroup.entries, value),
|
|
177
177
|
onCollapseToggle: onToggle,
|
|
178
|
-
onModeToggle: () =>
|
|
179
|
-
subGroup.entries,
|
|
180
|
-
ToolPreferences_model.groupToolMode(subGroup.entries, value)
|
|
181
|
-
)
|
|
178
|
+
onModeToggle: () => onCycleSubGroup(subGroup, ToolPreferences_model.groupToolPolicy(subGroup.entries, value))
|
|
182
179
|
}
|
|
183
180
|
),
|
|
184
181
|
open && rows
|
|
@@ -187,7 +184,7 @@ function ToolSubGroupBlock({
|
|
|
187
184
|
function CompactToolList({
|
|
188
185
|
groups,
|
|
189
186
|
value,
|
|
190
|
-
|
|
187
|
+
onRule,
|
|
191
188
|
emptyLabel = "No tools available"
|
|
192
189
|
}) {
|
|
193
190
|
const [expanded, setExpanded] = react.useState(() => /* @__PURE__ */ new Set());
|
|
@@ -201,13 +198,13 @@ function CompactToolList({
|
|
|
201
198
|
else next.add(key);
|
|
202
199
|
return next;
|
|
203
200
|
});
|
|
204
|
-
const handleToggle = (entry, current) =>
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
};
|
|
201
|
+
const handleToggle = (entry, current) => onRule({ name: entry.key, policy: ToolPreferences_model.nextMode(current) });
|
|
202
|
+
const cycleGroup = (group, current) => onRule({ group: group.group, policy: ToolPreferences_model.nextMode(current) });
|
|
203
|
+
const cycleSubGroup = (group, subGroup, current) => onRule({
|
|
204
|
+
group: group.group,
|
|
205
|
+
parent: subGroup.parent,
|
|
206
|
+
policy: ToolPreferences_model.nextMode(current)
|
|
207
|
+
});
|
|
211
208
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: groups.map((group) => {
|
|
212
209
|
const groupOpen = isOpen(group.group);
|
|
213
210
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
@@ -219,7 +216,7 @@ function CompactToolList({
|
|
|
219
216
|
collapsed: !groupOpen,
|
|
220
217
|
mode: ToolPreferences_model.commonMode(group.entries, value),
|
|
221
218
|
onCollapseToggle: () => toggle(group.group),
|
|
222
|
-
onModeToggle: () =>
|
|
219
|
+
onModeToggle: () => cycleGroup(group, ToolPreferences_model.groupToolPolicy(group.entries, value))
|
|
223
220
|
}
|
|
224
221
|
),
|
|
225
222
|
groupOpen && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5 p-0.5", children: group.subGroups.map((subGroup) => {
|
|
@@ -232,7 +229,7 @@ function CompactToolList({
|
|
|
232
229
|
open: isOpen(parentKey),
|
|
233
230
|
onToggle: () => toggle(parentKey),
|
|
234
231
|
onToggleEntry: handleToggle,
|
|
235
|
-
|
|
232
|
+
onCycleSubGroup: (sub, current) => cycleSubGroup(group, sub, current)
|
|
236
233
|
},
|
|
237
234
|
subGroup.parent
|
|
238
235
|
);
|
|
@@ -243,7 +240,7 @@ function CompactToolList({
|
|
|
243
240
|
function CompactToolPreferencesList({
|
|
244
241
|
tools,
|
|
245
242
|
value,
|
|
246
|
-
|
|
243
|
+
onRule,
|
|
247
244
|
title = "Tools preferences",
|
|
248
245
|
emptyLabel = "No tools available",
|
|
249
246
|
className
|
|
@@ -259,7 +256,7 @@ function CompactToolPreferencesList({
|
|
|
259
256
|
{
|
|
260
257
|
groups,
|
|
261
258
|
value,
|
|
262
|
-
|
|
259
|
+
onRule,
|
|
263
260
|
emptyLabel
|
|
264
261
|
}
|
|
265
262
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferencesList.cjs","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolMode } from \"../chat/types\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolMode,\n nextMode,\n type BadgeMode,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nfunction ModeBadge({ mode }: { mode: BadgeMode }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"on\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"off\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgeMode;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolMode;\n onToggle: (entry: ToolPreferenceEntry, current: ToolMode) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"off\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgeMode;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleEntries,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolMode>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolMode) => void;\n onCycleEntries: (entries: ToolPreferenceEntry[], current: ToolMode) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleEntries(\n subGroup.entries,\n groupToolMode(subGroup.entries, value),\n )\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onChange,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolMode) =>\n onChange({ ...value, [entry.key]: nextMode(current) });\n const cycleEntries = (entries: ToolPreferenceEntry[], current: ToolMode) => {\n const next = nextMode(current);\n const updated = { ...value };\n for (const entry of entries) updated[entry.key] = next;\n onChange(updated);\n };\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleEntries(group.entries, groupToolMode(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleEntries={cycleEntries}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onChange,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":["jsx","cn","BADGE_DESCRIPTION","jsxs","Icon","UiChevronRight","UiChevronDown","NO_PARENT","entryMode","Fragment","commonMode","groupToolMode","useState","nextMode","useMemo","groupedToolEntriesWithPreferences"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolPreferencesList.cjs","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolPolicy,\n nextMode,\n type BadgePolicy,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n /** The effective mode of every tool, keyed by name — what the rows render. */\n value: Record<string, ToolPolicy>;\n /** Emits the rule a toggle means: a group header emits a group rule, a parent\n * header a group+parent rule, and a row a name rule. The caller appends it to\n * the user's list, where a name rule outranks the group rule above it.\n *\n * This is deliberately not \"here is the new map\". A group toggle that wrote\n * every current member's name would stop applying the moment the catalog\n * gained a member, and the user would have no way to tell. */\n onRule: (rule: PermissionRule) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nfunction ModeBadge({ mode }: { mode: BadgePolicy }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"allow\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"deny\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolPolicy;\n onToggle: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"deny\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleSubGroup,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolPolicy>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n onCycleSubGroup: (subGroup: ToolSubGroup, current: ToolPolicy) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onRule,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolPolicy) =>\n onRule({ name: entry.key, policy: nextMode(current) });\n const cycleGroup = (group: ToolGroup, current: ToolPolicy) =>\n onRule({ group: group.group, policy: nextMode(current) });\n // A parent is a subdivision of one group, not a group of its own, so the rule\n // has to name both — a bare `parent` would reach the same display title under\n // a different group.\n const cycleSubGroup = (\n group: ToolGroup,\n subGroup: ToolSubGroup,\n current: ToolPolicy,\n ) =>\n onRule({\n group: group.group,\n parent: subGroup.parent,\n policy: nextMode(current),\n });\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleGroup(group, groupToolPolicy(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleSubGroup={(sub, current) =>\n cycleSubGroup(group, sub, current)\n }\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onRule,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":["jsx","cn","BADGE_DESCRIPTION","jsxs","Icon","UiChevronRight","UiChevronDown","NO_PARENT","entryMode","Fragment","commonMode","groupToolPolicy","useState","nextMode","useMemo","groupedToolEntriesWithPreferences"],"mappings":";;;;;;;;;AAsCA,SAAS,UAAU,EAAE,QAA+B;AAClD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,SAAS,WACP;AAAA,QACF,SAAS,UAAU;AAAA,QACnB,SAAS,SAAS;AAAA,QAClB,SAAS,UAAU;AAAA,QACnB,SAAS,WACP;AAAA,MAAA;AAAA,MAEJ,OAAOC,sBAAAA,kBAAkB,IAAI;AAAA,MAE5B,4CAAY,IAAI;AAAA,IAAA;AAAA,EAAA;AAGvB;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,IAAAH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,YAAY,WAAW,UAAU,IAAI,KAAK;AAAA,QACzD,OAAO,GAAG,YAAY,WAAW,UAAU,IAAI,KAAK;AAAA,QACpD,WAAU;AAAA,QACV,SAAS;AAAA,QAET,UAAAA,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,YAAYC,eAAAA,iBAAiBC,cAAAA;AAAAA,YACnC,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA;AAAA,IAEFH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,UAAU,KAAK;AAAA,QAC3B,OAAO,aAAa,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO,OAAO,KAAK;AAAA,QACvE,WAAU;AAAA,QACV,SAAS;AAAA,QAET,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,4CACd,UAAA;AAAA,YAAAH,2BAAAA,IAAC,QAAA,EAAK,WAAU,6FACb,UAAA,OACH;AAAA,YACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA,MAAA,CACH;AAAA,UAAA,GACF;AAAA,UACAA,+BAAC,aAAU,KAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACzB,GACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAKG;AACD,SACEG,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWF,MAAAA;AAAAA,QACT;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,MAEd,OAAO,MAAM,KAAK;AAAA,MAClB,SAAS,MAAM,SAAS,OAAO,IAAI;AAAA,MAEnC,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC,MAAAA;AAAAA,cACT;AAAA,cACA,SAAS,UAAU;AAAA,YAAA;AAAA,YAGpB,UAAA,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAETD,+BAAC,aAAU,KAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG7B;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACEG,2BAAAA,KAAC,OAAA,EAAI,WAAU,8EACb,UAAA;AAAA,IAAAH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,YAAY,WAAW,UAAU,IAAI,MAAM;AAAA,QAC1D,OAAO,GAAG,YAAY,WAAW,UAAU,IAAI,MAAM;AAAA,QACrD,WAAU;AAAA,QACV,SAAS;AAAA,QAET,UAAAA,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,YAAYC,eAAAA,iBAAiBC,cAAAA;AAAAA,YACnC,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA;AAAA,IAEFH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,UAAU,MAAM;AAAA,QAC5B,OAAO,aAAa,KAAK,IAAI,UAAU,IAAI,SAAS,OAAO,OAAO,MAAM;AAAA,QACxE,WAAU;AAAA,QACV,SAAS;AAAA,QAET,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,4CACd,UAAA;AAAA,YAAAH,2BAAAA,IAAC,QAAA,EAAK,WAAU,+DACb,UAAA,QACH;AAAA,YACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA,MAAA,CACH;AAAA,UAAA,GACF;AAAA,UACAA,+BAAC,aAAU,KAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACzB,GACF;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,YAAY,SAAS,WAAWO,sBAAAA;AACtC,QAAM,OAAO,SAAS,QAAQ,IAAI,CAAC,UACjCP,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MAEC;AAAA,MACA,MAAMQ,sBAAAA,UAAU,OAAO,KAAK;AAAA,MAC5B,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,IAJL,MAAM;AAAA,EAAA,CAMd;AACD,MAAI,CAAC,UAAW,QAAOR,2BAAAA,IAAAS,WAAAA,UAAA,EAAG,UAAA,MAAK;AAC/B,yCACG,OAAA,EACC,UAAA;AAAA,IAAAT,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,SAAS;AAAA,QACjB,OAAO,SAAS,QAAQ;AAAA,QACxB,WAAW,CAAC;AAAA,QACZ,MAAMU,sBAAAA,WAAW,SAAS,SAAS,KAAK;AAAA,QACxC,kBAAkB;AAAA,QAClB,cAAc,MACZ,gBAAgB,UAAUC,sBAAAA,gBAAgB,SAAS,SAAS,KAAK,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAGrE,QAAQ;AAAA,EAAA,GACX;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAKG;AACD,QAAM,CAAC,UAAU,WAAW,IAAIC,MAAAA,SAAsB,MAAM,oBAAI,KAAK;AACrE,MAAI,OAAO,WAAW,GAAG;AACvB,WACEZ,2BAAAA,IAAC,OAAA,EAAI,WAAU,2CACZ,UAAA,YACH;AAAA,EAEJ;AACA,QAAM,SAAS,CAAC,QAAgB,SAAS,IAAI,GAAG;AAChD,QAAM,SAAS,CAAC,QACd,YAAY,CAAC,YAAY;AACvB,UAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,QAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,QAC7B,MAAK,IAAI,GAAG;AACjB,WAAO;AAAA,EACT,CAAC;AACH,QAAM,eAAe,CAAC,OAA4B,YAChD,OAAO,EAAE,MAAM,MAAM,KAAK,QAAQa,+BAAS,OAAO,GAAG;AACvD,QAAM,aAAa,CAAC,OAAkB,YACpC,OAAO,EAAE,OAAO,MAAM,OAAO,QAAQA,+BAAS,OAAO,GAAG;AAI1D,QAAM,gBAAgB,CACpB,OACA,UACA,YAEA,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,QAAQA,sBAAAA,SAAS,OAAO;AAAA,EAAA,CACzB;AACH,wCACG,OAAA,EAAI,WAAU,aACZ,UAAA,OAAO,IAAI,CAAC,UAAU;AACrB,UAAM,YAAY,OAAO,MAAM,KAAK;AACpC,2CACG,OAAA,EACC,UAAA;AAAA,MAAAb,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,OAAO,MAAM,QAAQ;AAAA,UACrB,WAAW,CAAC;AAAA,UACZ,MAAMU,sBAAAA,WAAW,MAAM,SAAS,KAAK;AAAA,UACrC,kBAAkB,MAAM,OAAO,MAAM,KAAK;AAAA,UAC1C,cAAc,MACZ,WAAW,OAAOC,sBAAAA,gBAAgB,MAAM,SAAS,KAAK,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAG1D,4CACE,OAAA,EAAI,WAAU,qBACZ,UAAA,MAAM,UAAU,IAAI,CAAC,aAAa;AACjC,cAAM,YAAY,GAAG,MAAM,KAAK,MAAM,SAAS,MAAM;AACrD,eACEX,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA,MAAM,OAAO,SAAS;AAAA,YACtB,UAAU,MAAM,OAAO,SAAS;AAAA,YAChC,eAAe;AAAA,YACf,iBAAiB,CAAC,KAAK,YACrB,cAAc,OAAO,KAAK,OAAO;AAAA,UAAA;AAAA,UAP9B,SAAS;AAAA,QAAA;AAAA,MAWpB,CAAC,EAAA,CACH;AAAA,IAAA,EAAA,GA7BM,MAAM,KA+BhB;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AACF,GAAoC;AAClC,QAAM,SAASc,MAAAA;AAAAA,IACb,MAAMC,sBAAAA,kCAAkC,OAAO,KAAK;AAAA,IACpD,CAAC,OAAO,KAAK;AAAA,EAAA;AAEf,yCACG,OAAA,EAAI,WAAWd,MAAAA,GAAG,aAAa,SAAS,GACtC,UAAA;AAAA,IAAA,SACCD,2BAAAA,IAAC,OAAA,EAAI,WAAU,6CAA6C,UAAA,OAAM;AAAA,IAEpEA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;;;"}
|
|
@@ -1,18 +1,27 @@
|
|
|
1
|
-
import { ToolMeta,
|
|
1
|
+
import { ToolMeta, ToolPolicy } from '../chat/types';
|
|
2
|
+
import { PermissionRule } from '../chat/tool-policy';
|
|
2
3
|
import { ToolGroup } from './ToolPreferences.model';
|
|
3
4
|
export type CompactToolPreferencesListProps = {
|
|
4
5
|
tools: ToolMeta[];
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
/** The effective mode of every tool, keyed by name — what the rows render. */
|
|
7
|
+
value: Record<string, ToolPolicy>;
|
|
8
|
+
/** Emits the rule a toggle means: a group header emits a group rule, a parent
|
|
9
|
+
* header a group+parent rule, and a row a name rule. The caller appends it to
|
|
10
|
+
* the user's list, where a name rule outranks the group rule above it.
|
|
11
|
+
*
|
|
12
|
+
* This is deliberately not "here is the new map". A group toggle that wrote
|
|
13
|
+
* every current member's name would stop applying the moment the catalog
|
|
14
|
+
* gained a member, and the user would have no way to tell. */
|
|
15
|
+
onRule: (rule: PermissionRule) => void;
|
|
7
16
|
title?: string | undefined;
|
|
8
17
|
emptyLabel?: string | undefined;
|
|
9
18
|
className?: string | undefined;
|
|
10
19
|
};
|
|
11
|
-
export declare function CompactToolList({ groups, value,
|
|
20
|
+
export declare function CompactToolList({ groups, value, onRule, emptyLabel, }: {
|
|
12
21
|
groups: ToolGroup[];
|
|
13
|
-
value: Record<string,
|
|
14
|
-
|
|
22
|
+
value: Record<string, ToolPolicy>;
|
|
23
|
+
onRule: (rule: PermissionRule) => void;
|
|
15
24
|
emptyLabel?: string | undefined;
|
|
16
25
|
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
-
export declare function CompactToolPreferencesList({ tools, value,
|
|
26
|
+
export declare function CompactToolPreferencesList({ tools, value, onRule, title, emptyLabel, className, }: CompactToolPreferencesListProps): import("react/jsx-runtime").JSX.Element;
|
|
18
27
|
//# sourceMappingURL=ToolPreferencesList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferencesList.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"ToolPreferencesList.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAUL,KAAK,SAAS,EAGf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC;;;;;;mEAM+D;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAuMF,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAiC,GAClC,EAAE;IACD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,2CA2EA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAA2B,EAC3B,UAAiC,EACjC,SAAS,GACV,EAAE,+BAA+B,2CAkBjC"}
|
|
@@ -2,7 +2,7 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo, useState } from "react";
|
|
3
3
|
import { cn } from "../../lib/utils.js";
|
|
4
4
|
import { Icon } from "../Icon.js";
|
|
5
|
-
import { groupedToolEntriesWithPreferences,
|
|
5
|
+
import { groupedToolEntriesWithPreferences, groupToolPolicy, commonMode, nextMode, NO_PARENT, entryMode, BADGE_LABEL, BADGE_DESCRIPTION } from "./ToolPreferences.model.js";
|
|
6
6
|
import { UiChevronRight } from "../../icons/components/UiChevronRight.js";
|
|
7
7
|
import { UiChevronDown } from "../../icons/components/UiChevronDown.js";
|
|
8
8
|
function ModeBadge({ mode }) {
|
|
@@ -11,10 +11,10 @@ function ModeBadge({ mode }) {
|
|
|
11
11
|
{
|
|
12
12
|
className: cn(
|
|
13
13
|
"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium",
|
|
14
|
-
mode === "
|
|
14
|
+
mode === "allow" && "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",
|
|
15
15
|
mode === "auto" && "bg-sky-500/10 text-sky-600 dark:text-sky-400",
|
|
16
16
|
mode === "ask" && "bg-amber-500/10 text-amber-600 dark:text-amber-500",
|
|
17
|
-
mode === "
|
|
17
|
+
mode === "deny" && "text-muted-foreground",
|
|
18
18
|
mode === "mixed" && "bg-muted text-muted-foreground ring-1 ring-inset ring-border"
|
|
19
19
|
),
|
|
20
20
|
title: BADGE_DESCRIPTION[mode],
|
|
@@ -89,7 +89,7 @@ function ToolRow({
|
|
|
89
89
|
{
|
|
90
90
|
className: cn(
|
|
91
91
|
"min-w-0 truncate text-xs",
|
|
92
|
-
mode === "
|
|
92
|
+
mode === "deny" && "text-muted-foreground line-through"
|
|
93
93
|
),
|
|
94
94
|
children: entry.label
|
|
95
95
|
}
|
|
@@ -150,7 +150,7 @@ function ToolSubGroupBlock({
|
|
|
150
150
|
open,
|
|
151
151
|
onToggle,
|
|
152
152
|
onToggleEntry,
|
|
153
|
-
|
|
153
|
+
onCycleSubGroup
|
|
154
154
|
}) {
|
|
155
155
|
const hasParent = subGroup.parent !== NO_PARENT;
|
|
156
156
|
const rows = subGroup.entries.map((entry) => /* @__PURE__ */ jsx(
|
|
@@ -173,10 +173,7 @@ function ToolSubGroupBlock({
|
|
|
173
173
|
collapsed: !open,
|
|
174
174
|
mode: commonMode(subGroup.entries, value),
|
|
175
175
|
onCollapseToggle: onToggle,
|
|
176
|
-
onModeToggle: () =>
|
|
177
|
-
subGroup.entries,
|
|
178
|
-
groupToolMode(subGroup.entries, value)
|
|
179
|
-
)
|
|
176
|
+
onModeToggle: () => onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))
|
|
180
177
|
}
|
|
181
178
|
),
|
|
182
179
|
open && rows
|
|
@@ -185,7 +182,7 @@ function ToolSubGroupBlock({
|
|
|
185
182
|
function CompactToolList({
|
|
186
183
|
groups,
|
|
187
184
|
value,
|
|
188
|
-
|
|
185
|
+
onRule,
|
|
189
186
|
emptyLabel = "No tools available"
|
|
190
187
|
}) {
|
|
191
188
|
const [expanded, setExpanded] = useState(() => /* @__PURE__ */ new Set());
|
|
@@ -199,13 +196,13 @@ function CompactToolList({
|
|
|
199
196
|
else next.add(key);
|
|
200
197
|
return next;
|
|
201
198
|
});
|
|
202
|
-
const handleToggle = (entry, current) =>
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
};
|
|
199
|
+
const handleToggle = (entry, current) => onRule({ name: entry.key, policy: nextMode(current) });
|
|
200
|
+
const cycleGroup = (group, current) => onRule({ group: group.group, policy: nextMode(current) });
|
|
201
|
+
const cycleSubGroup = (group, subGroup, current) => onRule({
|
|
202
|
+
group: group.group,
|
|
203
|
+
parent: subGroup.parent,
|
|
204
|
+
policy: nextMode(current)
|
|
205
|
+
});
|
|
209
206
|
return /* @__PURE__ */ jsx("div", { className: "space-y-1", children: groups.map((group) => {
|
|
210
207
|
const groupOpen = isOpen(group.group);
|
|
211
208
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -217,7 +214,7 @@ function CompactToolList({
|
|
|
217
214
|
collapsed: !groupOpen,
|
|
218
215
|
mode: commonMode(group.entries, value),
|
|
219
216
|
onCollapseToggle: () => toggle(group.group),
|
|
220
|
-
onModeToggle: () =>
|
|
217
|
+
onModeToggle: () => cycleGroup(group, groupToolPolicy(group.entries, value))
|
|
221
218
|
}
|
|
222
219
|
),
|
|
223
220
|
groupOpen && /* @__PURE__ */ jsx("div", { className: "space-y-0.5 p-0.5", children: group.subGroups.map((subGroup) => {
|
|
@@ -230,7 +227,7 @@ function CompactToolList({
|
|
|
230
227
|
open: isOpen(parentKey),
|
|
231
228
|
onToggle: () => toggle(parentKey),
|
|
232
229
|
onToggleEntry: handleToggle,
|
|
233
|
-
|
|
230
|
+
onCycleSubGroup: (sub, current) => cycleSubGroup(group, sub, current)
|
|
234
231
|
},
|
|
235
232
|
subGroup.parent
|
|
236
233
|
);
|
|
@@ -241,7 +238,7 @@ function CompactToolList({
|
|
|
241
238
|
function CompactToolPreferencesList({
|
|
242
239
|
tools,
|
|
243
240
|
value,
|
|
244
|
-
|
|
241
|
+
onRule,
|
|
245
242
|
title = "Tools preferences",
|
|
246
243
|
emptyLabel = "No tools available",
|
|
247
244
|
className
|
|
@@ -257,7 +254,7 @@ function CompactToolPreferencesList({
|
|
|
257
254
|
{
|
|
258
255
|
groups,
|
|
259
256
|
value,
|
|
260
|
-
|
|
257
|
+
onRule,
|
|
261
258
|
emptyLabel
|
|
262
259
|
}
|
|
263
260
|
)
|