@flanksource/clicky-ui 0.3.15 → 0.3.16
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 +10 -0
- package/dist/ai.cjs +33 -4
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +31 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +6 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +7 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +92 -170
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -111
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +95 -173
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxActions.cjs +70 -0
- package/dist/components/ComboboxActions.cjs.map +1 -0
- package/dist/components/ComboboxActions.d.ts +8 -0
- package/dist/components/ComboboxActions.d.ts.map +1 -0
- package/dist/components/ComboboxActions.js +70 -0
- package/dist/components/ComboboxActions.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +160 -0
- package/dist/components/ComboboxMenu.cjs.map +1 -0
- package/dist/components/ComboboxMenu.d.ts +22 -0
- package/dist/components/ComboboxMenu.d.ts.map +1 -0
- package/dist/components/ComboboxMenu.js +160 -0
- package/dist/components/ComboboxMenu.js.map +1 -0
- package/dist/components/EndpointSelector.cjs +407 -0
- package/dist/components/EndpointSelector.cjs.map +1 -0
- package/dist/components/EndpointSelector.d.ts +3 -0
- package/dist/components/EndpointSelector.d.ts.map +1 -0
- package/dist/components/EndpointSelector.js +407 -0
- package/dist/components/EndpointSelector.js.map +1 -0
- package/dist/components/EndpointSelector.model.d.ts +52 -0
- package/dist/components/EndpointSelector.model.d.ts.map +1 -0
- package/dist/components/FilterBar.cjs +12 -0
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +4 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +12 -0
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/InputField.cjs +11 -12
- package/dist/components/InputField.cjs.map +1 -1
- package/dist/components/InputField.d.ts +7 -0
- package/dist/components/InputField.d.ts.map +1 -1
- package/dist/components/InputField.js +12 -13
- package/dist/components/InputField.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -16
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +22 -16
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +3 -3
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +3 -3
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +150 -77
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +151 -78
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/WorkloadPicker.cjs +2 -1
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +6 -1
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +2 -1
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/combobox-types.d.ts +107 -0
- package/dist/components/combobox-types.d.ts.map +1 -0
- package/dist/components/combobox-utils.cjs +21 -0
- package/dist/components/combobox-utils.cjs.map +1 -0
- package/dist/components/combobox-utils.d.ts +15 -0
- package/dist/components/combobox-utils.d.ts.map +1 -0
- package/dist/components/combobox-utils.js +21 -0
- package/dist/components/combobox-utils.js.map +1 -0
- package/dist/components/endpoint-port.cjs +12 -0
- package/dist/components/endpoint-port.cjs.map +1 -0
- package/dist/components/endpoint-port.d.ts +4 -0
- package/dist/components/endpoint-port.d.ts.map +1 -0
- package/dist/components/endpoint-port.js +12 -0
- package/dist/components/endpoint-port.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +12 -23
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +12 -23
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +6 -2
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -1
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -1
- package/dist/components/json-schema-form-discriminator.js +6 -2
- package/dist/components/json-schema-form-discriminator.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +50 -0
- package/dist/components/json-schema-form-error-display.cjs.map +1 -0
- package/dist/components/json-schema-form-error-display.d.ts +12 -0
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -0
- package/dist/components/json-schema-form-error-display.js +50 -0
- package/dist/components/json-schema-form-error-display.js.map +1 -0
- package/dist/components/json-schema-form-error-types.d.ts +26 -0
- package/dist/components/json-schema-form-error-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +169 -0
- package/dist/components/json-schema-form-errors.cjs.map +1 -0
- package/dist/components/json-schema-form-errors.d.ts +14 -0
- package/dist/components/json-schema-form-errors.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.js +169 -0
- package/dist/components/json-schema-form-errors.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +12 -2
- 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 +12 -2
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +84 -19
- 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 +84 -19
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +33 -10
- 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 +34 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +16 -4
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +17 -5
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -3
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +13 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +8 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +15 -2
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +177 -6
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +39 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +21 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -0
- package/dist/data/DataTable.grouping.d.ts +26 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -0
- package/dist/data/DataTable.grouping.js +21 -0
- package/dist/data/DataTable.grouping.js.map +1 -0
- package/dist/data/DataTable.js +177 -6
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Markdown.cjs +45 -1
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +3 -2
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +45 -1
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +4 -3
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.d.ts +6 -2
- package/dist/data/MarkdownEditor.d.ts.map +1 -1
- package/dist/data/MarkdownEditor.js +4 -3
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/StatStrip.cjs +99 -0
- package/dist/data/StatStrip.cjs.map +1 -0
- package/dist/data/StatStrip.d.ts +41 -0
- package/dist/data/StatStrip.d.ts.map +1 -0
- package/dist/data/StatStrip.js +99 -0
- package/dist/data/StatStrip.js.map +1 -0
- package/dist/data/TaskManager.cjs +20 -1
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +3 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +20 -1
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +49 -0
- package/dist/data/TaskManagerButton.cjs.map +1 -0
- package/dist/data/TaskManagerButton.d.ts +8 -0
- package/dist/data/TaskManagerButton.d.ts.map +1 -0
- package/dist/data/TaskManagerButton.js +49 -0
- package/dist/data/TaskManagerButton.js.map +1 -0
- package/dist/data/TaskProcessDetails.cjs +113 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -0
- package/dist/data/TaskProcessDetails.d.ts +6 -0
- package/dist/data/TaskProcessDetails.d.ts.map +1 -0
- package/dist/data/TaskProcessDetails.js +113 -0
- package/dist/data/TaskProcessDetails.js.map +1 -0
- package/dist/data/TaskProgress.cjs +106 -19
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +4 -2
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +107 -20
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +43 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Tree.cjs +91 -82
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +91 -82
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +3 -0
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts +2 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +3 -0
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +9 -140
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +2 -40
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +6 -137
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.models.cjs +11 -0
- package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.models.d.ts +3 -0
- package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.models.js +11 -0
- package/dist/data/ai/ChatWindow.models.js.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.js +57 -0
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
- package/dist/data/ai/ChatWindow.types.d.ts +41 -0
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
- package/dist/data/ai/ContextBadges.cjs +76 -46
- package/dist/data/ai/ContextBadges.cjs.map +1 -1
- package/dist/data/ai/ContextBadges.d.ts.map +1 -1
- package/dist/data/ai/ContextBadges.js +77 -47
- package/dist/data/ai/ContextBadges.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
- package/dist/data/ai/PromptPicker/index.d.ts +2 -1
- package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.cjs +7 -0
- package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/types.d.ts +18 -2
- package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.js +7 -0
- package/dist/data/ai/PromptPicker/types.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +82 -14
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +5 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +83 -15
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/RuntimeBar.cjs +336 -0
- package/dist/data/ai/RuntimeBar.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.d.ts +27 -0
- package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.js +336 -0
- package/dist/data/ai/RuntimeBar.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +56 -0
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
- package/dist/data/ai/SessionChatComposer.d.ts +24 -0
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
- package/dist/data/ai/SessionChatComposer.js +56 -0
- package/dist/data/ai/SessionChatComposer.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +222 -382
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.cjs +377 -0
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +377 -0
- package/dist/data/ai/SessionInspector.collection.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +9 -4
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +162 -0
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.files.d.ts +5 -0
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.files.js +162 -0
- package/dist/data/ai/SessionInspector.files.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
- package/dist/data/ai/SessionInspector.js +224 -384
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +125 -0
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.model.d.ts +14 -0
- package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.model.js +125 -0
- package/dist/data/ai/SessionInspector.model.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +265 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panels.js +265 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -0
- package/dist/data/ai/SessionInspector.plan.cjs +77 -0
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.plan.js +77 -0
- package/dist/data/ai/SessionInspector.plan.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +182 -0
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.summary.js +182 -0
- package/dist/data/ai/SessionInspector.summary.js.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.js +94 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
- package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
- package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +86 -121
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +8 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +110 -0
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.header.d.ts +11 -0
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.header.js +110 -0
- package/dist/data/ai/SessionViewer.header.js.map +1 -0
- package/dist/data/ai/SessionViewer.js +87 -122
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +109 -39
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +2 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +109 -39
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
- package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.js +15 -0
- package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
- package/dist/data/ai/SessionViewer.rows.cjs +37 -424
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +31 -418
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.js +65 -0
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.js +404 -0
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts +10 -2
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +2 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +2 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/agent-action-icons.cjs +7 -10
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.d.ts +1 -2
- package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
- package/dist/data/ai/agent-action-icons.js +8 -11
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +4 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/claude.cjs +252 -0
- package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude.js +252 -0
- package/dist/data/ai/examples/sessions/claude.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex.cjs +236 -0
- package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex.js +236 -0
- package/dist/data/ai/examples/sessions/codex.js.map +1 -0
- package/dist/data/ai/examples/sessions/index.cjs +21 -0
- package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/index.d.ts +10 -0
- package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/index.js +21 -0
- package/dist/data/ai/examples/sessions/index.js.map +1 -0
- package/dist/data/ai/index.d.ts +8 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.cjs +62 -0
- package/dist/data/ai/runtime-mode.cjs.map +1 -1
- package/dist/data/ai/runtime-mode.d.ts +27 -0
- package/dist/data/ai/runtime-mode.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.js +62 -0
- package/dist/data/ai/runtime-mode.js.map +1 -1
- package/dist/data/cells/EntityCell.cjs +64 -0
- package/dist/data/cells/EntityCell.cjs.map +1 -0
- package/dist/data/cells/EntityCell.d.ts +27 -0
- package/dist/data/cells/EntityCell.d.ts.map +1 -0
- package/dist/data/cells/EntityCell.js +64 -0
- package/dist/data/cells/EntityCell.js.map +1 -0
- package/dist/data/chat/Attachment.cjs +53 -13
- package/dist/data/chat/Attachment.cjs.map +1 -1
- package/dist/data/chat/Attachment.d.ts +9 -3
- package/dist/data/chat/Attachment.d.ts.map +1 -1
- package/dist/data/chat/Attachment.js +54 -14
- package/dist/data/chat/Attachment.js.map +1 -1
- package/dist/data/chat/Chat.cjs +25 -17
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +8 -4
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +22 -14
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +142 -39
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +4 -1
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +143 -40
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +55 -3
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +5 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +55 -3
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/ModelSelector.cjs +8 -10
- package/dist/data/chat/ModelSelector.cjs.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts.map +1 -1
- package/dist/data/chat/ModelSelector.js +9 -11
- package/dist/data/chat/ModelSelector.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +56 -5
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +10 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +57 -6
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/attachment-upload.cjs +33 -0
- package/dist/data/chat/attachment-upload.cjs.map +1 -0
- package/dist/data/chat/attachment-upload.d.ts +21 -0
- package/dist/data/chat/attachment-upload.d.ts.map +1 -0
- package/dist/data/chat/attachment-upload.js +33 -0
- package/dist/data/chat/attachment-upload.js.map +1 -0
- package/dist/data/chat/effort-icons.cjs +36 -6
- package/dist/data/chat/effort-icons.cjs.map +1 -1
- package/dist/data/chat/effort-icons.d.ts +6 -3
- package/dist/data/chat/effort-icons.d.ts.map +1 -1
- package/dist/data/chat/effort-icons.js +37 -7
- package/dist/data/chat/effort-icons.js.map +1 -1
- package/dist/data/chat/index.d.ts +3 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/models.cjs +8 -0
- package/dist/data/chat/models.cjs.map +1 -0
- package/dist/data/chat/models.d.ts +11 -0
- package/dist/data/chat/models.d.ts.map +1 -0
- package/dist/data/chat/models.js +8 -0
- package/dist/data/chat/models.js.map +1 -0
- package/dist/data/chat/provider-icons.cjs +49 -16
- package/dist/data/chat/provider-icons.cjs.map +1 -1
- package/dist/data/chat/provider-icons.d.ts +2 -0
- package/dist/data/chat/provider-icons.d.ts.map +1 -1
- package/dist/data/chat/provider-icons.js +50 -17
- package/dist/data/chat/provider-icons.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +9 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/examples/markdown-preview-mock.cjs +45 -0
- package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
- package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
- package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
- package/dist/data/examples/markdown-preview-mock.js +45 -0
- package/dist/data/examples/markdown-preview-mock.js.map +1 -0
- package/dist/data/examples/markdown-syntax.cjs +36 -0
- package/dist/data/examples/markdown-syntax.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.d.ts +12 -0
- package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
- package/dist/data/examples/markdown-syntax.js +36 -0
- package/dist/data/examples/markdown-syntax.js.map +1 -0
- package/dist/data/examples/markdown-syntax.md.cjs +4 -0
- package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.md.js +5 -0
- package/dist/data/examples/markdown-syntax.md.js.map +1 -0
- package/dist/data/task-process-details.cjs +48 -0
- package/dist/data/task-process-details.cjs.map +1 -0
- package/dist/data/task-process-details.d.ts +5 -0
- package/dist/data/task-process-details.d.ts.map +1 -0
- package/dist/data/task-process-details.js +48 -0
- package/dist/data/task-process-details.js.map +1 -0
- package/dist/data/version-info.cjs +2 -2
- package/dist/data/version-info.js +2 -2
- package/dist/data.cjs +30 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +7 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +98 -0
- package/dist/hooks/use-hotkey.cjs.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +42 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.js +98 -0
- package/dist/hooks/use-hotkey.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +23 -1
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +23 -1
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/components/UiBank.cjs +15 -0
- package/dist/icons/components/UiBank.cjs.map +1 -0
- package/dist/icons/components/UiBank.d.ts +15 -0
- package/dist/icons/components/UiBank.d.ts.map +1 -0
- package/dist/icons/components/UiBank.js +15 -0
- package/dist/icons/components/UiBank.js.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
- package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.js +15 -0
- package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
- package/dist/icons/components/UiCloudUpload.cjs +15 -0
- package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
- package/dist/icons/components/UiCloudUpload.d.ts +15 -0
- package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
- package/dist/icons/components/UiCloudUpload.js +15 -0
- package/dist/icons/components/UiCloudUpload.js.map +1 -0
- package/dist/icons/components/UiLedger.cjs +15 -0
- package/dist/icons/components/UiLedger.cjs.map +1 -0
- package/dist/icons/components/UiLedger.d.ts +15 -0
- package/dist/icons/components/UiLedger.d.ts.map +1 -0
- package/dist/icons/components/UiLedger.js +15 -0
- package/dist/icons/components/UiLedger.js.map +1 -0
- package/dist/icons/components/UiReceipt.cjs +15 -0
- package/dist/icons/components/UiReceipt.cjs.map +1 -0
- package/dist/icons/components/UiReceipt.d.ts +15 -0
- package/dist/icons/components/UiReceipt.d.ts.map +1 -0
- package/dist/icons/components/UiReceipt.js +15 -0
- package/dist/icons/components/UiReceipt.js.map +1 -0
- package/dist/icons/index.d.ts +10 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons.cjs +15 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +47 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +49 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +270 -238
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +9 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.debug.cjs +53 -0
- package/dist/layout/AppShell.debug.cjs.map +1 -0
- package/dist/layout/AppShell.debug.d.ts +6 -0
- package/dist/layout/AppShell.debug.d.ts.map +1 -0
- package/dist/layout/AppShell.debug.js +53 -0
- package/dist/layout/AppShell.debug.js.map +1 -0
- package/dist/layout/AppShell.js +269 -237
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +90 -0
- package/dist/layout/AppShell.nav.cjs.map +1 -0
- package/dist/layout/AppShell.nav.d.ts +7 -0
- package/dist/layout/AppShell.nav.d.ts.map +1 -0
- package/dist/layout/AppShell.nav.js +90 -0
- package/dist/layout/AppShell.nav.js.map +1 -0
- package/dist/layout/AppSidebar.cjs +35 -5
- package/dist/layout/AppSidebar.cjs.map +1 -1
- package/dist/layout/AppSidebar.d.ts +4 -1
- package/dist/layout/AppSidebar.d.ts.map +1 -1
- package/dist/layout/AppSidebar.js +35 -5
- package/dist/layout/AppSidebar.js.map +1 -1
- package/dist/layout/Panel.cjs +25 -41
- package/dist/layout/Panel.cjs.map +1 -1
- package/dist/layout/Panel.d.ts +2 -1
- package/dist/layout/Panel.d.ts.map +1 -1
- package/dist/layout/Panel.js +26 -42
- package/dist/layout/Panel.js.map +1 -1
- package/dist/layout/PanelFrame.cjs +56 -0
- package/dist/layout/PanelFrame.cjs.map +1 -0
- package/dist/layout/PanelFrame.d.ts +15 -0
- package/dist/layout/PanelFrame.d.ts.map +1 -0
- package/dist/layout/PanelFrame.js +56 -0
- package/dist/layout/PanelFrame.js.map +1 -0
- package/dist/layout/Section.cjs +51 -41
- package/dist/layout/Section.cjs.map +1 -1
- package/dist/layout/Section.d.ts +3 -2
- package/dist/layout/Section.d.ts.map +1 -1
- package/dist/layout/Section.js +51 -41
- package/dist/layout/Section.js.map +1 -1
- package/dist/layout/content-width.cjs +8 -0
- package/dist/layout/content-width.cjs.map +1 -0
- package/dist/layout/content-width.d.ts +3 -0
- package/dist/layout/content-width.d.ts.map +1 -0
- package/dist/layout/content-width.js +8 -0
- package/dist/layout/content-width.js.map +1 -0
- package/dist/overlay/CommandPalette.cjs +207 -0
- package/dist/overlay/CommandPalette.cjs.map +1 -0
- package/dist/overlay/CommandPalette.d.ts +71 -0
- package/dist/overlay/CommandPalette.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.js +207 -0
- package/dist/overlay/CommandPalette.js.map +1 -0
- package/dist/overlay/CommandPalette.model.cjs +70 -0
- package/dist/overlay/CommandPalette.model.cjs.map +1 -0
- package/dist/overlay/CommandPalette.model.d.ts +71 -0
- package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.model.js +70 -0
- package/dist/overlay/CommandPalette.model.js.map +1 -0
- package/dist/overlay/CommandPaletteList.cjs +88 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -0
- package/dist/overlay/CommandPaletteList.d.ts +23 -0
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteList.js +88 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
- package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.js +36 -0
- package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
- package/dist/overlay/Modal.cjs +12 -5
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +12 -5
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.js +1 -1
- package/dist/overlay/zIndex.cjs +2 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.js +2 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +6 -0
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +6 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +49 -52
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +17 -2
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +49 -52
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +2 -1
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +2 -1
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +11 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +11 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecRuntimeEditor.model.js","sources":["../../../src/data/ai/SpecRuntimeEditor.model.ts"],"sourcesContent":["import type { ChatBudgetConfig } from \"../chat/types\";\n\nexport const SPEC_PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"auto\",\n \"bypassPermissions\",\n \"dontAsk\",\n \"plan\",\n] as const;\n\nexport type SpecPermissionMode = (typeof SPEC_PERMISSION_MODES)[number];\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\nexport const SPEC_WORKTREE_MODES = [\"none\", \"new\", \"existing\"] as const;\nexport type SpecWorktreeMode = (typeof SPEC_WORKTREE_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\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};\n\nexport type AISpecRuntimeModelFallback = {\n model?: string;\n id?: string;\n backend?: 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 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 backend?: string;\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 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};\n\nexport type AISpecRuntimeEnvVar = {\n name?: string;\n value?: string;\n valueFrom?: string | AISpecRuntimeEnvVarSource;\n};\n\nexport type AISpecRuntimeSetup = {\n cwd?: string;\n baseDir?: string;\n dotenv?: string[];\n envVars?: AISpecRuntimeEnvVar[];\n checkout?: {\n mode?: SpecCheckoutMode | \"\";\n url?: string;\n path?: string;\n connection?: string;\n ref?: string;\n depth?: number;\n worktree?: {\n mode?: SpecWorktreeMode | \"\";\n prefix?: string;\n base?: string;\n path?: string;\n keep?: boolean;\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};\n\nexport type AISpecRuntimePostRun = {\n commit?: boolean;\n commitMessage?: string;\n dryRun?: boolean;\n};\n\n// Mirrors captain's api.Workflow (verify + postRun) 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 postRun?: AISpecRuntimePostRun;\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 backend = cleanString(value.backend);\n if (backend) spec.backend = backend;\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 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 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 postRun = compactPostRun(value.postRun);\n if (postRun) workflow.postRun = postRun;\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 return hasKeys(verify) ? verify : undefined;\n}\n\n// PostRun booleans compact to present-when-true: an unchecked commit/dryRun is\n// pruned to absent, which downstream reads as \"off\" (matching Go's omitempty on\n// api.PostRun, where false is unrepresentable on the wire).\nfunction compactPostRun(\n value: AISpecRuntimePostRun | undefined,\n): AISpecRuntimePostRun | undefined {\n if (!value) return undefined;\n const postRun: AISpecRuntimePostRun = {};\n if (value.commit) postRun.commit = true;\n const commitMessage = cleanString(value.commitMessage);\n if (commitMessage) postRun.commitMessage = commitMessage;\n if (value.dryRun) postRun.dryRun = true;\n return hasKeys(postRun) ? postRun : undefined;\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 return hasKeys(prompt) ? prompt : 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 backend = cleanString(item.backend);\n if (backend) fallback.backend = backend;\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 if (value?.mode && value.mode !== \"default\") permissions.mode = value.mode;\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 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 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 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\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 (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 since = cleanString(value.dirty?.since);\n if (since) dirty.since = since;\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\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SpecRuntimeEditor.model.js","sources":["../../../src/data/ai/SpecRuntimeEditor.model.ts"],"sourcesContent":["import type { ChatBudgetConfig } from \"../chat/types\";\n\nexport const SPEC_PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"auto\",\n \"bypassPermissions\",\n \"dontAsk\",\n \"plan\",\n] as const;\n\nexport type SpecPermissionMode = (typeof SPEC_PERMISSION_MODES)[number];\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\nexport const SPEC_WORKTREE_MODES = [\"none\", \"new\", \"existing\"] as const;\nexport type SpecWorktreeMode = (typeof SPEC_WORKTREE_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 backend?: 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 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 backend?: string;\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 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};\n\nexport type AISpecRuntimeEnvVar = {\n name?: string;\n value?: string;\n valueFrom?: string | AISpecRuntimeEnvVarSource;\n};\n\nexport type AISpecRuntimeSetup = {\n cwd?: string;\n baseDir?: string;\n dotenv?: string[];\n envVars?: AISpecRuntimeEnvVar[];\n checkout?: {\n mode?: SpecCheckoutMode | \"\";\n url?: string;\n path?: string;\n connection?: string;\n ref?: string;\n depth?: number;\n worktree?: {\n mode?: SpecWorktreeMode | \"\";\n prefix?: string;\n base?: string;\n path?: string;\n keep?: boolean;\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};\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 backend = cleanString(value.backend);\n if (backend) spec.backend = backend;\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 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 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 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\". Committing nothing is an absent list, not a stanza of falses.\nfunction compactCommits(\n value: AISpecRuntimeCommit[] | undefined,\n): AISpecRuntimeCommit[] | undefined {\n if (!value?.length) 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 backend = cleanString(item.backend);\n if (backend) fallback.backend = backend;\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 if (value?.mode && value.mode !== \"default\") permissions.mode = value.mode;\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 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 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 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\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 (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 since = cleanString(value.dirty?.since);\n if (since) dirty.since = since;\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"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ const Modal = require("../../overlay/Modal.cjs");
|
|
|
8
8
|
const button = require("../../components/button.cjs");
|
|
9
9
|
const Icon = require("../Icon.cjs");
|
|
10
10
|
const ModelSelector = require("../chat/ModelSelector.cjs");
|
|
11
|
+
const effortIcons = require("../chat/effort-icons.cjs");
|
|
11
12
|
const ToolSchemaBrowser = require("./ToolSchemaBrowser.cjs");
|
|
12
13
|
const types = require("../chat/types.cjs");
|
|
13
14
|
const UiSliders = require("../../icons/components/UiSliders.cjs");
|
|
@@ -273,7 +274,7 @@ function ToolPreferences({
|
|
|
273
274
|
models = [],
|
|
274
275
|
model,
|
|
275
276
|
onModelChange,
|
|
276
|
-
reasoningEfforts =
|
|
277
|
+
reasoningEfforts = effortIcons.DEFAULT_REASONING_EFFORTS,
|
|
277
278
|
reasoningEffort = "",
|
|
278
279
|
onReasoningEffortChange,
|
|
279
280
|
permissionMode = "default",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiCode2,\n UiShield,\n UiSliders,\n} from \"../../icons\";\nimport { EffortSelector, ModelSelector } from \"../chat/ModelSelector\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\n\n// Tools cycle Auto -> Ask -> Off -> On on click (the compact toggle approach).\nconst MODE_CYCLE: ToolMode[] = [\"auto\", \"ask\", \"off\", \"on\"];\n\nconst MODE_LABEL: Record<ToolMode, string> = {\n on: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n off: \"Off\",\n};\n\nconst 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\n// A header can display \"Mixed\" when its members don't share one mode; individual\n// tool rows never do.\ntype BadgeMode = ToolMode | \"mixed\";\n\nconst BADGE_LABEL: Record<BadgeMode, string> = { ...MODE_LABEL, mixed: \"Mixed\" };\n\nconst BADGE_DESCRIPTION: Record<BadgeMode, string> = {\n ...MODE_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\ntype ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolMode;\n};\n\n// Sentinel parent for tools without a resolved surface — rendered directly under\n// their group with no entity sub-header.\nconst NO_PARENT = \"\\u0000no-parent\";\n\n// A parent surface (entity) sub-bucket within a group, e.g. \"Accounts\" inside\n// \"Accounting Read\". Supplies the disambiguating context for sibling verbs so\n// bare labels like \"Get\"/\"List\" stay distinguishable.\ntype ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\n// A permission-tier group (the load-bearing preferenceKey scope) plus its\n// parent-surface sub-buckets. `entries` is the flat member list used for the\n// group-level count and bulk cycle.\ntype ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport type ToolPreferencesProps = {\n /** The tools to list. Replaces ai-financials' global registry — callers pass\n * whatever their backend exposes. */\n tools: ToolMeta[];\n /** Current per-tool mode. Missing entries use each tool's default. */\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n reasoningEfforts?: string[] | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n className?: string;\n};\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\ntype AdvancedTab = \"config\" | \"permissions\" | \"browser\";\n\n// A single mode badge — shows exactly the current mode's label, tone-colored.\n// Headers may pass \"mixed\" when their members disagree.\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\n// A collapsible group header: a chevron to expand/collapse, the group name +\n// count as a button that cycles every tool in the group, and the group's mode\n// badge (\"Mixed\" when members disagree).\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 <span className=\"shrink-0\">\n <ModeBadge mode={mode} />\n </span>\n </button>\n </div>\n );\n}\n\n// One tool row — the whole row is a button that cycles the tool's mode. Rows\n// under an entity sub-header are indented so the sub-header reads as their\n// heading.\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\n// A collapsible entity sub-header inside a group: a chevron to expand/collapse\n// its rows, and a button that cycles every tool under the parent surface —\n// mirroring the group header one level down.\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 <span className=\"shrink-0\">\n <ModeBadge mode={mode} />\n </span>\n </button>\n </div>\n );\n}\n\n// A parent sub-bucket: its entity sub-header (when the parent is real) followed\n// by the tool rows. Parentless tools render as bare rows directly under the\n// group.\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 // Parentless tools have no sub-header, so they always show when the group is open.\n if (!hasParent) {\n return <>{rows}</>;\n }\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(subGroup.entries, groupToolMode(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\n// The compact per-tool list shared by the dropdown and the standalone list:\n// grouped, collapsible, single cycling badge per tool.\nfunction 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 // Track which nodes are EXPANDED, so everything starts collapsed (empty set)\n // like the tool browser's group view. Parent keys are namespaced under their\n // group since entity names repeat across groups.\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\n/** A popover that cycles tools through Auto -> Ask -> Off -> On. The resulting\n * `Record<name, ToolMode>` is meant to be forwarded to the backend (e.g. via\n * `<Chat body={{ toolPreferences }}>`). */\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n model,\n onModelChange,\n reasoningEfforts = [\"low\", \"medium\", \"high\"],\n reasoningEffort = \"\",\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n toolsLoading = false,\n toolsError = null,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {([\"config\", \"permissions\", \"browser\"] as AdvancedTab[]).map(\n (tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon\n icon={\n tab === \"config\"\n ? UiSliders\n : tab === \"permissions\"\n ? UiShield\n : UiCode2\n }\n className=\"size-3.5\"\n />\n {tab}\n </button>\n ),\n )}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <ToolConfigPanel\n models={models}\n model={model}\n onModelChange={onModelChange}\n reasoningEfforts={reasoningEfforts}\n reasoningEffort={reasoningEffort}\n onReasoningEffortChange={onReasoningEffortChange}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\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\nfunction ToolConfigPanel({\n models,\n model,\n onModelChange,\n reasoningEfforts,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode,\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n}: {\n models: ChatModel[];\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n reasoningEfforts: string[];\n reasoningEffort: string;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode: ClaudePermissionMode;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n}) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, key === \"maxTokens\");\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange?.(next);\n };\n\n return (\n <div className=\"grid min-h-0 flex-1 grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)] gap-4 overflow-y-auto\">\n <div className=\"space-y-4\">\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Model\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <ModelSelector\n models={models}\n value={model}\n onChange={(next) => onModelChange?.(next)}\n className=\"w-64\"\n />\n <EffortSelector\n efforts={reasoningEfforts}\n value={reasoningEffort}\n onChange={(next) => onReasoningEffortChange?.(next)}\n className=\"w-44\"\n />\n </div>\n <label className=\"grid max-w-md grid-cols-[9rem_minmax(0,1fr)] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Permission mode</span>\n <select\n aria-label=\"Permission mode\"\n value={permissionMode}\n onChange={(event) =>\n onPermissionModeChange?.(\n event.target.value as ClaudePermissionMode,\n )\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n >\n {CLAUDE_PERMISSION_MODE_OPTIONS.map((option) => (\n <option\n key={option.value}\n value={option.value}\n title={option.description}\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Generation\n </div>\n <label className=\"grid grid-cols-[8rem_minmax(0,1fr)_4rem] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Temperature</span>\n <input\n type=\"range\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? 0}\n onChange={(event) =>\n onTemperatureChange?.(Number(event.target.value))\n }\n />\n <input\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? \"\"}\n onChange={(event) =>\n onTemperatureChange?.(parseOptionalNumber(event.target.value))\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Budget\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max cost</span>\n <input\n type=\"number\"\n min={0}\n step={0.01}\n value={budget?.cost ?? \"\"}\n onChange={(event) => updateBudget(\"cost\", event.target.value)}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max tokens</span>\n <input\n type=\"number\"\n min={0}\n step={1}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) =>\n updateBudget(\"maxTokens\", event.target.value)\n }\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </div>\n </section>\n </div>\n <UsageCostPanel usage={usage} />\n </div>\n );\n}\n\nfunction UsageCostPanel({\n usage,\n}: {\n usage?: ChatUsageSummary | null | undefined;\n}) {\n const tokens = usage?.usage;\n const costs = usage?.costBreakdown;\n return (\n <aside className=\"space-y-3 border-l border-border pl-4\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Usage\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow\n label=\"Context\"\n value={`${formatNumber(usage?.usedTokens)} / ${formatNumber(usage?.maxTokens)}`}\n />\n <MetricRow\n label=\"Input tokens\"\n value={formatNumber(tokens?.inputTokens)}\n />\n <MetricRow\n label=\"Output tokens\"\n value={formatNumber(tokens?.outputTokens)}\n />\n <MetricRow\n label=\"Reasoning tokens\"\n value={formatNumber(tokens?.reasoningTokens)}\n />\n <MetricRow\n label=\"Cache read tokens\"\n value={formatNumber(tokens?.cacheReadTokens)}\n />\n <MetricRow\n label=\"Cache write tokens\"\n value={formatNumber(tokens?.cacheWriteTokens)}\n />\n <MetricRow\n label=\"Total tokens\"\n value={formatNumber(tokens?.totalTokens)}\n />\n </div>\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Cost\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow label=\"Input\" value={formatUSD(costs?.inputUsd)} />\n <MetricRow label=\"Output\" value={formatUSD(costs?.outputUsd)} />\n <MetricRow label=\"Reasoning\" value={formatUSD(costs?.reasoningUsd)} />\n <MetricRow label=\"Cache read\" value={formatUSD(costs?.cacheReadUsd)} />\n <MetricRow\n label=\"Cache write\"\n value={formatUSD(costs?.cacheWriteUsd)}\n />\n <MetricRow\n label=\"Thread total\"\n value={formatUSD(usage?.cost ?? costs?.totalUsd)}\n strong\n />\n </div>\n </aside>\n );\n}\n\nfunction MetricRow({\n label,\n value,\n strong = false,\n}: {\n label: string;\n value: string;\n strong?: boolean;\n}) {\n return (\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 border-b border-border px-2 py-1.5 text-xs last:border-b-0\">\n <span className=\"truncate text-muted-foreground\">{label}</span>\n <span\n className={cn(\"font-mono\", strong && \"font-semibold text-foreground\")}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n\nfunction groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const group = toolGroup(tool);\n const entry: ToolPreferenceEntry = {\n key: tool.name,\n label: tool.label || tool.name,\n group,\n tool,\n defaultPermission: toolDefaultPermission(tool),\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\n// Splits a group's entries into parent-surface sub-buckets. Parentless entries\n// collapse into the NO_PARENT bucket, which sorts first and renders headerless.\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\nfunction 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\nfunction toolGroup(meta: ToolMeta): string {\n return meta.group ?? \"Tools\";\n}\n\nfunction toolDefaultPermission(meta: ToolMeta): ToolMode {\n return meta.defaultPermission ?? \"auto\";\n}\n\nfunction entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolMode>,\n): ToolMode {\n return normalizeToolMode(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\n// A group's toggle mode is its most-restrictive member, so cycling starts from\n// the safest current state.\nfunction 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\n// A header's DISPLAY mode: the shared member mode, or \"mixed\" when members\n// disagree. Cycling still uses groupToolMode; this is badge-only.\nfunction 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\nfunction 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\nfunction parseOptionalNumber(raw: string, integer = false): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const value = Number(raw);\n if (!Number.isFinite(value)) return undefined;\n return integer ? Math.max(0, Math.trunc(value)) : value;\n}\n\nfunction formatNumber(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return new Intl.NumberFormat().format(value);\n}\n\nfunction formatUSD(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return `$${value.toFixed(value >= 1 ? 4 : 6)}`;\n}\n"],"names":["jsx","cn","jsxs","Icon","UiChevronRight","UiChevronDown","useState","useMemo","Fragment","DropdownMenu","Button","UiSliders","Modal","UiShield","UiCode2","ToolSchemaBrowser","ModelSelector","EffortSelector","CLAUDE_PERMISSION_MODE_OPTIONS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiCode2,\n UiShield,\n UiSliders,\n} from \"../../icons\";\nimport { EffortSelector, ModelSelector } from \"../chat/ModelSelector\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\n\n// Tools cycle Auto -> Ask -> Off -> On on click (the compact toggle approach).\nconst MODE_CYCLE: ToolMode[] = [\"auto\", \"ask\", \"off\", \"on\"];\n\nconst MODE_LABEL: Record<ToolMode, string> = {\n on: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n off: \"Off\",\n};\n\nconst 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\n// A header can display \"Mixed\" when its members don't share one mode; individual\n// tool rows never do.\ntype BadgeMode = ToolMode | \"mixed\";\n\nconst BADGE_LABEL: Record<BadgeMode, string> = { ...MODE_LABEL, mixed: \"Mixed\" };\n\nconst BADGE_DESCRIPTION: Record<BadgeMode, string> = {\n ...MODE_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\ntype ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolMode;\n};\n\n// Sentinel parent for tools without a resolved surface — rendered directly under\n// their group with no entity sub-header.\nconst NO_PARENT = \"\\u0000no-parent\";\n\n// A parent surface (entity) sub-bucket within a group, e.g. \"Accounts\" inside\n// \"Accounting Read\". Supplies the disambiguating context for sibling verbs so\n// bare labels like \"Get\"/\"List\" stay distinguishable.\ntype ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\n// A permission-tier group (the load-bearing preferenceKey scope) plus its\n// parent-surface sub-buckets. `entries` is the flat member list used for the\n// group-level count and bulk cycle.\ntype ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport type ToolPreferencesProps = {\n /** The tools to list. Replaces ai-financials' global registry — callers pass\n * whatever their backend exposes. */\n tools: ToolMeta[];\n /** Current per-tool mode. Missing entries use each tool's default. */\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n reasoningEfforts?: string[] | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n className?: string;\n};\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\ntype AdvancedTab = \"config\" | \"permissions\" | \"browser\";\n\n// A single mode badge — shows exactly the current mode's label, tone-colored.\n// Headers may pass \"mixed\" when their members disagree.\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\n// A collapsible group header: a chevron to expand/collapse, the group name +\n// count as a button that cycles every tool in the group, and the group's mode\n// badge (\"Mixed\" when members disagree).\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 <span className=\"shrink-0\">\n <ModeBadge mode={mode} />\n </span>\n </button>\n </div>\n );\n}\n\n// One tool row — the whole row is a button that cycles the tool's mode. Rows\n// under an entity sub-header are indented so the sub-header reads as their\n// heading.\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\n// A collapsible entity sub-header inside a group: a chevron to expand/collapse\n// its rows, and a button that cycles every tool under the parent surface —\n// mirroring the group header one level down.\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 <span className=\"shrink-0\">\n <ModeBadge mode={mode} />\n </span>\n </button>\n </div>\n );\n}\n\n// A parent sub-bucket: its entity sub-header (when the parent is real) followed\n// by the tool rows. Parentless tools render as bare rows directly under the\n// group.\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 // Parentless tools have no sub-header, so they always show when the group is open.\n if (!hasParent) {\n return <>{rows}</>;\n }\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(subGroup.entries, groupToolMode(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\n// The compact per-tool list shared by the dropdown and the standalone list:\n// grouped, collapsible, single cycling badge per tool.\nfunction 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 // Track which nodes are EXPANDED, so everything starts collapsed (empty set)\n // like the tool browser's group view. Parent keys are namespaced under their\n // group since entity names repeat across groups.\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\n/** A popover that cycles tools through Auto -> Ask -> Off -> On. The resulting\n * `Record<name, ToolMode>` is meant to be forwarded to the backend (e.g. via\n * `<Chat body={{ toolPreferences }}>`). */\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n model,\n onModelChange,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n reasoningEffort = \"\",\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n toolsLoading = false,\n toolsError = null,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {([\"config\", \"permissions\", \"browser\"] as AdvancedTab[]).map(\n (tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon\n icon={\n tab === \"config\"\n ? UiSliders\n : tab === \"permissions\"\n ? UiShield\n : UiCode2\n }\n className=\"size-3.5\"\n />\n {tab}\n </button>\n ),\n )}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <ToolConfigPanel\n models={models}\n model={model}\n onModelChange={onModelChange}\n reasoningEfforts={reasoningEfforts}\n reasoningEffort={reasoningEffort}\n onReasoningEffortChange={onReasoningEffortChange}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\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\nfunction ToolConfigPanel({\n models,\n model,\n onModelChange,\n reasoningEfforts,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode,\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n}: {\n models: ChatModel[];\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n reasoningEfforts: string[];\n reasoningEffort: string;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode: ClaudePermissionMode;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n}) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, key === \"maxTokens\");\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange?.(next);\n };\n\n return (\n <div className=\"grid min-h-0 flex-1 grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)] gap-4 overflow-y-auto\">\n <div className=\"space-y-4\">\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Model\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <ModelSelector\n models={models}\n value={model}\n onChange={(next) => onModelChange?.(next)}\n className=\"w-64\"\n />\n <EffortSelector\n efforts={reasoningEfforts}\n value={reasoningEffort}\n onChange={(next) => onReasoningEffortChange?.(next)}\n className=\"w-44\"\n />\n </div>\n <label className=\"grid max-w-md grid-cols-[9rem_minmax(0,1fr)] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Permission mode</span>\n <select\n aria-label=\"Permission mode\"\n value={permissionMode}\n onChange={(event) =>\n onPermissionModeChange?.(\n event.target.value as ClaudePermissionMode,\n )\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n >\n {CLAUDE_PERMISSION_MODE_OPTIONS.map((option) => (\n <option\n key={option.value}\n value={option.value}\n title={option.description}\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Generation\n </div>\n <label className=\"grid grid-cols-[8rem_minmax(0,1fr)_4rem] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Temperature</span>\n <input\n type=\"range\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? 0}\n onChange={(event) =>\n onTemperatureChange?.(Number(event.target.value))\n }\n />\n <input\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? \"\"}\n onChange={(event) =>\n onTemperatureChange?.(parseOptionalNumber(event.target.value))\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Budget\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max cost</span>\n <input\n type=\"number\"\n min={0}\n step={0.01}\n value={budget?.cost ?? \"\"}\n onChange={(event) => updateBudget(\"cost\", event.target.value)}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max tokens</span>\n <input\n type=\"number\"\n min={0}\n step={1}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) =>\n updateBudget(\"maxTokens\", event.target.value)\n }\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </div>\n </section>\n </div>\n <UsageCostPanel usage={usage} />\n </div>\n );\n}\n\nfunction UsageCostPanel({\n usage,\n}: {\n usage?: ChatUsageSummary | null | undefined;\n}) {\n const tokens = usage?.usage;\n const costs = usage?.costBreakdown;\n return (\n <aside className=\"space-y-3 border-l border-border pl-4\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Usage\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow\n label=\"Context\"\n value={`${formatNumber(usage?.usedTokens)} / ${formatNumber(usage?.maxTokens)}`}\n />\n <MetricRow\n label=\"Input tokens\"\n value={formatNumber(tokens?.inputTokens)}\n />\n <MetricRow\n label=\"Output tokens\"\n value={formatNumber(tokens?.outputTokens)}\n />\n <MetricRow\n label=\"Reasoning tokens\"\n value={formatNumber(tokens?.reasoningTokens)}\n />\n <MetricRow\n label=\"Cache read tokens\"\n value={formatNumber(tokens?.cacheReadTokens)}\n />\n <MetricRow\n label=\"Cache write tokens\"\n value={formatNumber(tokens?.cacheWriteTokens)}\n />\n <MetricRow\n label=\"Total tokens\"\n value={formatNumber(tokens?.totalTokens)}\n />\n </div>\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Cost\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow label=\"Input\" value={formatUSD(costs?.inputUsd)} />\n <MetricRow label=\"Output\" value={formatUSD(costs?.outputUsd)} />\n <MetricRow label=\"Reasoning\" value={formatUSD(costs?.reasoningUsd)} />\n <MetricRow label=\"Cache read\" value={formatUSD(costs?.cacheReadUsd)} />\n <MetricRow\n label=\"Cache write\"\n value={formatUSD(costs?.cacheWriteUsd)}\n />\n <MetricRow\n label=\"Thread total\"\n value={formatUSD(usage?.cost ?? costs?.totalUsd)}\n strong\n />\n </div>\n </aside>\n );\n}\n\nfunction MetricRow({\n label,\n value,\n strong = false,\n}: {\n label: string;\n value: string;\n strong?: boolean;\n}) {\n return (\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 border-b border-border px-2 py-1.5 text-xs last:border-b-0\">\n <span className=\"truncate text-muted-foreground\">{label}</span>\n <span\n className={cn(\"font-mono\", strong && \"font-semibold text-foreground\")}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n\nfunction groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const group = toolGroup(tool);\n const entry: ToolPreferenceEntry = {\n key: tool.name,\n label: tool.label || tool.name,\n group,\n tool,\n defaultPermission: toolDefaultPermission(tool),\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\n// Splits a group's entries into parent-surface sub-buckets. Parentless entries\n// collapse into the NO_PARENT bucket, which sorts first and renders headerless.\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\nfunction 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\nfunction toolGroup(meta: ToolMeta): string {\n return meta.group ?? \"Tools\";\n}\n\nfunction toolDefaultPermission(meta: ToolMeta): ToolMode {\n return meta.defaultPermission ?? \"auto\";\n}\n\nfunction entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolMode>,\n): ToolMode {\n return normalizeToolMode(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\n// A group's toggle mode is its most-restrictive member, so cycling starts from\n// the safest current state.\nfunction 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\n// A header's DISPLAY mode: the shared member mode, or \"mixed\" when members\n// disagree. Cycling still uses groupToolMode; this is badge-only.\nfunction 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\nfunction 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\nfunction parseOptionalNumber(raw: string, integer = false): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const value = Number(raw);\n if (!Number.isFinite(value)) return undefined;\n return integer ? Math.max(0, Math.trunc(value)) : value;\n}\n\nfunction formatNumber(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return new Intl.NumberFormat().format(value);\n}\n\nfunction formatUSD(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return `$${value.toFixed(value >= 1 ? 4 : 6)}`;\n}\n"],"names":["jsx","cn","jsxs","Icon","UiChevronRight","UiChevronDown","useState","DEFAULT_REASONING_EFFORTS","useMemo","Fragment","DropdownMenu","Button","UiSliders","Modal","UiShield","UiCode2","ToolSchemaBrowser","ModelSelector","EffortSelector","CLAUDE_PERMISSION_MODE_OPTIONS"],"mappings":";;;;;;;;;;;;;;;;;;AA8BA,MAAM,aAAyB,CAAC,QAAQ,OAAO,OAAO,IAAI;AAE1D,MAAM,aAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAEA,MAAM,mBAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAMA,MAAM,cAAyC,EAAE,GAAG,YAAY,OAAO,QAAA;AAEvE,MAAM,oBAA+C;AAAA,EACnD,GAAG;AAAA,EACH,OAAO;AACT;AAYA,MAAM,YAAY;AAyDlB,SAAS,UAAU,EAAE,QAA6B;AAChD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,SAAS,QACP;AAAA,QACF,SAAS,UAAU;AAAA,QACnB,SAAS,SAAS;AAAA,QAClB,SAAS,SAAS;AAAA,QAClB,SAAS,WACP;AAAA,MAAA;AAAA,MAEJ,OAAO,kBAAkB,IAAI;AAAA,MAE5B,sBAAY,IAAI;AAAA,IAAA;AAAA,EAAA;AAGvB;AAKA,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,IAAAF,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,UAACG,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,YAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,6FACb,UAAA,OACH;AAAA,YACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA,MAAA,CACH;AAAA,UAAA,GACF;AAAA,yCACC,QAAA,EAAK,WAAU,YACd,UAAAA,2BAAAA,IAAC,WAAA,EAAU,MAAY,EAAA,CACzB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAKA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAKG;AACD,SACEE,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWD,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,SAAS;AAAA,YAAA;AAAA,YAGnB,UAAA,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAETD,+BAAC,aAAU,KAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG7B;AAKA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAU,8EACb,UAAA;AAAA,IAAAF,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,UAACG,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,YAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,+DACb,UAAA,QACH;AAAA,YACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA,MAAA,CACH;AAAA,UAAA,GACF;AAAA,yCACC,QAAA,EAAK,WAAU,YACd,UAAAA,2BAAAA,IAAC,WAAA,EAAU,MAAY,EAAA,CACzB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAKA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,OAAO,SAAS,QAAQ,IAAI,CAAC,UACjCA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MAEC;AAAA,MACA,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5B,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,IAJL,MAAM;AAAA,EAAA,CAMd;AAED,MAAI,CAAC,WAAW;AACd,iEAAU,UAAA,KAAA,CAAK;AAAA,EACjB;AACA,yCACG,OAAA,EACC,UAAA;AAAA,IAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,SAAS;AAAA,QACjB,OAAO,SAAS,QAAQ;AAAA,QACxB,WAAW,CAAC;AAAA,QACZ,MAAM,WAAW,SAAS,SAAS,KAAK;AAAA,QACxC,kBAAkB;AAAA,QAClB,cAAc,MACZ,eAAe,SAAS,SAAS,cAAc,SAAS,SAAS,KAAK,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAG1E,QAAQ;AAAA,EAAA,GACX;AAEJ;AAIA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAKG;AAID,QAAM,CAAC,UAAU,WAAW,IAAIM,MAAAA,SAAsB,MAAM,oBAAI,KAAK;AACrE,MAAI,OAAO,WAAW,GAAG;AACvB,WACEN,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,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,SAAS,OAAO,GAAG;AACvD,QAAM,eAAe,CAAC,SAAgC,YAAsB;AAC1E,UAAM,OAAO,SAAS,OAAO;AAC7B,UAAM,UAAU,EAAE,GAAG,MAAA;AACrB,eAAW,SAAS,QAAS,SAAQ,MAAM,GAAG,IAAI;AAClD,aAAS,OAAO;AAAA,EAClB;AACA,wCACG,OAAA,EAAI,WAAU,aACZ,UAAA,OAAO,IAAI,CAAC,UAAU;AACrB,UAAM,YAAY,OAAO,MAAM,KAAK;AACpC,2CACG,OAAA,EACC,UAAA;AAAA,MAAAA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,OAAO,MAAM,QAAQ;AAAA,UACrB,WAAW,CAAC;AAAA,UACZ,MAAM,WAAW,MAAM,SAAS,KAAK;AAAA,UACrC,kBAAkB,MAAM,OAAO,MAAM,KAAK;AAAA,UAC1C,cAAc,MACZ,aAAa,MAAM,SAAS,cAAc,MAAM,SAAS,KAAK,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAGlE,4CACE,OAAA,EAAI,WAAU,qBACZ,UAAA,MAAM,UAAU,IAAI,CAAC,aAAa;AACjC,cAAM,YAAY,GAAG,MAAM,KAAK,MAAM,SAAS,MAAM;AACrD,eACEA,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,gBAAgB;AAAA,UAAA;AAAA,UANX,SAAS;AAAA,QAAA;AAAA,MASpB,CAAC,EAAA,CACH;AAAA,IAAA,EAAA,GA3BM,MAAM,KA6BhB;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;AAKO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,CAAA;AAAA,EACT;AAAA,EACA;AAAA,EACA,mBAAmBO,YAAAA;AAAAA,EACnB,kBAAkB;AAAA,EAClB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AACd,GAAyB;AACvB,QAAM,CAAC,cAAc,eAAe,IAAID,MAAAA,SAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAsB,QAAQ;AACpE,QAAM,SAASE,MAAAA,QAAQ,MAAM,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;AAE/D,SACEN,2BAAAA,KAAAO,qBAAA,EACE,UAAA;AAAA,IAAAT,2BAAAA;AAAAA,MAACU,aAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN;AAAA,QACA,eAAc;AAAA,QACd,SACEV,2BAAAA;AAAAA,UAACW,OAAAA;AAAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,eAAY;AAAA,YAEZ,UAAAX,2BAAAA,IAACG,WAAA,EAAK,MAAMS,UAAAA,WAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAI7C,UAAA,CAAC,cACAV,2BAAAA,KAAC,OAAA,EACC,UAAA;AAAA,UAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,oBAEjD;AAAA,UACAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAW;AAAA,YAAA;AAAA,UAAA;AAAA,UAEbA,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCACb,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM;AACb,0BAAA;AACA,gCAAgB,IAAI;AAAA,cACtB;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA,EAED,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJA,2BAAAA;AAAAA,MAACa,MAAAA;AAAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,OAAM;AAAA,QACN,MAAK;AAAA,QAEL,UAAAX,2BAAAA,KAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,UAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,wEACX,UAAA;AAAA,YAAA,CAAC,UAAU,eAAe,SAAS,EAAoB;AAAA,cACvD,CAAC,QACCA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAWD,MAAAA;AAAAA,oBACT;AAAA,oBACA,gBAAgB,MACZ,4CACA;AAAA,kBAAA;AAAA,kBAEN,SAAS,MAAM,eAAe,GAAG;AAAA,kBAEjC,UAAA;AAAA,oBAAAD,2BAAAA;AAAAA,sBAACG,KAAAA;AAAAA,sBAAA;AAAA,wBACC,MACE,QAAQ,WACJS,UAAAA,YACA,QAAQ,gBACNE,SAAAA,WACAC,QAAAA;AAAAA,wBAER,WAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAEX;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBApBI;AAAA,cAAA;AAAA,YAqBP;AAAA,YAGJf,2BAAAA,IAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,YACvB,gBACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA,iBAEzD;AAAA,YAED,cACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qCACb,UAAA,WAAA,CACH;AAAA,UAAA,GAEJ;AAAA,UACC,gBAAgB,WACfA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAEA,gBAAgB,gBAClBA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAGFA,2BAAAA,IAACgB,kBAAAA,mBAAA,EAAkB,OAAc,WAAU,iBAAA,CAAiB;AAAA,QAAA,EAAA,CAEhE;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AACF,GAAoC;AAClC,QAAM,SAASR,MAAAA;AAAAA,IACb,MAAM,kCAAkC,OAAO,KAAK;AAAA,IACpD,CAAC,OAAO,KAAK;AAAA,EAAA;AAEf,yCACG,OAAA,EAAI,WAAWP,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;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAcG;AACD,QAAM,eAAe,CAAC,KAA6B,QAAgB;AACjE,UAAM,OAAyB,EAAE,GAAG,OAAA;AACpC,UAAM,SAAS,oBAAoB,KAAK,QAAQ,WAAW;AAC3D,QAAI,WAAW,QAAW;AACxB,aAAO,KAAK,GAAG;AAAA,IACjB,OAAO;AACL,WAAK,GAAG,IAAI;AAAA,IACd;AACA,qDAAiB;AAAA,EACnB;AAEA,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAU,2FACb,UAAA;AAAA,IAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,SAEtF;AAAA,QACAE,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAF,2BAAAA;AAAAA,YAACiB,cAAAA;AAAAA,YAAA;AAAA,cACC;AAAA,cACA,OAAO;AAAA,cACP,UAAU,CAAC,SAAS,+CAAgB;AAAA,cACpC,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZjB,2BAAAA;AAAAA,YAACkB,cAAAA;AAAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,OAAO;AAAA,cACP,UAAU,CAAC,SAAS,mEAA0B;AAAA,cAC9C,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QACAhB,2BAAAA,KAAC,SAAA,EAAM,WAAU,2EACf,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,mBAAe;AAAA,UACvDA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU,CAAC,UACT;AAAA,gBACE,MAAM,OAAO;AAAA;AAAA,cAGjB,WAAU;AAAA,cAET,UAAAmB,MAAAA,+BAA+B,IAAI,CAAC,WACnCnB,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,OAAO,OAAO;AAAA,kBACd,OAAO,OAAO;AAAA,kBAEb,UAAA,OAAO;AAAA,gBAAA;AAAA,gBAJH,OAAO;AAAA,cAAA,CAMf;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACAE,2BAAAA,KAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,cAEtF;AAAA,QACAE,2BAAAA,KAAC,SAAA,EAAM,WAAU,uEACf,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,eAAW;AAAA,UACnDA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,eAAe;AAAA,cACtB,UAAU,CAAC,UACT,2DAAsB,OAAO,MAAM,OAAO,KAAK;AAAA,YAAC;AAAA,UAAA;AAAA,UAGpDA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,eAAe;AAAA,cACtB,UAAU,CAAC,UACT,2DAAsB,oBAAoB,MAAM,OAAO,KAAK;AAAA,cAE9D,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACAE,2BAAAA,KAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,UAEtF;AAAA,QACAE,2BAAAA,KAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,UAAAA,2BAAAA,KAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,YAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,YAAQ;AAAA,YAChDA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,QAAO,iCAAQ,SAAQ;AAAA,gBACvB,UAAU,CAAC,UAAU,aAAa,QAAQ,MAAM,OAAO,KAAK;AAAA,gBAC5D,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,UACAE,2BAAAA,KAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,YAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,cAAU;AAAA,YAClDA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,QAAO,iCAAQ,cAAa;AAAA,gBAC5B,UAAU,CAAC,UACT,aAAa,aAAa,MAAM,OAAO,KAAK;AAAA,gBAE9C,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACAA,+BAAC,kBAAe,MAAA,CAAc;AAAA,EAAA,GAChC;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AACF,GAEG;AACD,QAAM,SAAS,+BAAO;AACtB,QAAM,QAAQ,+BAAO;AACrB,SACEE,2BAAAA,KAAC,SAAA,EAAM,WAAU,yCACf,UAAA;AAAA,IAAAF,2BAAAA,IAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,SAEtF;AAAA,IACAE,2BAAAA,KAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,MAAAF,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,GAAG,aAAa,+BAAO,UAAU,CAAC,MAAM,aAAa,+BAAO,SAAS,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAE/EA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,WAAW;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzCA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAE1CA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7CA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7CA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,gBAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9CA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,WAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACzC,GACF;AAAA,IACAA,2BAAAA,IAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,QAEtF;AAAA,IACAE,2BAAAA,KAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,MAAAF,+BAAC,aAAU,OAAM,SAAQ,OAAO,UAAU,+BAAO,QAAQ,GAAG;AAAA,MAC5DA,+BAAC,aAAU,OAAM,UAAS,OAAO,UAAU,+BAAO,SAAS,GAAG;AAAA,MAC9DA,+BAAC,aAAU,OAAM,aAAY,OAAO,UAAU,+BAAO,YAAY,GAAG;AAAA,MACpEA,+BAAC,aAAU,OAAM,cAAa,OAAO,UAAU,+BAAO,YAAY,GAAG;AAAA,MACrEA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,UAAU,+BAAO,aAAa;AAAA,QAAA;AAAA,MAAA;AAAA,MAEvCA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,WAAU,+BAAO,UAAQ,+BAAO,SAAQ;AAAA,UAC/C,QAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACR,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAIG;AACD,SACEE,2BAAAA,KAAC,OAAA,EAAI,WAAU,wGACb,UAAA;AAAA,IAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,kCAAkC,UAAA,OAAM;AAAA,IACxDA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,MAAAA,GAAG,aAAa,UAAU,+BAA+B;AAAA,QAEnE,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACED,2BAAAA,IAAC,OAAA,EAAI,WAAU,mEACb,UAAAA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW;AAAA,IAAA;AAAA,EAAA,GAEf;AAEJ;AAEA,SAAS,mBAAmB,OAAgC;AAC1D,QAAM,SAAgD,CAAA;AACtD,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,UAAU,IAAI;AAC5B,UAAM,QAA6B;AAAA,MACjC,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,mBAAmB,sBAAsB,IAAI;AAAA,IAAA;AAE/C,KAAC,kCAAkB,CAAA,IAAI,KAAK,KAAK;AAAA,EACnC;AACA,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,eAAe,OAAO,OAAO,CAAC,EACxD,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAClD;AAIA,SAAS,eACP,OACA,SACW;;AACX,QAAM,WAAkD,CAAA;AACxD,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAS,WAAM,KAAK,WAAX,mBAAmB,WAAU;AAC5C,KAAC,wCAAqB,CAAA,IAAI,KAAK,KAAK;AAAA,EACtC;AACA,QAAM,YAAY,OAAO,QAAQ,QAAQ,EACtC,IAAI,CAAC,CAAC,QAAQ,UAAU,OAAO;AAAA,IAC9B;AAAA,IACA,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,EAAA,EACtE,EACD,KAAK,gBAAgB;AACxB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IACnE;AAAA,EAAA;AAEJ;AAEA,SAAS,iBAAiB,GAAiB,GAAyB;AAClE,MAAI,EAAE,WAAW,kBAAkB,EAAE,WAAW,YAAY,IAAI;AAChE,MAAI,EAAE,WAAW,UAAW,QAAO;AACnC,SAAO,EAAE,OAAO,cAAc,EAAE,MAAM;AACxC;AAEA,SAAS,kCACP,OACA,OACa;AACb,QAAM,SAAS,mBAAmB,KAAK;AACvC,QAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACpD,QAAM,gBAAgB,OAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM;AACpE,UAAM,iBAAiB,kBAAkB,IAAI;AAC7C,QAAI,MAAM,IAAI,IAAI,KAAK,CAAC,uBAAuB,CAAA;AAC/C,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,mBAAmB;AAAA,QAAA;AAAA,QAErB,mBAAmB;AAAA,MAAA;AAAA,IACrB;AAAA,EAEJ,CAAC;AACD,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,SAAO,CAAC,GAAG,QAAQ,eAAe,UAAU,aAAa,CAAC;AAC5D;AAEA,SAAS,kBAAkB,OAAqC;AAC9D,UAAQ,MAAM,KAAA,EAAO,YAAA,GAAY;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,UAAU,MAAwB;AACzC,SAAO,KAAK,SAAS;AACvB;AAEA,SAAS,sBAAsB,MAA0B;AACvD,SAAO,KAAK,qBAAqB;AACnC;AAEA,SAAS,UACP,OACA,OACU;AACV,SAAO,kBAAkB,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,MAAM;AAC5D;AAIA,SAAS,cACP,SACA,OACU;AACV,SAAO,QAAQ;AAAA,IACb,CAAC,MAAM,UAAU,oBAAoB,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClE;AAAA,EAAA;AAEJ;AAIA,SAAS,WACP,SACA,OACW;AACX,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,UAAU,OAAO,KAAK;AACxC,SAAO,QAAQ,MAAM,CAAC,UAAU,UAAU,OAAO,KAAK,MAAM,SAAS,IACjE,YACA;AACN;AAEA,SAAS,SAAS,MAA0B;AAC1C,QAAM,UAAU,WAAW,QAAQ,IAAI;AACvC,SAAO,aAAa,WAAW,IAAI,UAAU,KAAK,KAAK,WAAW,MAAM;AAC1E;AAEA,SAAS,oBAAoB,GAAa,GAAuB;AAC/D,SAAO,SAAS,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI;AAC1C;AAEA,SAAS,SAAS,MAAwB;AACxC,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,oBAAoB,KAAa,UAAU,OAA2B;AAC7E,MAAI,IAAI,WAAW,GAAI,QAAO;AAC9B,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;AACpD;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,SAAO,IAAI,KAAK,eAAe,OAAO,KAAK;AAC7C;AAEA,SAAS,UAAU,OAAmC;AACpD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,SAAO,IAAI,MAAM,QAAQ,SAAS,IAAI,IAAI,CAAC,CAAC;AAC9C;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,QAAQ,EACT,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AA2D1E,MAAM,MAAM,oBAAoB,GAAG;IACjC;0CACsC;IACtC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,uBAAuB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjE,cAAc,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAClD,sBAAsB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mBAAmB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9E,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;IACpD,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;AA+SF;;4CAE4C;AAC5C,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAW,EACX,KAAK,EACL,aAAa,EACb,gBAA4C,EAC5C,eAAoB,EACpB,uBAAuB,EACvB,cAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,cAAc,EACd,KAAK,EACL,YAAoB,EACpB,UAAiB,EACjB,SAAc,GACf,EAAE,oBAAoB,2CA4HtB;AAED,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAA2B,EAC3B,UAAiC,EACjC,SAAS,GACV,EAAE,+BAA+B,2CAkBjC"}
|
|
@@ -6,6 +6,7 @@ import { Modal } from "../../overlay/Modal.js";
|
|
|
6
6
|
import { Button } from "../../components/button.js";
|
|
7
7
|
import { Icon } from "../Icon.js";
|
|
8
8
|
import { ModelSelector, EffortSelector } from "../chat/ModelSelector.js";
|
|
9
|
+
import { DEFAULT_REASONING_EFFORTS } from "../chat/effort-icons.js";
|
|
9
10
|
import { ToolSchemaBrowser } from "./ToolSchemaBrowser.js";
|
|
10
11
|
import { CLAUDE_PERMISSION_MODE_OPTIONS } from "../chat/types.js";
|
|
11
12
|
import { UiSliders } from "../../icons/components/UiSliders.js";
|
|
@@ -271,7 +272,7 @@ function ToolPreferences({
|
|
|
271
272
|
models = [],
|
|
272
273
|
model,
|
|
273
274
|
onModelChange,
|
|
274
|
-
reasoningEfforts =
|
|
275
|
+
reasoningEfforts = DEFAULT_REASONING_EFFORTS,
|
|
275
276
|
reasoningEffort = "",
|
|
276
277
|
onReasoningEffortChange,
|
|
277
278
|
permissionMode = "default",
|