@flanksource/clicky-ui 0.3.17 → 0.3.18
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/dist/ai.cjs +12 -6
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -4
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +36 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +37 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +122 -153
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +124 -155
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxControl.cjs +145 -0
- package/dist/components/ComboboxControl.cjs.map +1 -0
- package/dist/components/ComboboxControl.d.ts +37 -0
- package/dist/components/ComboboxControl.d.ts.map +1 -0
- package/dist/components/ComboboxControl.js +145 -0
- package/dist/components/ComboboxControl.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +31 -14
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +31 -14
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxTags.cjs +40 -0
- package/dist/components/ComboboxTags.cjs.map +1 -0
- package/dist/components/ComboboxTags.d.ts +8 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -0
- package/dist/components/ComboboxTags.js +40 -0
- package/dist/components/ComboboxTags.js.map +1 -0
- package/dist/components/ErrorWrapper.cjs +168 -0
- package/dist/components/ErrorWrapper.cjs.map +1 -0
- package/dist/components/ErrorWrapper.d.ts +19 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -0
- package/dist/components/ErrorWrapper.js +168 -0
- package/dist/components/ErrorWrapper.js.map +1 -0
- package/dist/components/FilterBar.cjs +64 -2
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +18 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +64 -2
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JSONPathField.cjs +91 -0
- package/dist/components/JSONPathField.cjs.map +1 -0
- package/dist/components/JSONPathField.d.ts +19 -0
- package/dist/components/JSONPathField.d.ts.map +1 -0
- package/dist/components/JSONPathField.js +91 -0
- package/dist/components/JSONPathField.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +8 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -4
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/TreePickerField.cjs +22 -4
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +22 -2
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +22 -4
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/TriStateToggle.cjs +53 -0
- package/dist/components/TriStateToggle.cjs.map +1 -0
- package/dist/components/TriStateToggle.d.ts +27 -0
- package/dist/components/TriStateToggle.d.ts.map +1 -0
- package/dist/components/TriStateToggle.js +53 -0
- package/dist/components/TriStateToggle.js.map +1 -0
- package/dist/components/combobox-types.d.ts +16 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/combobox-utils.cjs +26 -0
- package/dist/components/combobox-utils.cjs.map +1 -1
- package/dist/components/combobox-utils.d.ts +10 -0
- package/dist/components/combobox-utils.d.ts.map +1 -1
- package/dist/components/combobox-utils.js +26 -0
- package/dist/components/combobox-utils.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +5 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -1
- package/dist/components/filter-bar-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-utils.js +5 -0
- package/dist/components/filter-bar-utils.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +290 -0
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
- package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-accordion-array.js +290 -0
- package/dist/components/json-schema-form-accordion-array.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +99 -110
- 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 +98 -109
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +4 -2
- package/dist/components/json-schema-form-error-display.cjs.map +1 -1
- package/dist/components/json-schema-form-error-display.d.ts +4 -2
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
- package/dist/components/json-schema-form-error-display.js +4 -2
- package/dist/components/json-schema-form-error-display.js.map +1 -1
- package/dist/components/json-schema-form-extensions.cjs +10 -0
- package/dist/components/json-schema-form-extensions.cjs.map +1 -0
- package/dist/components/json-schema-form-extensions.d.ts +8 -0
- package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
- package/dist/components/json-schema-form-extensions.js +10 -0
- package/dist/components/json-schema-form-extensions.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +25 -101
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +1 -32
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +28 -104
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +131 -0
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
- package/dist/components/json-schema-form-item-summary.d.ts +13 -0
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
- package/dist/components/json-schema-form-item-summary.js +131 -0
- package/dist/components/json-schema-form-item-summary.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +156 -0
- package/dist/components/json-schema-form-layout.cjs.map +1 -0
- package/dist/components/json-schema-form-layout.d.ts +43 -0
- package/dist/components/json-schema-form-layout.d.ts.map +1 -0
- package/dist/components/json-schema-form-layout.js +156 -0
- package/dist/components/json-schema-form-layout.js.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
- package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.js +149 -0
- package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +11 -4
- 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 +11 -4
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +51 -28
- 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 +51 -28
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +62 -13
- 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 +62 -13
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +123 -0
- package/dist/components/json-schema-form-table-array.cjs.map +1 -0
- package/dist/components/json-schema-form-table-array.d.ts +7 -0
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.js +123 -0
- package/dist/components/json-schema-form-table-array.js.map +1 -0
- package/dist/components/json-schema-form-tone.cjs +34 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -0
- package/dist/components/json-schema-form-tone.d.ts +8 -0
- package/dist/components/json-schema-form-tone.d.ts.map +1 -0
- package/dist/components/json-schema-form-tone.js +34 -0
- package/dist/components/json-schema-form-tone.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +79 -10
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +47 -4
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +19 -4
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +47 -4
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/tri-state.cjs +8 -0
- package/dist/components/tri-state.cjs.map +1 -0
- package/dist/components/tri-state.d.ts +5 -0
- package/dist/components/tri-state.d.ts.map +1 -0
- package/dist/components/tri-state.js +8 -0
- package/dist/components/tri-state.js.map +1 -0
- package/dist/components/useComboboxLayout.cjs +59 -0
- package/dist/components/useComboboxLayout.cjs.map +1 -0
- package/dist/components/useComboboxLayout.d.ts +5 -0
- package/dist/components/useComboboxLayout.d.ts.map +1 -0
- package/dist/components/useComboboxLayout.js +59 -0
- package/dist/components/useComboboxLayout.js.map +1 -0
- package/dist/components.cjs +21 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +14 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +22 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +51 -2
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +10 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +51 -2
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +185 -53
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +63 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +185 -53
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/LogsTable.cjs +10 -1
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +3 -1
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +10 -1
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TaskManager.cjs +99 -14
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +100 -15
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProgress.cjs +50 -11
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +2 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +50 -11
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.js +289 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.js +120 -0
- package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.js +74 -0
- package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +78 -100
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +80 -102
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.js +120 -0
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +1 -1
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.thread.js +1 -1
- package/dist/data/ai/ChatWindow.thread.js.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +13 -5
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +3 -1
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +3 -1
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +2 -2
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
- package/dist/data/ai/RuntimeModePicker.js +1 -1
- package/dist/data/ai/RuntimeModePicker.js.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +26 -43
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.js +26 -43
- package/dist/data/ai/SessionInspector.files.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +1 -1
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.model.js +1 -1
- package/dist/data/ai/SessionInspector.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +4 -16
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +4 -16
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +65 -3
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +11 -5
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js +65 -3
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +65 -685
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +15 -17
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +64 -683
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +148 -0
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferences.model.js +148 -0
- package/dist/data/ai/ToolPreferences.model.js.map +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs +270 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
- package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferencesList.js +270 -0
- package/dist/data/ai/ToolPreferencesList.js.map +1 -0
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +4 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -0
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +4 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +6 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-tones.cjs +67 -0
- package/dist/data/ai/session-tones.cjs.map +1 -0
- package/dist/data/ai/session-tones.d.ts +34 -0
- package/dist/data/ai/session-tones.d.ts.map +1 -0
- package/dist/data/ai/session-tones.js +67 -0
- package/dist/data/ai/session-tones.js.map +1 -0
- package/dist/data/ai/thread-costs.cjs +39 -0
- package/dist/data/ai/thread-costs.cjs.map +1 -0
- package/dist/data/ai/thread-costs.d.ts +62 -0
- package/dist/data/ai/thread-costs.d.ts.map +1 -0
- package/dist/data/ai/thread-costs.js +39 -0
- package/dist/data/ai/thread-costs.js.map +1 -0
- package/dist/data/cells/CellFilterActions.cjs +68 -0
- package/dist/data/cells/CellFilterActions.cjs.map +1 -0
- package/dist/data/cells/CellFilterActions.d.ts +15 -0
- package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
- package/dist/data/cells/CellFilterActions.js +68 -0
- package/dist/data/cells/CellFilterActions.js.map +1 -0
- package/dist/data/chat/Chat.cjs +156 -113
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +24 -7
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +48 -3
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +48 -3
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +160 -117
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +63 -0
- package/dist/data/chat/Chat.runtime.cjs.map +1 -0
- package/dist/data/chat/Chat.runtime.d.ts +16 -0
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
- package/dist/data/chat/Chat.runtime.js +63 -0
- package/dist/data/chat/Chat.runtime.js.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +86 -24
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +12 -5
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +86 -24
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs +49 -6
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +11 -4
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +49 -6
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/index.d.ts +5 -3
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
- package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.js +50 -0
- package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
- package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.js +155 -0
- package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
- package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.js +140 -0
- package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
- package/dist/data/chat/tool-render/adapter.cjs +48 -0
- package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
- package/dist/data/chat/tool-render/adapter.d.ts +57 -0
- package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
- package/dist/data/chat/tool-render/adapter.js +48 -0
- package/dist/data/chat/tool-render/adapter.js.map +1 -0
- package/dist/data/chat/tool-render/context.cjs +16 -0
- package/dist/data/chat/tool-render/context.cjs.map +1 -0
- package/dist/data/chat/tool-render/context.d.ts +6 -0
- package/dist/data/chat/tool-render/context.d.ts.map +1 -0
- package/dist/data/chat/tool-render/context.js +16 -0
- package/dist/data/chat/tool-render/context.js.map +1 -0
- package/dist/data/chat/tool-render/defaults.cjs +45 -0
- package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
- package/dist/data/chat/tool-render/defaults.d.ts +11 -0
- package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
- package/dist/data/chat/tool-render/defaults.js +45 -0
- package/dist/data/chat/tool-render/defaults.js.map +1 -0
- package/dist/data/chat/tool-render/index.d.ts +13 -0
- package/dist/data/chat/tool-render/index.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.js +208 -0
- package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
- package/dist/data/chat/tool-render/known-tools.cjs +58 -0
- package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
- package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tools.js +58 -0
- package/dist/data/chat/tool-render/known-tools.js.map +1 -0
- package/dist/data/chat/tool-render/normalize.cjs +42 -0
- package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
- package/dist/data/chat/tool-render/normalize.d.ts +13 -0
- package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
- package/dist/data/chat/tool-render/normalize.js +42 -0
- package/dist/data/chat/tool-render/normalize.js.map +1 -0
- package/dist/data/chat/tool-render/registry.cjs +14 -0
- package/dist/data/chat/tool-render/registry.cjs.map +1 -0
- package/dist/data/chat/tool-render/registry.d.ts +7 -0
- package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
- package/dist/data/chat/tool-render/registry.js +14 -0
- package/dist/data/chat/tool-render/registry.js.map +1 -0
- package/dist/data/chat/tool-render/schema.cjs +57 -0
- package/dist/data/chat/tool-render/schema.cjs.map +1 -0
- package/dist/data/chat/tool-render/schema.d.ts +28 -0
- package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
- package/dist/data/chat/tool-render/schema.js +57 -0
- package/dist/data/chat/tool-render/schema.js.map +1 -0
- package/dist/data/chat/tool-render/shape.cjs +94 -0
- package/dist/data/chat/tool-render/shape.cjs.map +1 -0
- package/dist/data/chat/tool-render/shape.d.ts +39 -0
- package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
- package/dist/data/chat/tool-render/shape.js +94 -0
- package/dist/data/chat/tool-render/shape.js.map +1 -0
- package/dist/data/chat/tool-render/summary.cjs +34 -0
- package/dist/data/chat/tool-render/summary.cjs.map +1 -0
- package/dist/data/chat/tool-render/summary.d.ts +8 -0
- package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
- package/dist/data/chat/tool-render/summary.js +34 -0
- package/dist/data/chat/tool-render/summary.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +17 -0
- package/dist/data/chat/usage-snapshot.cjs.map +1 -0
- package/dist/data/chat/usage-snapshot.d.ts +21 -0
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
- package/dist/data/chat/usage-snapshot.js +17 -0
- package/dist/data/chat/usage-snapshot.js.map +1 -0
- package/dist/data/data-table-filter-values.cjs +83 -0
- package/dist/data/data-table-filter-values.cjs.map +1 -0
- package/dist/data/data-table-filter-values.d.ts +18 -0
- package/dist/data/data-table-filter-values.d.ts.map +1 -0
- package/dist/data/data-table-filter-values.js +83 -0
- package/dist/data/data-table-filter-values.js.map +1 -0
- package/dist/data/data-table-server-filters.cjs +171 -0
- package/dist/data/data-table-server-filters.cjs.map +1 -0
- package/dist/data/data-table-server-filters.d.ts +128 -0
- package/dist/data/data-table-server-filters.d.ts.map +1 -0
- package/dist/data/data-table-server-filters.js +171 -0
- package/dist/data/data-table-server-filters.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.cjs +96 -19
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.js +96 -19
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/index.d.ts +1 -1
- package/dist/data/query-browser/index.d.ts.map +1 -1
- package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
- package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.js +187 -0
- package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +147 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.d.ts +8 -6
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +147 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
- package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
- package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +58 -124
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
- package/dist/data/runtime/availability.cjs +11 -0
- package/dist/data/runtime/availability.cjs.map +1 -0
- package/dist/data/runtime/availability.d.ts +6 -0
- package/dist/data/runtime/availability.d.ts.map +1 -0
- package/dist/data/runtime/availability.js +11 -0
- package/dist/data/runtime/availability.js.map +1 -0
- package/dist/data/runtime/model-capabilities.cjs.map +1 -0
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
- package/dist/data/runtime/model-capabilities.js.map +1 -0
- package/dist/data/runtime/provider-status.cjs +106 -0
- package/dist/data/runtime/provider-status.cjs.map +1 -0
- package/dist/data/runtime/provider-status.d.ts +24 -0
- package/dist/data/runtime/provider-status.d.ts.map +1 -0
- package/dist/data/runtime/provider-status.js +106 -0
- package/dist/data/runtime/provider-status.js.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.cjs +119 -27
- package/dist/data/runtime/runtime-mode.cjs.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
- package/dist/data/runtime/runtime-mode.js.map +1 -0
- package/dist/data/task-query-keys.cjs +26 -0
- package/dist/data/task-query-keys.cjs.map +1 -0
- package/dist/data/task-query-keys.d.ts +27 -0
- package/dist/data/task-query-keys.d.ts.map +1 -0
- package/dist/data/task-query-keys.js +26 -0
- package/dist/data/task-query-keys.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +16 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +6 -1
- package/dist/hooks/use-hotkey.cjs.map +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.js +6 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +7 -4
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts +12 -0
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +7 -4
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +692 -0
- package/dist/icons/registry.cjs.map +1 -0
- package/dist/icons/registry.d.ts +21 -0
- package/dist/icons/registry.d.ts.map +1 -0
- package/dist/icons/registry.js +692 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/icons.cjs +3 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +4 -1
- 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 +92 -56
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +49 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +92 -56
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +144 -19
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts +6 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +144 -19
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +23 -7
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +3 -1
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +23 -7
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/lib/format.cjs +86 -4
- package/dist/lib/format.cjs.map +1 -1
- package/dist/lib/format.d.ts +69 -0
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +86 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/path-tree.cjs +69 -0
- package/dist/lib/path-tree.cjs.map +1 -0
- package/dist/lib/path-tree.d.ts +54 -0
- package/dist/lib/path-tree.d.ts.map +1 -0
- package/dist/lib/path-tree.js +69 -0
- package/dist/lib/path-tree.js.map +1 -0
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +13 -7
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/overlay/Tour.cjs +173 -0
- package/dist/overlay/Tour.cjs.map +1 -0
- package/dist/overlay/Tour.d.ts +61 -0
- package/dist/overlay/Tour.d.ts.map +1 -0
- package/dist/overlay/Tour.js +173 -0
- package/dist/overlay/Tour.js.map +1 -0
- package/dist/overlay/TourCard.cjs +108 -0
- package/dist/overlay/TourCard.cjs.map +1 -0
- package/dist/overlay/TourCard.d.ts +23 -0
- package/dist/overlay/TourCard.d.ts.map +1 -0
- package/dist/overlay/TourCard.js +108 -0
- package/dist/overlay/TourCard.js.map +1 -0
- package/dist/overlay/TourProvider.cjs +160 -0
- package/dist/overlay/TourProvider.cjs.map +1 -0
- package/dist/overlay/TourProvider.d.ts +31 -0
- package/dist/overlay/TourProvider.d.ts.map +1 -0
- package/dist/overlay/TourProvider.js +160 -0
- package/dist/overlay/TourProvider.js.map +1 -0
- package/dist/overlay/TourSpotlight.cjs +47 -0
- package/dist/overlay/TourSpotlight.cjs.map +1 -0
- package/dist/overlay/TourSpotlight.d.ts +12 -0
- package/dist/overlay/TourSpotlight.d.ts.map +1 -0
- package/dist/overlay/TourSpotlight.js +47 -0
- package/dist/overlay/TourSpotlight.js.map +1 -0
- package/dist/overlay/modalStack.cjs +18 -4
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +10 -2
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +19 -5
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/tour-anchor.cjs +114 -0
- package/dist/overlay/tour-anchor.cjs.map +1 -0
- package/dist/overlay/tour-anchor.d.ts +30 -0
- package/dist/overlay/tour-anchor.d.ts.map +1 -0
- package/dist/overlay/tour-anchor.js +114 -0
- package/dist/overlay/tour-anchor.js.map +1 -0
- package/dist/overlay/tour-context.cjs +12 -0
- package/dist/overlay/tour-context.cjs.map +1 -0
- package/dist/overlay/tour-context.d.ts +40 -0
- package/dist/overlay/tour-context.d.ts.map +1 -0
- package/dist/overlay/tour-context.js +12 -0
- package/dist/overlay/tour-context.js.map +1 -0
- package/dist/overlay/tour-geometry.cjs +65 -0
- package/dist/overlay/tour-geometry.cjs.map +1 -0
- package/dist/overlay/tour-geometry.d.ts +47 -0
- package/dist/overlay/tour-geometry.d.ts.map +1 -0
- package/dist/overlay/tour-geometry.js +65 -0
- package/dist/overlay/tour-geometry.js.map +1 -0
- package/dist/overlay/tour-model.cjs +79 -0
- package/dist/overlay/tour-model.cjs.map +1 -0
- package/dist/overlay/tour-model.d.ts +29 -0
- package/dist/overlay/tour-model.d.ts.map +1 -0
- package/dist/overlay/tour-model.js +79 -0
- package/dist/overlay/tour-model.js.map +1 -0
- package/dist/overlay/tour-progress.cjs +54 -0
- package/dist/overlay/tour-progress.cjs.map +1 -0
- package/dist/overlay/tour-progress.d.ts +40 -0
- package/dist/overlay/tour-progress.d.ts.map +1 -0
- package/dist/overlay/tour-progress.js +54 -0
- package/dist/overlay/tour-progress.js.map +1 -0
- package/dist/overlay/tour-types.d.ts +144 -0
- package/dist/overlay/tour-types.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.cjs +43 -0
- package/dist/overlay/use-tour-anchor.cjs.map +1 -0
- package/dist/overlay/use-tour-anchor.d.ts +23 -0
- package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.js +43 -0
- package/dist/overlay/use-tour-anchor.js.map +1 -0
- package/dist/overlay/use-tour-rect.cjs +33 -0
- package/dist/overlay/use-tour-rect.cjs.map +1 -0
- package/dist/overlay/use-tour-rect.d.ts +12 -0
- package/dist/overlay/use-tour-rect.d.ts.map +1 -0
- package/dist/overlay/use-tour-rect.js +33 -0
- package/dist/overlay/use-tour-rect.js.map +1 -0
- package/dist/overlay/use-tour-step.cjs +66 -0
- package/dist/overlay/use-tour-step.cjs.map +1 -0
- package/dist/overlay/use-tour-step.d.ts +45 -0
- package/dist/overlay/use-tour-step.d.ts.map +1 -0
- package/dist/overlay/use-tour-step.js +66 -0
- package/dist/overlay/use-tour-step.js.map +1 -0
- package/dist/overlay/zIndex.cjs +8 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.d.ts +8 -0
- package/dist/overlay/zIndex.d.ts.map +1 -1
- package/dist/overlay/zIndex.js +8 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +8 -0
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts +4 -1
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +8 -0
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +10 -16
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +10 -16
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +1 -1
- package/dist/rpc/OperationActionBar.cjs.map +1 -1
- package/dist/rpc/OperationActionBar.js +1 -1
- package/dist/rpc/OperationActionBar.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +83 -7
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +84 -8
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +2 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +6 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +2 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/SchemaActionForm.cjs +2 -21
- package/dist/rpc/SchemaActionForm.cjs.map +1 -1
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
- package/dist/rpc/SchemaActionForm.js +3 -22
- package/dist/rpc/SchemaActionForm.js.map +1 -1
- package/dist/rpc/apiClient.cjs +16 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +16 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +89 -49
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +14 -6
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +87 -47
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/operationFilterSearch.cjs +23 -0
- package/dist/rpc/operationFilterSearch.cjs.map +1 -0
- package/dist/rpc/operationFilterSearch.d.ts +22 -0
- package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
- package/dist/rpc/operationFilterSearch.js +23 -0
- package/dist/rpc/operationFilterSearch.js.map +1 -0
- package/dist/rpc/operationLookupFetcher.cjs +28 -0
- package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
- package/dist/rpc/operationLookupFetcher.d.ts +17 -0
- package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
- package/dist/rpc/operationLookupFetcher.js +28 -0
- package/dist/rpc/operationLookupFetcher.js.map +1 -0
- package/dist/rpc/surfaceNav.cjs +77 -0
- package/dist/rpc/surfaceNav.cjs.map +1 -0
- package/dist/rpc/surfaceNav.d.ts +19 -0
- package/dist/rpc/surfaceNav.d.ts.map +1 -0
- package/dist/rpc/surfaceNav.js +77 -0
- package/dist/rpc/surfaceNav.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +12 -1
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +8 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -2
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/data/ai/RuntimeBar.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.js.map +0 -1
- package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.model.js.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.js.map +0 -1
- package/dist/data/ai/model-capabilities.cjs.map +0 -1
- package/dist/data/ai/model-capabilities.d.ts.map +0 -1
- package/dist/data/ai/model-capabilities.js.map +0 -1
- package/dist/data/ai/runtime-mode.cjs.map +0 -1
- package/dist/data/ai/runtime-mode.d.ts.map +0 -1
- package/dist/data/ai/runtime-mode.js.map +0 -1
- /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
- /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityExplorerApp.js","sources":["../../src/rpc/EntityExplorerApp.tsx"],"sourcesContent":["import { useEffect, useMemo, type ReactNode } from \"react\";\nimport { ThemeSwitcher } from \"../components/theme-switcher\";\nimport type { PreExtension, PostExtension } from \"../components/json-schema-form-types\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { AppShell, type AppShellNavSection } from \"../layout/AppShell\";\nimport { getClickySurfaces, makeSurfaceDefinition } from \"./clickyMetadata\";\nimport {\n ARG_QUERY_PREFIX,\n AUTORUN_QUERY_PARAM,\n buildCommandHref,\n trimTrailingSlash,\n withBasePath,\n} from \"./commandHref\";\nimport { useRouter } from \"./router\";\nimport { OperationCatalog } from \"./OperationCatalog\";\nimport type { ResultRenderer } from \"./OperationResultView\";\nimport { OperationCommandPage } from \"./OperationCommandPage\";\nimport {\n OperationEntityPage,\n type EntityDetailBodyRenderer,\n type EntityDetailHeaderRenderer,\n} from \"./OperationEntityPage\";\nimport type { FormActionsRenderer } from \"./SchemaActionForm\";\nimport { resolveSurfaceIcon } from \"./surfaceIconMap\";\nimport type { ClickySurface } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport { useOperations } from \"./useOperations\";\n\nexport type SurfaceActionLabels = Record<string, Record<string, string>>;\n\nexport type EntityExplorerAppProps = {\n client: OperationsApiClient;\n basePath?: string;\n showApiExplorer?: boolean;\n /**\n * Custom JsonSchemaForm field extensions applied to every create/edit form the\n * explorer renders — e.g. a SecretKeySelector widget keyed on an\n * `x-clicky-component` schema hint. `pre` transforms a resolved control; `post`\n * can replace the rendered value node with a custom component.\n */\n formExtensions?: { pre?: PreExtension[]; post?: PostExtension[] };\n /**\n * Optional extra footer actions added to every create/edit form (e.g. a\n * connection \"Test\" split-button). The renderer receives the live form value\n * and the action it submits to, so it can scope itself to a given entity.\n */\n formActions?: FormActionsRenderer;\n /** Per-surface labels keyed by x-clicky verb/actionName. */\n surfaceActionLabels?: SurfaceActionLabels;\n /**\n * @deprecated Superseded by per-surface icons emitted by the backend\n * (x-clicky-icon → ClickySurface.icon). AppShell section labels are plain\n * strings, so this group-header icon map is no longer rendered. Kept for\n * source-compatibility only.\n */\n surfaceIcons?: Record<string, ReactNode>;\n /**\n * Optional host override for the result surface. Called where an entity's\n * result table renders, with the current surface key, the raw response, and\n * the default OperationResultView element. Return `defaultView` to keep the\n * standard table, or a custom node (e.g. a LogsTable for trace/log profiles\n * flagged via x-clicky-render). Filtering/sorting policy is the host's choice.\n */\n resultRenderer?: ResultRenderer;\n /** Host override for a loaded entity's body; heading and actions remain. */\n entityDetailBodyRenderer?: EntityDetailBodyRenderer;\n /** Host override for a loaded entity's \"{title}: {id}\" heading. */\n entityDetailHeaderRenderer?: EntityDetailHeaderRenderer;\n};\n\n// SIDEBAR_COLLAPSED_KEY persists the AppShell rail collapsed flag across reloads.\nconst SIDEBAR_COLLAPSED_KEY = \"clicky-ui:sidebar:collapsed\";\n\nexport function EntityExplorerApp({\n client,\n basePath = \"\",\n showApiExplorer = true,\n formExtensions,\n formActions,\n surfaceActionLabels,\n resultRenderer,\n entityDetailBodyRenderer,\n entityDetailHeaderRenderer,\n}: EntityExplorerAppProps) {\n const formPre = formExtensions?.pre;\n const formPost = formExtensions?.post;\n const { pathname, renderLink, navigate } = useRouter();\n const { spec } = useOperations(client);\n const surfaces = useMemo(() => getClickySurfaces(spec), [spec]);\n const surfaceGroups = useMemo(() => groupSurfacesByParent(surfaces), [surfaces]);\n const defaultSurface = useMemo(\n () => surfaces.find((surface) => !surface.admin) ?? surfaces[0],\n [surfaces],\n );\n const relativePath = useMemo(() => stripBasePath(pathname, basePath), [basePath, pathname]);\n const route = useMemo(() => parseExplorerRoute(relativePath), [relativePath]);\n const resolvedRoute = useMemo(() => resolveRouteSurface(route, surfaces), [route, surfaces]);\n const commandRuntime = useMemo<ClickyCommandRuntime>(\n () => ({\n client,\n hrefForCommand: (resolved) => buildCommandHref(basePath, resolved),\n onNavigate: (resolved) => {\n const href = buildCommandHref(basePath, resolved);\n if (!href) return;\n navigate(href);\n },\n }),\n [basePath, client, navigate],\n );\n const { initialValues: commandInitialValues } = useMemo(\n () =>\n resolvedRoute.kind === \"command\"\n ? readCommandQueryParams()\n : { initialValues: {}, autoRun: false },\n [resolvedRoute.kind, pathname],\n );\n const explorerDefinition = useMemo(\n () => ({\n key: \"explorer\",\n title: \"API Explorer\",\n description: \"Every operation exposed by the current OpenAPI spec.\",\n }),\n [],\n );\n const navSections = useMemo<AppShellNavSection[]>(() => {\n const sections: AppShellNavSection[] = surfaceGroups.map((group) => ({\n label: group.label,\n items: group.surfaces.map((surface) => {\n const icon = resolveSurfaceIcon(surface.icon);\n return {\n key: surface.key,\n label: surface.title,\n ...(icon ? { icon } : {}),\n active: isSurfaceRouteActive(resolvedRoute, surface.key),\n to: withBasePath(basePath, `/${surface.key}`),\n };\n }),\n }));\n if (showApiExplorer) {\n sections.push({\n items: [\n {\n key: explorerDefinition.key,\n label: explorerDefinition.title,\n active: resolvedRoute.kind === \"explorer\" || resolvedRoute.kind === \"command\",\n to: withBasePath(basePath, \"/explorer\"),\n },\n ],\n });\n }\n return sections;\n }, [surfaceGroups, basePath, resolvedRoute, showApiExplorer, explorerDefinition]);\n\n useEffect(() => {\n if (defaultSurface == null || relativePath !== \"/\") return;\n navigate(withBasePath(basePath, `/${defaultSurface.key}`), { replace: true });\n }, [basePath, defaultSurface, relativePath, navigate]);\n\n const content = (\n <AppShell\n brand={\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold\">\n {spec?.info.title ?? \"Clicky Explorer\"}\n </div>\n <div className=\"truncate text-xs text-sidebar-foreground/60\">\n Metadata-driven entity explorer\n </div>\n </div>\n }\n navSections={navSections}\n sidebarFooter={<ThemeSwitcher />}\n // The page header belongs to the host, not to OperationCatalog — the\n // catalog renders only its results. OperationEntityPage still titles\n // itself, so this covers the collection route only.\n {...(resolvedRoute.kind === \"surface\" && resolvedRoute.surface\n ? {\n bodyHeader: (\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-2xl font-semibold tracking-tight\">\n {resolvedRoute.surface.title}\n </h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">\n {makeSurfaceDefinition(resolvedRoute.surface).description}\n </p>\n </div>\n ),\n }\n : {})}\n collapsedStorageKey={SIDEBAR_COLLAPSED_KEY}\n contentClassName=\"p-6\"\n >\n {resolvedRoute.kind === \"surface\" ? (\n resolvedRoute.surface ? (\n <OperationCatalog\n definition={makeSurfaceDefinition(resolvedRoute.surface)}\n entities={[resolvedRoute.surface.entity]}\n client={client}\n renderLink={renderLink}\n surfaceKey={resolvedRoute.surface.key}\n commandRuntime={commandRuntime}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(surfaceActionLabels?.[resolvedRoute.surface.key]\n ? { actionLabels: surfaceActionLabels[resolvedRoute.surface.key] }\n : {})}\n {...(resultRenderer ? { resultRenderer } : {})}\n />\n ) : (\n <UnknownSurface surfaceKey={resolvedRoute.surfaceKey} />\n )\n ) : resolvedRoute.kind === \"entity\" ? (\n resolvedRoute.surface ? (\n <OperationEntityPage\n definition={makeSurfaceDefinition(resolvedRoute.surface)}\n entities={[resolvedRoute.surface.entity]}\n client={client}\n renderLink={renderLink}\n surfaceKey={resolvedRoute.surface.key}\n backHref={withBasePath(basePath, `/${resolvedRoute.surface.key}`)}\n backLabel={`Back to ${resolvedRoute.surface.title}`}\n commandRuntime={commandRuntime}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(surfaceActionLabels?.[resolvedRoute.surface.key]\n ? { actionLabels: surfaceActionLabels[resolvedRoute.surface.key] }\n : {})}\n {...(entityDetailBodyRenderer ? { entityDetailBodyRenderer } : {})}\n {...(entityDetailHeaderRenderer ? { entityDetailHeaderRenderer } : {})}\n {...(resolvedRoute.id ? { id: resolvedRoute.id } : {})}\n />\n ) : (\n <UnknownSurface surfaceKey={resolvedRoute.surfaceKey} />\n )\n ) : resolvedRoute.kind === \"command\" ? (\n <OperationCommandPage\n client={client}\n backHref={withBasePath(basePath, \"/explorer\")}\n backLabel=\"Back to API Explorer\"\n renderLink={renderLink}\n commandRuntime={commandRuntime}\n initialValues={commandInitialValues}\n autoRun={true}\n {...(resolvedRoute.operationId ? { operationId: resolvedRoute.operationId } : {})}\n />\n ) : resolvedRoute.kind === \"explorer\" ? (\n <OperationCatalog\n definition={explorerDefinition}\n entities={[]}\n allOperations\n client={client}\n renderLink={renderLink}\n commandRuntime={commandRuntime}\n />\n ) : defaultSurface == null ? (\n <div className=\"text-sm text-muted-foreground\">Loading surfaces…</div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">Redirecting…</div>\n )}\n </AppShell>\n );\n\n return content;\n}\n\ntype ExplorerRoute =\n | { kind: \"root\" }\n | { kind: \"explorer\" }\n | { kind: \"command\"; operationId?: string }\n | { kind: \"surface\"; surfaceKey: string; surface?: ClickySurface }\n | {\n kind: \"entity\";\n surfaceKey: string;\n surface?: ClickySurface;\n id?: string;\n };\n\nfunction parseExplorerRoute(pathname: string): ExplorerRoute {\n const normalized = trimTrailingSlash(pathname) || \"/\";\n if (normalized === \"/\") {\n return { kind: \"root\" };\n }\n\n const segments = normalized.replace(/^\\/+/, \"\").split(\"/\");\n if (segments[0] === \"explorer\") {\n return { kind: \"explorer\" };\n }\n if (segments[0] === \"commands\") {\n return segments[1] ? { kind: \"command\", operationId: segments[1] } : { kind: \"command\" };\n }\n const surfaceKey = segments[0] ?? \"\";\n if (segments[1]) {\n return {\n kind: \"entity\",\n surfaceKey,\n id: decodeURIComponent(segments[1]),\n };\n }\n return { kind: \"surface\", surfaceKey };\n}\n\nfunction resolveRouteSurface(route: ExplorerRoute, surfaces: ClickySurface[]): ExplorerRoute {\n if (route.kind !== \"surface\" && route.kind !== \"entity\") {\n return route;\n }\n const surface = surfaces.find((item) => item.key === route.surfaceKey);\n return surface ? { ...route, surface } : route;\n}\n\nfunction isSurfaceRouteActive(route: ExplorerRoute, surfaceKey: string) {\n return (\n (route.kind === \"surface\" && route.surfaceKey === surfaceKey) ||\n (route.kind === \"entity\" && route.surfaceKey === surfaceKey)\n );\n}\n\nfunction stripBasePath(pathname: string, basePath: string) {\n const base = trimTrailingSlash(basePath);\n if (!base || base === \"/\") {\n return trimTrailingSlash(pathname) || \"/\";\n }\n if (pathname === base) {\n return \"/\";\n }\n if (pathname.startsWith(`${base}/`)) {\n return trimTrailingSlash(pathname.slice(base.length)) || \"/\";\n }\n return trimTrailingSlash(pathname) || \"/\";\n}\n\nfunction UnknownSurface({ surfaceKey }: { surfaceKey: string }) {\n return (\n <div className=\"p-6 text-sm text-muted-foreground\">\n Unknown surface: <code>{surfaceKey}</code>\n </div>\n );\n}\n\nconst LEGACY_AUTORUN_QUERY_PARAM = \"__autoRun\";\n\ntype SurfaceGroup = {\n parent: string; // the slug; \"\" for surfaces that declared no parent\n label: string; // display name in the sidebar\n surfaces: ClickySurface[];\n};\n\n// groupSurfacesByParent buckets surfaces by their ClickySurface.parent slug,\n// preserving the order surfaces appeared in the spec. Surfaces with no parent\n// fall into a trailing \"\" bucket labelled \"Other\".\nfunction groupSurfacesByParent(surfaces: ClickySurface[]): SurfaceGroup[] {\n const order: string[] = [];\n const buckets = new Map<string, ClickySurface[]>();\n for (const surface of surfaces) {\n const parent = surface.parent ?? \"\";\n if (!buckets.has(parent)) {\n buckets.set(parent, []);\n order.push(parent);\n }\n buckets.get(parent)!.push(surface);\n }\n return order.map((parent) => ({\n parent,\n label: parent === \"\" ? \"Other\" : titleCase(parent),\n surfaces: buckets.get(parent)!,\n }));\n}\n\nfunction titleCase(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction readCommandQueryParams(): { initialValues: Record<string, string>; autoRun: boolean } {\n if (typeof window === \"undefined\") {\n return { initialValues: {}, autoRun: false };\n }\n const search = new URLSearchParams(window.location.search);\n const initialValues: Record<string, string> = {};\n let autoRun = false;\n const positional: string[] = [];\n\n for (const [key, value] of search.entries()) {\n if (key === AUTORUN_QUERY_PARAM || key === LEGACY_AUTORUN_QUERY_PARAM) {\n autoRun = value === \"1\" || value === \"true\";\n continue;\n }\n if (key.startsWith(ARG_QUERY_PREFIX)) {\n const index = Number.parseInt(key.slice(ARG_QUERY_PREFIX.length), 10);\n if (Number.isFinite(index) && index >= 0) {\n positional[index] = value;\n }\n continue;\n }\n initialValues[key] = value;\n }\n\n const packedArgs = positional.filter((value) => value !== undefined).join(\" \");\n if (packedArgs !== \"\") {\n initialValues.args = packedArgs;\n }\n\n return { initialValues, autoRun };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuEA,MAAM,wBAAwB;AAEvB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,UAAU,iDAAgB;AAChC,QAAM,WAAW,iDAAgB;AACjC,QAAM,EAAE,UAAU,YAAY,SAAA,IAAa,UAAA;AAC3C,QAAM,EAAE,KAAA,IAAS,cAAc,MAAM;AACrC,QAAM,WAAW,QAAQ,MAAM,kBAAkB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9D,QAAM,gBAAgB,QAAQ,MAAM,sBAAsB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAC/E,QAAM,iBAAiB;AAAA,IACrB,MAAM,SAAS,KAAK,CAAC,YAAY,CAAC,QAAQ,KAAK,KAAK,SAAS,CAAC;AAAA,IAC9D,CAAC,QAAQ;AAAA,EAAA;AAEX,QAAM,eAAe,QAAQ,MAAM,cAAc,UAAU,QAAQ,GAAG,CAAC,UAAU,QAAQ,CAAC;AAC1F,QAAM,QAAQ,QAAQ,MAAM,mBAAmB,YAAY,GAAG,CAAC,YAAY,CAAC;AAC5E,QAAM,gBAAgB,QAAQ,MAAM,oBAAoB,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC;AAC3F,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,MACL;AAAA,MACA,gBAAgB,CAAC,aAAa,iBAAiB,UAAU,QAAQ;AAAA,MACjE,YAAY,CAAC,aAAa;AACxB,cAAM,OAAO,iBAAiB,UAAU,QAAQ;AAChD,YAAI,CAAC,KAAM;AACX,iBAAS,IAAI;AAAA,MACf;AAAA,IAAA;AAAA,IAEF,CAAC,UAAU,QAAQ,QAAQ;AAAA,EAAA;AAE7B,QAAM,EAAE,eAAe,qBAAA,IAAyB;AAAA,IAC9C,MACE,cAAc,SAAS,YACnB,uBAAA,IACA,EAAE,eAAe,CAAA,GAAI,SAAS,MAAA;AAAA,IACpC,CAAC,cAAc,MAAM,QAAQ;AAAA,EAAA;AAE/B,QAAM,qBAAqB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,CAAA;AAAA,EAAC;AAEH,QAAM,cAAc,QAA8B,MAAM;AACtD,UAAM,WAAiC,cAAc,IAAI,CAAC,WAAW;AAAA,MACnE,OAAO,MAAM;AAAA,MACb,OAAO,MAAM,SAAS,IAAI,CAAC,YAAY;AACrC,cAAM,OAAO,mBAAmB,QAAQ,IAAI;AAC5C,eAAO;AAAA,UACL,KAAK,QAAQ;AAAA,UACb,OAAO,QAAQ;AAAA,UACf,GAAI,OAAO,EAAE,KAAA,IAAS,CAAA;AAAA,UACtB,QAAQ,qBAAqB,eAAe,QAAQ,GAAG;AAAA,UACvD,IAAI,aAAa,UAAU,IAAI,QAAQ,GAAG,EAAE;AAAA,QAAA;AAAA,MAEhD,CAAC;AAAA,IAAA,EACD;AACF,QAAI,iBAAiB;AACnB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,UACL;AAAA,YACE,KAAK,mBAAmB;AAAA,YACxB,OAAO,mBAAmB;AAAA,YAC1B,QAAQ,cAAc,SAAS,cAAc,cAAc,SAAS;AAAA,YACpE,IAAI,aAAa,UAAU,WAAW;AAAA,UAAA;AAAA,QACxC;AAAA,MACF,CACD;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,UAAU,eAAe,iBAAiB,kBAAkB,CAAC;AAEhF,YAAU,MAAM;AACd,QAAI,kBAAkB,QAAQ,iBAAiB,IAAK;AACpD,aAAS,aAAa,UAAU,IAAI,eAAe,GAAG,EAAE,GAAG,EAAE,SAAS,KAAA,CAAM;AAAA,EAC9E,GAAG,CAAC,UAAU,gBAAgB,cAAc,QAAQ,CAAC;AAErD,QAAM,UACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OACE,qBAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,QAAA,oBAAC,SAAI,WAAU,kCACZ,WAAA,6BAAM,KAAK,UAAS,mBACvB;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,+CAA8C,UAAA,kCAAA,CAE7D;AAAA,MAAA,GACF;AAAA,MAEF;AAAA,MACA,mCAAgB,eAAA,EAAc;AAAA,MAI7B,GAAI,cAAc,SAAS,aAAa,cAAc,UACnD;AAAA,QACE,YACE,qBAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAG,WAAU,kDACX,UAAA,cAAc,QAAQ,OACzB;AAAA,UACA,oBAAC,OAAE,WAAU,gDACV,gCAAsB,cAAc,OAAO,EAAE,YAAA,CAChD;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,IAGJ,CAAA;AAAA,MACJ,qBAAqB;AAAA,MACrB,kBAAiB;AAAA,MAEhB,UAAA,cAAc,SAAS,YACpB,cAAc,UACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY,sBAAsB,cAAc,OAAO;AAAA,UACvD,UAAU,CAAC,cAAc,QAAQ,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,UACA,YAAY,cAAc,QAAQ;AAAA,UAClC;AAAA,UACC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,UAC9B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,UAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,UACpC,IAAI,2DAAsB,cAAc,QAAQ,QAC7C,EAAE,cAAc,oBAAoB,cAAc,QAAQ,GAAG,EAAA,IAC7D,CAAA;AAAA,UACH,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,QAAC;AAAA,MAAA,IAG5C,oBAAC,gBAAA,EAAe,YAAY,cAAc,WAAA,CAAY,IAEtD,cAAc,SAAS,WACzB,cAAc,UACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY,sBAAsB,cAAc,OAAO;AAAA,UACvD,UAAU,CAAC,cAAc,QAAQ,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,UACA,YAAY,cAAc,QAAQ;AAAA,UAClC,UAAU,aAAa,UAAU,IAAI,cAAc,QAAQ,GAAG,EAAE;AAAA,UAChE,WAAW,WAAW,cAAc,QAAQ,KAAK;AAAA,UACjD;AAAA,UACC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,UAC9B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,UAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,UACpC,IAAI,2DAAsB,cAAc,QAAQ,QAC7C,EAAE,cAAc,oBAAoB,cAAc,QAAQ,GAAG,EAAA,IAC7D,CAAA;AAAA,UACH,GAAI,2BAA2B,EAAE,yBAAA,IAA6B,CAAA;AAAA,UAC9D,GAAI,6BAA6B,EAAE,2BAAA,IAA+B,CAAA;AAAA,UAClE,GAAI,cAAc,KAAK,EAAE,IAAI,cAAc,GAAA,IAAO,CAAA;AAAA,QAAC;AAAA,MAAA,wBAGnD,gBAAA,EAAe,YAAY,cAAc,WAAA,CAAY,IAEtD,cAAc,SAAS,YACzB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,aAAa,UAAU,WAAW;AAAA,UAC5C,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,SAAS;AAAA,UACR,GAAI,cAAc,cAAc,EAAE,aAAa,cAAc,YAAA,IAAgB,CAAA;AAAA,QAAC;AAAA,MAAA,IAE/E,cAAc,SAAS,aACzB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY;AAAA,UACZ,UAAU,CAAA;AAAA,UACV,eAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAAA,IAEA,kBAAkB,OACpB,oBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,oBAAA,CAAiB,IAEhE,oBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,eAAA,CAAY;AAAA,IAAA;AAAA,EAAA;AAKnE,SAAO;AACT;AAcA,SAAS,mBAAmB,UAAiC;AAC3D,QAAM,aAAa,kBAAkB,QAAQ,KAAK;AAClD,MAAI,eAAe,KAAK;AACtB,WAAO,EAAE,MAAM,OAAA;AAAA,EACjB;AAEA,QAAM,WAAW,WAAW,QAAQ,QAAQ,EAAE,EAAE,MAAM,GAAG;AACzD,MAAI,SAAS,CAAC,MAAM,YAAY;AAC9B,WAAO,EAAE,MAAM,WAAA;AAAA,EACjB;AACA,MAAI,SAAS,CAAC,MAAM,YAAY;AAC9B,WAAO,SAAS,CAAC,IAAI,EAAE,MAAM,WAAW,aAAa,SAAS,CAAC,EAAA,IAAM,EAAE,MAAM,UAAA;AAAA,EAC/E;AACA,QAAM,aAAa,SAAS,CAAC,KAAK;AAClC,MAAI,SAAS,CAAC,GAAG;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,IAAI,mBAAmB,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EAEtC;AACA,SAAO,EAAE,MAAM,WAAW,WAAA;AAC5B;AAEA,SAAS,oBAAoB,OAAsB,UAA0C;AAC3F,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,UAAU;AACvD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,MAAM,UAAU;AACrE,SAAO,UAAU,EAAE,GAAG,OAAO,YAAY;AAC3C;AAEA,SAAS,qBAAqB,OAAsB,YAAoB;AACtE,SACG,MAAM,SAAS,aAAa,MAAM,eAAe,cACjD,MAAM,SAAS,YAAY,MAAM,eAAe;AAErD;AAEA,SAAS,cAAc,UAAkB,UAAkB;AACzD,QAAM,OAAO,kBAAkB,QAAQ;AACvC,MAAI,CAAC,QAAQ,SAAS,KAAK;AACzB,WAAO,kBAAkB,QAAQ,KAAK;AAAA,EACxC;AACA,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,GAAG,IAAI,GAAG,GAAG;AACnC,WAAO,kBAAkB,SAAS,MAAM,KAAK,MAAM,CAAC,KAAK;AAAA,EAC3D;AACA,SAAO,kBAAkB,QAAQ,KAAK;AACxC;AAEA,SAAS,eAAe,EAAE,cAAsC;AAC9D,SACE,qBAAC,OAAA,EAAI,WAAU,qCAAoC,UAAA;AAAA,IAAA;AAAA,IAChC,oBAAC,UAAM,UAAA,WAAA,CAAW;AAAA,EAAA,GACrC;AAEJ;AAEA,MAAM,6BAA6B;AAWnC,SAAS,sBAAsB,UAA2C;AACxE,QAAM,QAAkB,CAAA;AACxB,QAAM,8BAAc,IAAA;AACpB,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,QAAQ,UAAU;AACjC,QAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,cAAQ,IAAI,QAAQ,EAAE;AACtB,YAAM,KAAK,MAAM;AAAA,IACnB;AACA,YAAQ,IAAI,MAAM,EAAG,KAAK,OAAO;AAAA,EACnC;AACA,SAAO,MAAM,IAAI,CAAC,YAAY;AAAA,IAC5B;AAAA,IACA,OAAO,WAAW,KAAK,UAAU,UAAU,MAAM;AAAA,IACjD,UAAU,QAAQ,IAAI,MAAM;AAAA,EAAA,EAC5B;AACJ;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC;AACtD;AAEA,SAAS,yBAAsF;AAC7F,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,eAAe,IAAI,SAAS,MAAA;AAAA,EACvC;AACA,QAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,QAAM,gBAAwC,CAAA;AAC9C,MAAI,UAAU;AACd,QAAM,aAAuB,CAAA;AAE7B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,WAAW;AAC3C,QAAI,QAAQ,uBAAuB,QAAQ,4BAA4B;AACrE,gBAAU,UAAU,OAAO,UAAU;AACrC;AAAA,IACF;AACA,QAAI,IAAI,WAAW,gBAAgB,GAAG;AACpC,YAAM,QAAQ,OAAO,SAAS,IAAI,MAAM,iBAAiB,MAAM,GAAG,EAAE;AACpE,UAAI,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACxC,mBAAW,KAAK,IAAI;AAAA,MACtB;AACA;AAAA,IACF;AACA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,WAAW,OAAO,CAAC,UAAU,UAAU,MAAS,EAAE,KAAK,GAAG;AAC7E,MAAI,eAAe,IAAI;AACrB,kBAAc,OAAO;AAAA,EACvB;AAEA,SAAO,EAAE,eAAe,QAAA;AAC1B;"}
|
|
1
|
+
{"version":3,"file":"EntityExplorerApp.js","sources":["../../src/rpc/EntityExplorerApp.tsx"],"sourcesContent":["import { useEffect, useMemo, type ReactNode } from \"react\";\nimport { ThemeSwitcher } from \"../components/theme-switcher\";\nimport type { PreExtension, PostExtension } from \"../components/json-schema-form-types\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { AppShell, type AppShellNavSection } from \"../layout/AppShell\";\nimport { getClickySurfaces, makeSurfaceDefinition } from \"./clickyMetadata\";\nimport {\n ARG_QUERY_PREFIX,\n AUTORUN_QUERY_PARAM,\n buildCommandHref,\n trimTrailingSlash,\n withBasePath,\n} from \"./commandHref\";\nimport { useRouter } from \"./router\";\nimport { OperationCatalog } from \"./OperationCatalog\";\nimport type { ResultRenderer } from \"./OperationResultView\";\nimport { OperationCommandPage } from \"./OperationCommandPage\";\nimport {\n OperationEntityPage,\n type EntityDetailBodyRenderer,\n type EntityDetailHeaderRenderer,\n} from \"./OperationEntityPage\";\nimport type { FormActionsRenderer } from \"./SchemaActionForm\";\nimport { surfaceNavSection } from \"./surfaceNav\";\nimport type { ClickySurface } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport { useOperations } from \"./useOperations\";\n\nexport type SurfaceActionLabels = Record<string, Record<string, string>>;\n\nexport type EntityExplorerAppProps = {\n client: OperationsApiClient;\n basePath?: string;\n showApiExplorer?: boolean;\n /**\n * Custom JsonSchemaForm field extensions applied to every create/edit form the\n * explorer renders — e.g. a SecretKeySelector widget keyed on an\n * `x-clicky-component` schema hint. `pre` transforms a resolved control; `post`\n * can replace the rendered value node with a custom component.\n */\n formExtensions?: { pre?: PreExtension[]; post?: PostExtension[] };\n /**\n * Optional extra footer actions added to every create/edit form (e.g. a\n * connection \"Test\" split-button). The renderer receives the live form value\n * and the action it submits to, so it can scope itself to a given entity.\n */\n formActions?: FormActionsRenderer;\n /** Per-surface labels keyed by x-clicky verb/actionName. */\n surfaceActionLabels?: SurfaceActionLabels;\n /**\n * @deprecated Superseded by per-surface icons emitted by the backend\n * (x-clicky-icon → ClickySurface.icon). AppShell section labels are plain\n * strings, so this group-header icon map is no longer rendered. Kept for\n * source-compatibility only.\n */\n surfaceIcons?: Record<string, ReactNode>;\n /**\n * Optional host override for the result surface. Called where an entity's\n * result table renders, with the current surface key, the raw response, and\n * the default OperationResultView element. Return `defaultView` to keep the\n * standard table, or a custom node (e.g. a LogsTable for trace/log profiles\n * flagged via x-clicky-render). Filtering/sorting policy is the host's choice.\n */\n resultRenderer?: ResultRenderer;\n /** Host override for a loaded entity's body; heading and actions remain. */\n entityDetailBodyRenderer?: EntityDetailBodyRenderer;\n /** Host override for a loaded entity's \"{title}: {id}\" heading. */\n entityDetailHeaderRenderer?: EntityDetailHeaderRenderer;\n};\n\n// SIDEBAR_COLLAPSED_KEY persists the AppShell rail collapsed flag across reloads.\nconst SIDEBAR_COLLAPSED_KEY = \"clicky-ui:sidebar:collapsed\";\n\nexport function EntityExplorerApp({\n client,\n basePath = \"\",\n showApiExplorer = true,\n formExtensions,\n formActions,\n surfaceActionLabels,\n resultRenderer,\n entityDetailBodyRenderer,\n entityDetailHeaderRenderer,\n}: EntityExplorerAppProps) {\n const formPre = formExtensions?.pre;\n const formPost = formExtensions?.post;\n const { pathname, renderLink, navigate } = useRouter();\n const { spec } = useOperations(client);\n const surfaces = useMemo(() => getClickySurfaces(spec), [spec]);\n const surfaceGroups = useMemo(() => groupSurfacesByParent(surfaces), [surfaces]);\n const defaultSurface = useMemo(\n () => surfaces.find((surface) => !surface.admin) ?? surfaces[0],\n [surfaces],\n );\n const relativePath = useMemo(() => stripBasePath(pathname, basePath), [basePath, pathname]);\n const route = useMemo(() => parseExplorerRoute(relativePath), [relativePath]);\n const resolvedRoute = useMemo(() => resolveRouteSurface(route, surfaces), [route, surfaces]);\n const commandRuntime = useMemo<ClickyCommandRuntime>(\n () => ({\n client,\n hrefForCommand: (resolved) => buildCommandHref(basePath, resolved),\n onNavigate: (resolved) => {\n const href = buildCommandHref(basePath, resolved);\n if (!href) return;\n navigate(href);\n },\n }),\n [basePath, client, navigate],\n );\n const { initialValues: commandInitialValues } = useMemo(\n () =>\n resolvedRoute.kind === \"command\"\n ? readCommandQueryParams()\n : { initialValues: {}, autoRun: false },\n [resolvedRoute.kind, pathname],\n );\n const explorerDefinition = useMemo(\n () => ({\n key: \"explorer\",\n title: \"API Explorer\",\n description: \"Every operation exposed by the current OpenAPI spec.\",\n }),\n [],\n );\n const navSections = useMemo<AppShellNavSection[]>(() => {\n const sections: AppShellNavSection[] = surfaceGroups.map((group) =>\n surfaceNavSection(group.label, group.surfaces, {\n isActive: (surface) => isSurfaceRouteActive(resolvedRoute, surface.key),\n hrefFor: (surface) => withBasePath(basePath, `/${surface.key}`),\n }),\n );\n if (showApiExplorer) {\n sections.push({\n items: [\n {\n key: explorerDefinition.key,\n label: explorerDefinition.title,\n active: resolvedRoute.kind === \"explorer\" || resolvedRoute.kind === \"command\",\n to: withBasePath(basePath, \"/explorer\"),\n },\n ],\n });\n }\n return sections;\n }, [surfaceGroups, basePath, resolvedRoute, showApiExplorer, explorerDefinition]);\n\n useEffect(() => {\n if (defaultSurface == null || relativePath !== \"/\") return;\n navigate(withBasePath(basePath, `/${defaultSurface.key}`), { replace: true });\n }, [basePath, defaultSurface, relativePath, navigate]);\n\n const content = (\n <AppShell\n brand={\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold\">\n {spec?.info.title ?? \"Clicky Explorer\"}\n </div>\n <div className=\"truncate text-xs text-sidebar-foreground/60\">\n Metadata-driven entity explorer\n </div>\n </div>\n }\n navSections={navSections}\n sidebarFooter={<ThemeSwitcher />}\n // The page header belongs to the host, not to OperationCatalog — the\n // catalog renders only its results. OperationEntityPage still titles\n // itself, so this covers the collection route only.\n //\n // It rides in the top bar rather than a bodyHeader row: next to the rail\n // that bar is otherwise empty, and the row it replaces cost the result\n // table ~72px of the viewport it needs to keep its sticky head and\n // pagination footer on screen without the page itself scrolling.\n {...(resolvedRoute.kind === \"surface\" && resolvedRoute.surface\n ? {\n nav: (\n <div className=\"flex min-w-0 flex-1 items-baseline gap-density-2\">\n <h1 className=\"min-w-0 truncate text-base font-semibold tracking-tight\">\n {resolvedRoute.surface.title}\n </h1>\n <p className=\"hidden min-w-0 truncate text-sm text-muted-foreground lg:block\">\n {makeSurfaceDefinition(resolvedRoute.surface).description}\n </p>\n </div>\n ),\n }\n : {})}\n collapsedStorageKey={SIDEBAR_COLLAPSED_KEY}\n // Results are wide tables, not prose — let them use the whole workspace\n // instead of the centred reading column.\n contentWidth=\"full\"\n contentClassName=\"p-6\"\n >\n {resolvedRoute.kind === \"surface\" ? (\n resolvedRoute.surface ? (\n <OperationCatalog\n definition={makeSurfaceDefinition(resolvedRoute.surface)}\n entities={[resolvedRoute.surface.entity]}\n client={client}\n renderLink={renderLink}\n surfaceKey={resolvedRoute.surface.key}\n commandRuntime={commandRuntime}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(surfaceActionLabels?.[resolvedRoute.surface.key]\n ? { actionLabels: surfaceActionLabels[resolvedRoute.surface.key] }\n : {})}\n {...(resultRenderer ? { resultRenderer } : {})}\n />\n ) : (\n <UnknownSurface surfaceKey={resolvedRoute.surfaceKey} />\n )\n ) : resolvedRoute.kind === \"entity\" ? (\n resolvedRoute.surface ? (\n <OperationEntityPage\n definition={makeSurfaceDefinition(resolvedRoute.surface)}\n entities={[resolvedRoute.surface.entity]}\n client={client}\n renderLink={renderLink}\n surfaceKey={resolvedRoute.surface.key}\n backHref={withBasePath(basePath, `/${resolvedRoute.surface.key}`)}\n backLabel={`Back to ${resolvedRoute.surface.title}`}\n commandRuntime={commandRuntime}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(surfaceActionLabels?.[resolvedRoute.surface.key]\n ? { actionLabels: surfaceActionLabels[resolvedRoute.surface.key] }\n : {})}\n {...(entityDetailBodyRenderer ? { entityDetailBodyRenderer } : {})}\n {...(entityDetailHeaderRenderer ? { entityDetailHeaderRenderer } : {})}\n {...(resolvedRoute.id ? { id: resolvedRoute.id } : {})}\n />\n ) : (\n <UnknownSurface surfaceKey={resolvedRoute.surfaceKey} />\n )\n ) : resolvedRoute.kind === \"command\" ? (\n <OperationCommandPage\n client={client}\n backHref={withBasePath(basePath, \"/explorer\")}\n backLabel=\"Back to API Explorer\"\n renderLink={renderLink}\n commandRuntime={commandRuntime}\n initialValues={commandInitialValues}\n autoRun={true}\n {...(resolvedRoute.operationId ? { operationId: resolvedRoute.operationId } : {})}\n />\n ) : resolvedRoute.kind === \"explorer\" ? (\n <OperationCatalog\n definition={explorerDefinition}\n entities={[]}\n allOperations\n client={client}\n renderLink={renderLink}\n commandRuntime={commandRuntime}\n />\n ) : defaultSurface == null ? (\n <div className=\"text-sm text-muted-foreground\">Loading surfaces…</div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">Redirecting…</div>\n )}\n </AppShell>\n );\n\n return content;\n}\n\ntype ExplorerRoute =\n | { kind: \"root\" }\n | { kind: \"explorer\" }\n | { kind: \"command\"; operationId?: string }\n | { kind: \"surface\"; surfaceKey: string; surface?: ClickySurface }\n | {\n kind: \"entity\";\n surfaceKey: string;\n surface?: ClickySurface;\n id?: string;\n };\n\nfunction parseExplorerRoute(pathname: string): ExplorerRoute {\n const normalized = trimTrailingSlash(pathname) || \"/\";\n if (normalized === \"/\") {\n return { kind: \"root\" };\n }\n\n const segments = normalized.replace(/^\\/+/, \"\").split(\"/\");\n if (segments[0] === \"explorer\") {\n return { kind: \"explorer\" };\n }\n if (segments[0] === \"commands\") {\n return segments[1] ? { kind: \"command\", operationId: segments[1] } : { kind: \"command\" };\n }\n const surfaceKey = segments[0] ?? \"\";\n if (segments[1]) {\n return {\n kind: \"entity\",\n surfaceKey,\n id: decodeURIComponent(segments[1]),\n };\n }\n return { kind: \"surface\", surfaceKey };\n}\n\nfunction resolveRouteSurface(route: ExplorerRoute, surfaces: ClickySurface[]): ExplorerRoute {\n if (route.kind !== \"surface\" && route.kind !== \"entity\") {\n return route;\n }\n const surface = surfaces.find((item) => item.key === route.surfaceKey);\n return surface ? { ...route, surface } : route;\n}\n\nfunction isSurfaceRouteActive(route: ExplorerRoute, surfaceKey: string) {\n return (\n (route.kind === \"surface\" && route.surfaceKey === surfaceKey) ||\n (route.kind === \"entity\" && route.surfaceKey === surfaceKey)\n );\n}\n\nfunction stripBasePath(pathname: string, basePath: string) {\n const base = trimTrailingSlash(basePath);\n if (!base || base === \"/\") {\n return trimTrailingSlash(pathname) || \"/\";\n }\n if (pathname === base) {\n return \"/\";\n }\n if (pathname.startsWith(`${base}/`)) {\n return trimTrailingSlash(pathname.slice(base.length)) || \"/\";\n }\n return trimTrailingSlash(pathname) || \"/\";\n}\n\nfunction UnknownSurface({ surfaceKey }: { surfaceKey: string }) {\n return (\n <div className=\"p-6 text-sm text-muted-foreground\">\n Unknown surface: <code>{surfaceKey}</code>\n </div>\n );\n}\n\nconst LEGACY_AUTORUN_QUERY_PARAM = \"__autoRun\";\n\ntype SurfaceGroup = {\n parent: string; // the slug; \"\" for surfaces that declared no parent\n label: string; // display name in the sidebar\n surfaces: ClickySurface[];\n};\n\n// groupSurfacesByParent buckets surfaces by their ClickySurface.parent slug,\n// preserving the order surfaces appeared in the spec. Surfaces with no parent\n// fall into a trailing \"\" bucket labelled \"Other\".\nfunction groupSurfacesByParent(surfaces: ClickySurface[]): SurfaceGroup[] {\n const order: string[] = [];\n const buckets = new Map<string, ClickySurface[]>();\n for (const surface of surfaces) {\n const parent = surface.parent ?? \"\";\n if (!buckets.has(parent)) {\n buckets.set(parent, []);\n order.push(parent);\n }\n buckets.get(parent)!.push(surface);\n }\n return order.map((parent) => ({\n parent,\n label: parent === \"\" ? \"Other\" : titleCase(parent),\n surfaces: buckets.get(parent)!,\n }));\n}\n\nfunction titleCase(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction readCommandQueryParams(): { initialValues: Record<string, string>; autoRun: boolean } {\n if (typeof window === \"undefined\") {\n return { initialValues: {}, autoRun: false };\n }\n const search = new URLSearchParams(window.location.search);\n const initialValues: Record<string, string> = {};\n let autoRun = false;\n const positional: string[] = [];\n\n for (const [key, value] of search.entries()) {\n if (key === AUTORUN_QUERY_PARAM || key === LEGACY_AUTORUN_QUERY_PARAM) {\n autoRun = value === \"1\" || value === \"true\";\n continue;\n }\n if (key.startsWith(ARG_QUERY_PREFIX)) {\n const index = Number.parseInt(key.slice(ARG_QUERY_PREFIX.length), 10);\n if (Number.isFinite(index) && index >= 0) {\n positional[index] = value;\n }\n continue;\n }\n initialValues[key] = value;\n }\n\n const packedArgs = positional.filter((value) => value !== undefined).join(\" \");\n if (packedArgs !== \"\") {\n initialValues.args = packedArgs;\n }\n\n return { initialValues, autoRun };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuEA,MAAM,wBAAwB;AAEvB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,UAAU,iDAAgB;AAChC,QAAM,WAAW,iDAAgB;AACjC,QAAM,EAAE,UAAU,YAAY,SAAA,IAAa,UAAA;AAC3C,QAAM,EAAE,KAAA,IAAS,cAAc,MAAM;AACrC,QAAM,WAAW,QAAQ,MAAM,kBAAkB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9D,QAAM,gBAAgB,QAAQ,MAAM,sBAAsB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAC/E,QAAM,iBAAiB;AAAA,IACrB,MAAM,SAAS,KAAK,CAAC,YAAY,CAAC,QAAQ,KAAK,KAAK,SAAS,CAAC;AAAA,IAC9D,CAAC,QAAQ;AAAA,EAAA;AAEX,QAAM,eAAe,QAAQ,MAAM,cAAc,UAAU,QAAQ,GAAG,CAAC,UAAU,QAAQ,CAAC;AAC1F,QAAM,QAAQ,QAAQ,MAAM,mBAAmB,YAAY,GAAG,CAAC,YAAY,CAAC;AAC5E,QAAM,gBAAgB,QAAQ,MAAM,oBAAoB,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC;AAC3F,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,MACL;AAAA,MACA,gBAAgB,CAAC,aAAa,iBAAiB,UAAU,QAAQ;AAAA,MACjE,YAAY,CAAC,aAAa;AACxB,cAAM,OAAO,iBAAiB,UAAU,QAAQ;AAChD,YAAI,CAAC,KAAM;AACX,iBAAS,IAAI;AAAA,MACf;AAAA,IAAA;AAAA,IAEF,CAAC,UAAU,QAAQ,QAAQ;AAAA,EAAA;AAE7B,QAAM,EAAE,eAAe,qBAAA,IAAyB;AAAA,IAC9C,MACE,cAAc,SAAS,YACnB,uBAAA,IACA,EAAE,eAAe,CAAA,GAAI,SAAS,MAAA;AAAA,IACpC,CAAC,cAAc,MAAM,QAAQ;AAAA,EAAA;AAE/B,QAAM,qBAAqB;AAAA,IACzB,OAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,CAAA;AAAA,EAAC;AAEH,QAAM,cAAc,QAA8B,MAAM;AACtD,UAAM,WAAiC,cAAc;AAAA,MAAI,CAAC,UACxD,kBAAkB,MAAM,OAAO,MAAM,UAAU;AAAA,QAC7C,UAAU,CAAC,YAAY,qBAAqB,eAAe,QAAQ,GAAG;AAAA,QACtE,SAAS,CAAC,YAAY,aAAa,UAAU,IAAI,QAAQ,GAAG,EAAE;AAAA,MAAA,CAC/D;AAAA,IAAA;AAEH,QAAI,iBAAiB;AACnB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,UACL;AAAA,YACE,KAAK,mBAAmB;AAAA,YACxB,OAAO,mBAAmB;AAAA,YAC1B,QAAQ,cAAc,SAAS,cAAc,cAAc,SAAS;AAAA,YACpE,IAAI,aAAa,UAAU,WAAW;AAAA,UAAA;AAAA,QACxC;AAAA,MACF,CACD;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,UAAU,eAAe,iBAAiB,kBAAkB,CAAC;AAEhF,YAAU,MAAM;AACd,QAAI,kBAAkB,QAAQ,iBAAiB,IAAK;AACpD,aAAS,aAAa,UAAU,IAAI,eAAe,GAAG,EAAE,GAAG,EAAE,SAAS,KAAA,CAAM;AAAA,EAC9E,GAAG,CAAC,UAAU,gBAAgB,cAAc,QAAQ,CAAC;AAErD,QAAM,UACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OACE,qBAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,QAAA,oBAAC,SAAI,WAAU,kCACZ,WAAA,6BAAM,KAAK,UAAS,mBACvB;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,+CAA8C,UAAA,kCAAA,CAE7D;AAAA,MAAA,GACF;AAAA,MAEF;AAAA,MACA,mCAAgB,eAAA,EAAc;AAAA,MAS7B,GAAI,cAAc,SAAS,aAAa,cAAc,UACnD;AAAA,QACE,KACE,qBAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAG,WAAU,2DACX,UAAA,cAAc,QAAQ,OACzB;AAAA,UACA,oBAAC,OAAE,WAAU,kEACV,gCAAsB,cAAc,OAAO,EAAE,YAAA,CAChD;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,IAGJ,CAAA;AAAA,MACJ,qBAAqB;AAAA,MAGrB,cAAa;AAAA,MACb,kBAAiB;AAAA,MAEhB,UAAA,cAAc,SAAS,YACpB,cAAc,UACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY,sBAAsB,cAAc,OAAO;AAAA,UACvD,UAAU,CAAC,cAAc,QAAQ,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,UACA,YAAY,cAAc,QAAQ;AAAA,UAClC;AAAA,UACC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,UAC9B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,UAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,UACpC,IAAI,2DAAsB,cAAc,QAAQ,QAC7C,EAAE,cAAc,oBAAoB,cAAc,QAAQ,GAAG,EAAA,IAC7D,CAAA;AAAA,UACH,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,QAAC;AAAA,MAAA,IAG5C,oBAAC,gBAAA,EAAe,YAAY,cAAc,WAAA,CAAY,IAEtD,cAAc,SAAS,WACzB,cAAc,UACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY,sBAAsB,cAAc,OAAO;AAAA,UACvD,UAAU,CAAC,cAAc,QAAQ,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,UACA,YAAY,cAAc,QAAQ;AAAA,UAClC,UAAU,aAAa,UAAU,IAAI,cAAc,QAAQ,GAAG,EAAE;AAAA,UAChE,WAAW,WAAW,cAAc,QAAQ,KAAK;AAAA,UACjD;AAAA,UACC,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,UAC9B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,UAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,UACpC,IAAI,2DAAsB,cAAc,QAAQ,QAC7C,EAAE,cAAc,oBAAoB,cAAc,QAAQ,GAAG,EAAA,IAC7D,CAAA;AAAA,UACH,GAAI,2BAA2B,EAAE,yBAAA,IAA6B,CAAA;AAAA,UAC9D,GAAI,6BAA6B,EAAE,2BAAA,IAA+B,CAAA;AAAA,UAClE,GAAI,cAAc,KAAK,EAAE,IAAI,cAAc,GAAA,IAAO,CAAA;AAAA,QAAC;AAAA,MAAA,wBAGnD,gBAAA,EAAe,YAAY,cAAc,WAAA,CAAY,IAEtD,cAAc,SAAS,YACzB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,aAAa,UAAU,WAAW;AAAA,UAC5C,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,SAAS;AAAA,UACR,GAAI,cAAc,cAAc,EAAE,aAAa,cAAc,YAAA,IAAgB,CAAA;AAAA,QAAC;AAAA,MAAA,IAE/E,cAAc,SAAS,aACzB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,YAAY;AAAA,UACZ,UAAU,CAAA;AAAA,UACV,eAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAAA,IAEA,kBAAkB,OACpB,oBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,oBAAA,CAAiB,IAEhE,oBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,eAAA,CAAY;AAAA,IAAA;AAAA,EAAA;AAKnE,SAAO;AACT;AAcA,SAAS,mBAAmB,UAAiC;AAC3D,QAAM,aAAa,kBAAkB,QAAQ,KAAK;AAClD,MAAI,eAAe,KAAK;AACtB,WAAO,EAAE,MAAM,OAAA;AAAA,EACjB;AAEA,QAAM,WAAW,WAAW,QAAQ,QAAQ,EAAE,EAAE,MAAM,GAAG;AACzD,MAAI,SAAS,CAAC,MAAM,YAAY;AAC9B,WAAO,EAAE,MAAM,WAAA;AAAA,EACjB;AACA,MAAI,SAAS,CAAC,MAAM,YAAY;AAC9B,WAAO,SAAS,CAAC,IAAI,EAAE,MAAM,WAAW,aAAa,SAAS,CAAC,EAAA,IAAM,EAAE,MAAM,UAAA;AAAA,EAC/E;AACA,QAAM,aAAa,SAAS,CAAC,KAAK;AAClC,MAAI,SAAS,CAAC,GAAG;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,IAAI,mBAAmB,SAAS,CAAC,CAAC;AAAA,IAAA;AAAA,EAEtC;AACA,SAAO,EAAE,MAAM,WAAW,WAAA;AAC5B;AAEA,SAAS,oBAAoB,OAAsB,UAA0C;AAC3F,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,UAAU;AACvD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,MAAM,UAAU;AACrE,SAAO,UAAU,EAAE,GAAG,OAAO,YAAY;AAC3C;AAEA,SAAS,qBAAqB,OAAsB,YAAoB;AACtE,SACG,MAAM,SAAS,aAAa,MAAM,eAAe,cACjD,MAAM,SAAS,YAAY,MAAM,eAAe;AAErD;AAEA,SAAS,cAAc,UAAkB,UAAkB;AACzD,QAAM,OAAO,kBAAkB,QAAQ;AACvC,MAAI,CAAC,QAAQ,SAAS,KAAK;AACzB,WAAO,kBAAkB,QAAQ,KAAK;AAAA,EACxC;AACA,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,GAAG,IAAI,GAAG,GAAG;AACnC,WAAO,kBAAkB,SAAS,MAAM,KAAK,MAAM,CAAC,KAAK;AAAA,EAC3D;AACA,SAAO,kBAAkB,QAAQ,KAAK;AACxC;AAEA,SAAS,eAAe,EAAE,cAAsC;AAC9D,SACE,qBAAC,OAAA,EAAI,WAAU,qCAAoC,UAAA;AAAA,IAAA;AAAA,IAChC,oBAAC,UAAM,UAAA,WAAA,CAAW;AAAA,EAAA,GACrC;AAEJ;AAEA,MAAM,6BAA6B;AAWnC,SAAS,sBAAsB,UAA2C;AACxE,QAAM,QAAkB,CAAA;AACxB,QAAM,8BAAc,IAAA;AACpB,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,QAAQ,UAAU;AACjC,QAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,cAAQ,IAAI,QAAQ,EAAE;AACtB,YAAM,KAAK,MAAM;AAAA,IACnB;AACA,YAAQ,IAAI,MAAM,EAAG,KAAK,OAAO;AAAA,EACnC;AACA,SAAO,MAAM,IAAI,CAAC,YAAY;AAAA,IAC5B;AAAA,IACA,OAAO,WAAW,KAAK,UAAU,UAAU,MAAM;AAAA,IACjD,UAAU,QAAQ,IAAI,MAAM;AAAA,EAAA,EAC5B;AACJ;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC;AACtD;AAEA,SAAS,yBAAsF;AAC7F,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,eAAe,IAAI,SAAS,MAAA;AAAA,EACvC;AACA,QAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,QAAM,gBAAwC,CAAA;AAC9C,MAAI,UAAU;AACd,QAAM,aAAuB,CAAA;AAE7B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,WAAW;AAC3C,QAAI,QAAQ,uBAAuB,QAAQ,4BAA4B;AACrE,gBAAU,UAAU,OAAO,UAAU;AACrC;AAAA,IACF;AACA,QAAI,IAAI,WAAW,gBAAgB,GAAG;AACpC,YAAM,QAAQ,OAAO,SAAS,IAAI,MAAM,iBAAiB,MAAM,GAAG,EAAE;AACpE,UAAI,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACxC,mBAAW,KAAK,IAAI;AAAA,MACtB;AACA;AAAA,IACF;AACA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,WAAW,OAAO,CAAC,UAAU,UAAU,MAAS,EAAE,KAAK,GAAG;AAC7E,MAAI,eAAe,IAAI;AACrB,kBAAc,OAAO;AAAA,EACvB;AAEA,SAAO,EAAE,eAAe,QAAA;AAC1B;"}
|
|
@@ -132,7 +132,7 @@ function OperationActionBar({
|
|
|
132
132
|
open: true,
|
|
133
133
|
onClose: () => setActiveAction(null),
|
|
134
134
|
title: actionLabel(activeAction),
|
|
135
|
-
size: "
|
|
135
|
+
size: "2xl",
|
|
136
136
|
...footer ? { footer } : {},
|
|
137
137
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
138
138
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationActionBar.cjs","sources":["../../src/rpc/OperationActionBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n SchemaActionForm,\n type FormActionsRenderer,\n type SchemaActionFormSlots,\n} from \"./SchemaActionForm\";\nimport { getOperationClickyMeta, surfaceActionLabel } from \"./clickyMetadata\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { type OperationsApiClient } from \"./useOperations\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\n\nexport type OperationActionBarProps = {\n // Operations rendered as buttons. The list page passes collection-scoped\n // actions, the detail page passes entity-scoped actions — this component\n // renders both identically (same labels, same location, same modal).\n actions: ResolvedOperation[];\n client: OperationsApiClient;\n // Path/filter values locked into the action form. The detail page locks the\n // row id; the list page locks the active list filters for a bulk action.\n getLockedValues?: (action: ResolvedOperation) => Record<string, string>;\n // Refetch the surrounding view (list/detail) once an action succeeds.\n onExecuted?: () => void | Promise<void>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n // Hide the locked values in the fallback parameter form (detail hides the id;\n // the list shows the locked filters for transparency).\n hideLockedInForm?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n formActions?: FormActionsRenderer;\n // Optional labels keyed by x-clicky verb/actionName for this surface.\n actionLabels?: Record<string, string>;\n // Layout placement only — the bar's own styling stays consistent across pages.\n className?: string;\n};\n\n// OperationActionBar is the single render path for entity action buttons shared\n// by the list (OperationCatalog) and detail (OperationEntityPage) pages: a row\n// of buttons that each open the execution Modal (schema form, or parameter-form\n// fallback) inline. Keeping it shared guarantees both surfaces present the same\n// labels in the same location.\nexport function OperationActionBar({\n actions,\n client,\n getLockedValues,\n onExecuted,\n initialValue,\n hideLockedInForm = false,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n className,\n}: OperationActionBarProps) {\n const queryClient = useQueryClient();\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n\n const activeMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n const lockedValues = activeAction ? (getLockedValues?.(activeAction) ?? {}) : {};\n\n function openAction(op: ResolvedOperation) {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }\n\n function actionLabel(op: ResolvedOperation): string {\n const meta = getOperationClickyMeta(op);\n const key = meta?.actionName?.trim() || meta?.verb?.trim();\n return (key ? actionLabels?.[key] : undefined) ?? surfaceActionLabel(op);\n }\n\n async function refreshDiscovery() {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"openapi-spec\"] }),\n queryClient.invalidateQueries({ queryKey: [\"logs-entity-names\"] }),\n ]);\n await onExecuted?.();\n }\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n if (!response.error) await refreshDiscovery();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n return (\n <>\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {actions.map((op) => {\n const label = actionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary && summary !== label ? `${label} — ${summary}` : label;\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => openAction(op)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {activeAction && (\n <SchemaActionForm\n client={client}\n action={activeAction}\n lockedValues={lockedValues}\n submitLabel={actionLabel(activeAction)}\n {...(initialValue ? { initialValue } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { footerActions: formActions } : {})}\n renderLayout={(slots) => renderActionDialog(slots)}\n onSuccess={() => {\n setActiveAction(null);\n void refreshDiscovery();\n }}\n fallback={\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={lockedValues}\n enableLookup={Boolean(activeMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n {...(hideLockedInForm ? { hideLocked: true } : {})}\n />\n }\n />\n )}\n </>\n );\n\n function renderActionDialog({ body, footer }: SchemaActionFormSlots) {\n if (!activeAction) return null;\n return (\n <Modal\n open\n onClose={() => setActiveAction(null)}\n title={actionLabel(activeAction)}\n size=\"lg\"\n {...(footer ? { footer } : {})}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {activeAction.path}\n </code>\n </div>\n {body}\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n </Modal>\n );\n }\n}\n"],"names":["useQueryClient","useState","getOperationClickyMeta","surfaceActionLabel","packParameterValues","jsxs","Fragment","jsx","cn","Button","SchemaActionForm","FilterForm","Modal","MethodBadge","ExecutionResult"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationActionBar.cjs","sources":["../../src/rpc/OperationActionBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n SchemaActionForm,\n type FormActionsRenderer,\n type SchemaActionFormSlots,\n} from \"./SchemaActionForm\";\nimport { getOperationClickyMeta, surfaceActionLabel } from \"./clickyMetadata\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { type OperationsApiClient } from \"./useOperations\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\n\nexport type OperationActionBarProps = {\n // Operations rendered as buttons. The list page passes collection-scoped\n // actions, the detail page passes entity-scoped actions — this component\n // renders both identically (same labels, same location, same modal).\n actions: ResolvedOperation[];\n client: OperationsApiClient;\n // Path/filter values locked into the action form. The detail page locks the\n // row id; the list page locks the active list filters for a bulk action.\n getLockedValues?: (action: ResolvedOperation) => Record<string, string>;\n // Refetch the surrounding view (list/detail) once an action succeeds.\n onExecuted?: () => void | Promise<void>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n // Hide the locked values in the fallback parameter form (detail hides the id;\n // the list shows the locked filters for transparency).\n hideLockedInForm?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n formActions?: FormActionsRenderer;\n // Optional labels keyed by x-clicky verb/actionName for this surface.\n actionLabels?: Record<string, string>;\n // Layout placement only — the bar's own styling stays consistent across pages.\n className?: string;\n};\n\n// OperationActionBar is the single render path for entity action buttons shared\n// by the list (OperationCatalog) and detail (OperationEntityPage) pages: a row\n// of buttons that each open the execution Modal (schema form, or parameter-form\n// fallback) inline. Keeping it shared guarantees both surfaces present the same\n// labels in the same location.\nexport function OperationActionBar({\n actions,\n client,\n getLockedValues,\n onExecuted,\n initialValue,\n hideLockedInForm = false,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n className,\n}: OperationActionBarProps) {\n const queryClient = useQueryClient();\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n\n const activeMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n const lockedValues = activeAction ? (getLockedValues?.(activeAction) ?? {}) : {};\n\n function openAction(op: ResolvedOperation) {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }\n\n function actionLabel(op: ResolvedOperation): string {\n const meta = getOperationClickyMeta(op);\n const key = meta?.actionName?.trim() || meta?.verb?.trim();\n return (key ? actionLabels?.[key] : undefined) ?? surfaceActionLabel(op);\n }\n\n async function refreshDiscovery() {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"openapi-spec\"] }),\n queryClient.invalidateQueries({ queryKey: [\"logs-entity-names\"] }),\n ]);\n await onExecuted?.();\n }\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n if (!response.error) await refreshDiscovery();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n return (\n <>\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {actions.map((op) => {\n const label = actionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary && summary !== label ? `${label} — ${summary}` : label;\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => openAction(op)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {activeAction && (\n <SchemaActionForm\n client={client}\n action={activeAction}\n lockedValues={lockedValues}\n submitLabel={actionLabel(activeAction)}\n {...(initialValue ? { initialValue } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { footerActions: formActions } : {})}\n renderLayout={(slots) => renderActionDialog(slots)}\n onSuccess={() => {\n setActiveAction(null);\n void refreshDiscovery();\n }}\n fallback={\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={lockedValues}\n enableLookup={Boolean(activeMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n {...(hideLockedInForm ? { hideLocked: true } : {})}\n />\n }\n />\n )}\n </>\n );\n\n function renderActionDialog({ body, footer }: SchemaActionFormSlots) {\n if (!activeAction) return null;\n return (\n <Modal\n open\n onClose={() => setActiveAction(null)}\n title={actionLabel(activeAction)}\n size=\"2xl\"\n {...(footer ? { footer } : {})}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {activeAction.path}\n </code>\n </div>\n {body}\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n </Modal>\n );\n }\n}\n"],"names":["useQueryClient","useState","getOperationClickyMeta","surfaceActionLabel","packParameterValues","jsxs","Fragment","jsx","cn","Button","SchemaActionForm","FilterForm","Modal","MethodBadge","ExecutionResult"],"mappings":"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"}
|
|
@@ -130,7 +130,7 @@ function OperationActionBar({
|
|
|
130
130
|
open: true,
|
|
131
131
|
onClose: () => setActiveAction(null),
|
|
132
132
|
title: actionLabel(activeAction),
|
|
133
|
-
size: "
|
|
133
|
+
size: "2xl",
|
|
134
134
|
...footer ? { footer } : {},
|
|
135
135
|
children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
136
136
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationActionBar.js","sources":["../../src/rpc/OperationActionBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n SchemaActionForm,\n type FormActionsRenderer,\n type SchemaActionFormSlots,\n} from \"./SchemaActionForm\";\nimport { getOperationClickyMeta, surfaceActionLabel } from \"./clickyMetadata\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { type OperationsApiClient } from \"./useOperations\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\n\nexport type OperationActionBarProps = {\n // Operations rendered as buttons. The list page passes collection-scoped\n // actions, the detail page passes entity-scoped actions — this component\n // renders both identically (same labels, same location, same modal).\n actions: ResolvedOperation[];\n client: OperationsApiClient;\n // Path/filter values locked into the action form. The detail page locks the\n // row id; the list page locks the active list filters for a bulk action.\n getLockedValues?: (action: ResolvedOperation) => Record<string, string>;\n // Refetch the surrounding view (list/detail) once an action succeeds.\n onExecuted?: () => void | Promise<void>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n // Hide the locked values in the fallback parameter form (detail hides the id;\n // the list shows the locked filters for transparency).\n hideLockedInForm?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n formActions?: FormActionsRenderer;\n // Optional labels keyed by x-clicky verb/actionName for this surface.\n actionLabels?: Record<string, string>;\n // Layout placement only — the bar's own styling stays consistent across pages.\n className?: string;\n};\n\n// OperationActionBar is the single render path for entity action buttons shared\n// by the list (OperationCatalog) and detail (OperationEntityPage) pages: a row\n// of buttons that each open the execution Modal (schema form, or parameter-form\n// fallback) inline. Keeping it shared guarantees both surfaces present the same\n// labels in the same location.\nexport function OperationActionBar({\n actions,\n client,\n getLockedValues,\n onExecuted,\n initialValue,\n hideLockedInForm = false,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n className,\n}: OperationActionBarProps) {\n const queryClient = useQueryClient();\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n\n const activeMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n const lockedValues = activeAction ? (getLockedValues?.(activeAction) ?? {}) : {};\n\n function openAction(op: ResolvedOperation) {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }\n\n function actionLabel(op: ResolvedOperation): string {\n const meta = getOperationClickyMeta(op);\n const key = meta?.actionName?.trim() || meta?.verb?.trim();\n return (key ? actionLabels?.[key] : undefined) ?? surfaceActionLabel(op);\n }\n\n async function refreshDiscovery() {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"openapi-spec\"] }),\n queryClient.invalidateQueries({ queryKey: [\"logs-entity-names\"] }),\n ]);\n await onExecuted?.();\n }\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n if (!response.error) await refreshDiscovery();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n return (\n <>\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {actions.map((op) => {\n const label = actionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary && summary !== label ? `${label} — ${summary}` : label;\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => openAction(op)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {activeAction && (\n <SchemaActionForm\n client={client}\n action={activeAction}\n lockedValues={lockedValues}\n submitLabel={actionLabel(activeAction)}\n {...(initialValue ? { initialValue } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { footerActions: formActions } : {})}\n renderLayout={(slots) => renderActionDialog(slots)}\n onSuccess={() => {\n setActiveAction(null);\n void refreshDiscovery();\n }}\n fallback={\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={lockedValues}\n enableLookup={Boolean(activeMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n {...(hideLockedInForm ? { hideLocked: true } : {})}\n />\n }\n />\n )}\n </>\n );\n\n function renderActionDialog({ body, footer }: SchemaActionFormSlots) {\n if (!activeAction) return null;\n return (\n <Modal\n open\n onClose={() => setActiveAction(null)}\n title={actionLabel(activeAction)}\n size=\"lg\"\n {...(footer ? { footer } : {})}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {activeAction.path}\n </code>\n </div>\n {body}\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n </Modal>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationActionBar.js","sources":["../../src/rpc/OperationActionBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n SchemaActionForm,\n type FormActionsRenderer,\n type SchemaActionFormSlots,\n} from \"./SchemaActionForm\";\nimport { getOperationClickyMeta, surfaceActionLabel } from \"./clickyMetadata\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { type OperationsApiClient } from \"./useOperations\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\n\nexport type OperationActionBarProps = {\n // Operations rendered as buttons. The list page passes collection-scoped\n // actions, the detail page passes entity-scoped actions — this component\n // renders both identically (same labels, same location, same modal).\n actions: ResolvedOperation[];\n client: OperationsApiClient;\n // Path/filter values locked into the action form. The detail page locks the\n // row id; the list page locks the active list filters for a bulk action.\n getLockedValues?: (action: ResolvedOperation) => Record<string, string>;\n // Refetch the surrounding view (list/detail) once an action succeeds.\n onExecuted?: () => void | Promise<void>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n // Hide the locked values in the fallback parameter form (detail hides the id;\n // the list shows the locked filters for transparency).\n hideLockedInForm?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n formActions?: FormActionsRenderer;\n // Optional labels keyed by x-clicky verb/actionName for this surface.\n actionLabels?: Record<string, string>;\n // Layout placement only — the bar's own styling stays consistent across pages.\n className?: string;\n};\n\n// OperationActionBar is the single render path for entity action buttons shared\n// by the list (OperationCatalog) and detail (OperationEntityPage) pages: a row\n// of buttons that each open the execution Modal (schema form, or parameter-form\n// fallback) inline. Keeping it shared guarantees both surfaces present the same\n// labels in the same location.\nexport function OperationActionBar({\n actions,\n client,\n getLockedValues,\n onExecuted,\n initialValue,\n hideLockedInForm = false,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n className,\n}: OperationActionBarProps) {\n const queryClient = useQueryClient();\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n\n const activeMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n const lockedValues = activeAction ? (getLockedValues?.(activeAction) ?? {}) : {};\n\n function openAction(op: ResolvedOperation) {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }\n\n function actionLabel(op: ResolvedOperation): string {\n const meta = getOperationClickyMeta(op);\n const key = meta?.actionName?.trim() || meta?.verb?.trim();\n return (key ? actionLabels?.[key] : undefined) ?? surfaceActionLabel(op);\n }\n\n async function refreshDiscovery() {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"openapi-spec\"] }),\n queryClient.invalidateQueries({ queryKey: [\"logs-entity-names\"] }),\n ]);\n await onExecuted?.();\n }\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n if (!response.error) await refreshDiscovery();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n return (\n <>\n {actions.length > 0 && (\n <div className={cn(\"flex flex-wrap gap-2\", className)}>\n {actions.map((op) => {\n const label = actionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary && summary !== label ? `${label} — ${summary}` : label;\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => openAction(op)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {activeAction && (\n <SchemaActionForm\n client={client}\n action={activeAction}\n lockedValues={lockedValues}\n submitLabel={actionLabel(activeAction)}\n {...(initialValue ? { initialValue } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { footerActions: formActions } : {})}\n renderLayout={(slots) => renderActionDialog(slots)}\n onSuccess={() => {\n setActiveAction(null);\n void refreshDiscovery();\n }}\n fallback={\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={lockedValues}\n enableLookup={Boolean(activeMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n {...(hideLockedInForm ? { hideLocked: true } : {})}\n />\n }\n />\n )}\n </>\n );\n\n function renderActionDialog({ body, footer }: SchemaActionFormSlots) {\n if (!activeAction) return null;\n return (\n <Modal\n open\n onClose={() => setActiveAction(null)}\n title={actionLabel(activeAction)}\n size=\"2xl\"\n {...(footer ? { footer } : {})}\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {activeAction.path}\n </code>\n </div>\n {body}\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n </Modal>\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@ const OperationResultView = require("./OperationResultView.cjs");
|
|
|
12
12
|
const filterBarUtils = require("../components/filter-bar-utils.cjs");
|
|
13
13
|
const useOperations = require("./useOperations.cjs");
|
|
14
14
|
const formMetadata = require("./formMetadata.cjs");
|
|
15
|
+
const operationFilterSearch = require("./operationFilterSearch.cjs");
|
|
16
|
+
const dataTableFilterValues = require("../data/data-table-filter-values.cjs");
|
|
15
17
|
const defaultCommandHref = (operationId) => `/commands/${operationId}`;
|
|
16
18
|
function defaultRenderError(err, title) {
|
|
17
19
|
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
@@ -123,15 +125,22 @@ function OperationCatalog({
|
|
|
123
125
|
() => useSurfaceMetadata ? clickyMetadata.findSurfaceCollectionActions(domainOps, surfaceKey) : [],
|
|
124
126
|
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
125
127
|
);
|
|
128
|
+
const lookupSearch = operationFilterSearch.useOperationFilterSearch(
|
|
129
|
+
client,
|
|
130
|
+
listEndpoint,
|
|
131
|
+
filters,
|
|
132
|
+
listParameters
|
|
133
|
+
);
|
|
126
134
|
const filterBarConfig = react.useMemo(() => {
|
|
127
135
|
const options = {
|
|
128
|
-
includeLocations: ["query"]
|
|
136
|
+
includeLocations: ["query"],
|
|
137
|
+
lookupSearch
|
|
129
138
|
};
|
|
130
139
|
if (lookupQuery.data != null) {
|
|
131
140
|
options.lookup = lookupQuery.data;
|
|
132
141
|
}
|
|
133
142
|
return formMetadata.parametersToFormConfig(listParameters, filters, setFilters, options);
|
|
134
|
-
}, [filters, listParameters, lookupQuery.data]);
|
|
143
|
+
}, [filters, listParameters, lookupQuery.data, lookupSearch]);
|
|
135
144
|
const dataTablePagination = react.useMemo(
|
|
136
145
|
() => formMetadata.dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),
|
|
137
146
|
[filterBarConfig.pagination, listQuery.data]
|
|
@@ -142,6 +151,70 @@ function OperationCatalog({
|
|
|
142
151
|
),
|
|
143
152
|
[filterBarConfig.filters, filterPre]
|
|
144
153
|
);
|
|
154
|
+
const cellFilters = react.useMemo(
|
|
155
|
+
() => Object.fromEntries(
|
|
156
|
+
listParameters.filter((parameter) => {
|
|
157
|
+
var _a2;
|
|
158
|
+
return ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "filter";
|
|
159
|
+
}).map((parameter) => [
|
|
160
|
+
parameter.name,
|
|
161
|
+
dataTableFilterValues.parseMultiFilterValue(filters[parameter.name] ?? "")
|
|
162
|
+
])
|
|
163
|
+
),
|
|
164
|
+
[filters, listParameters]
|
|
165
|
+
);
|
|
166
|
+
const onCellFilterChange = react.useCallback(
|
|
167
|
+
({ key, value, mode }) => {
|
|
168
|
+
if (!listParameters.some(
|
|
169
|
+
(parameter) => {
|
|
170
|
+
var _a2;
|
|
171
|
+
return parameter.name === key && ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "filter";
|
|
172
|
+
}
|
|
173
|
+
)) {
|
|
174
|
+
throw new Error(`Clicky table column references unknown filter parameter ${key}`);
|
|
175
|
+
}
|
|
176
|
+
setFilters((current) => {
|
|
177
|
+
const selected = dataTableFilterValues.parseMultiFilterValue(current[key] ?? "");
|
|
178
|
+
if (mode === void 0) {
|
|
179
|
+
delete selected[value];
|
|
180
|
+
} else {
|
|
181
|
+
selected[value] = mode;
|
|
182
|
+
}
|
|
183
|
+
const next = { ...current };
|
|
184
|
+
const serialized = dataTableFilterValues.serializeMultiFilterValue(selected);
|
|
185
|
+
if (serialized) {
|
|
186
|
+
next[key] = serialized;
|
|
187
|
+
} else {
|
|
188
|
+
delete next[key];
|
|
189
|
+
}
|
|
190
|
+
const offset = listParameters.find(
|
|
191
|
+
(parameter) => {
|
|
192
|
+
var _a2;
|
|
193
|
+
return ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "offset";
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
if (offset) next[offset.name] = "0";
|
|
197
|
+
return next;
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
[listParameters]
|
|
201
|
+
);
|
|
202
|
+
const resultFilterConfig = react.useMemo(
|
|
203
|
+
() => ({
|
|
204
|
+
filters: decoratedFilters,
|
|
205
|
+
cellFilters,
|
|
206
|
+
onCellFilterChange,
|
|
207
|
+
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
208
|
+
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
209
|
+
}),
|
|
210
|
+
[
|
|
211
|
+
cellFilters,
|
|
212
|
+
decoratedFilters,
|
|
213
|
+
filterBarConfig.search,
|
|
214
|
+
filterBarConfig.timeRange,
|
|
215
|
+
onCellFilterChange
|
|
216
|
+
]
|
|
217
|
+
);
|
|
145
218
|
const showTable = !!listEndpoint;
|
|
146
219
|
let listError;
|
|
147
220
|
if (!listQuery.isFetching) {
|
|
@@ -222,11 +295,7 @@ function OperationCatalog({
|
|
|
222
295
|
ariaLabel: `${definition.title} results`,
|
|
223
296
|
className: "mt-0 h-full min-h-0",
|
|
224
297
|
detailOperation,
|
|
225
|
-
filterConfig:
|
|
226
|
-
filters: decoratedFilters,
|
|
227
|
-
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
228
|
-
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
229
|
-
},
|
|
298
|
+
filterConfig: resultFilterConfig,
|
|
230
299
|
...tableError ? { error: tableError } : {},
|
|
231
300
|
...commandRuntime ? { commandRuntime } : {},
|
|
232
301
|
...dataTablePagination ? { pagination: dataTablePagination } : {},
|
|
@@ -236,6 +305,13 @@ function OperationCatalog({
|
|
|
236
305
|
return resultRenderer ? resultRenderer({
|
|
237
306
|
response: listQuery.data ?? null,
|
|
238
307
|
defaultView,
|
|
308
|
+
filterConfig: resultFilterConfig,
|
|
309
|
+
// A renderer that replaces the table owns the whole surface,
|
|
310
|
+
// pager and download menu included. Without these it can only
|
|
311
|
+
// drop them, which is how a replaced view silently loses the
|
|
312
|
+
// ability to reach page two.
|
|
313
|
+
...dataTablePagination ? { pagination: dataTablePagination } : {},
|
|
314
|
+
...download ? { download } : {},
|
|
239
315
|
...surfaceKey ? { surfaceKey } : {}
|
|
240
316
|
}) : defaultView;
|
|
241
317
|
})()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n} from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport {\n OperationResultView,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n\n const showTable = !!listEndpoint;\n let listError: unknown;\n if (!listQuery.isFetching) {\n if (listQuery.isError) {\n listError = listQuery.error;\n } else if (listQuery.data?.success === false) {\n listError = new Error(\n listQuery.data.error ||\n listQuery.data.message ||\n listQuery.data.stderr ||\n `Command failed with exit code ${listQuery.data.exit_code}`,\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(\n listError,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n : undefined;\n const tableResponse =\n listQuery.data?.success === false ? null : (listQuery.data ?? null);\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(\n op: ResolvedOperation,\n ): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if (\n (op.operation.parameters ?? []).some((param) => param.name === \"filter\")\n ) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\n </div>\n );\n }\n\n const actionBar = (\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n />\n );\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {actionsContainer ? createPortal(actionBar, actionsContainer) : actionBar}\n\n {showTable ? (\n <div\n className=\"min-h-0 flex-1\"\n data-slot=\"operation-catalog-results\"\n >\n {(() => {\n const defaultView = (\n <OperationResultView\n response={tableResponse}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0\"\n detailOperation={detailOperation}\n filterConfig={{\n filters: decoratedFilters,\n ...(filterBarConfig.search\n ? { search: filterBarConfig.search }\n : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(download ? { download } : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["jsxs","jsx","useOperations","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findSurfaceDetailOperation","useState","_a","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceCollectionActions","parametersToFormConfig","dataTablePaginationFromForm","applyFilterExtensions","getOperationClickyMeta","OperationActionBar","createPortal","OperationResultView","EndpointList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n} from \"../data/Clicky\";\nimport type { CellFilterChange } from \"../data/cells/CellFilterActions\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport {\n OperationResultView,\n type OperationResultFilterConfig,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\nimport { useOperationFilterSearch } from \"./operationFilterSearch\";\nimport {\n parseMultiFilterValue,\n serializeMultiFilterValue,\n} from \"../data/data-table-filter-values\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const lookupSearch = useOperationFilterSearch(\n client,\n listEndpoint,\n filters,\n listParameters,\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n lookupSearch,\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data, lookupSearch]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n const cellFilters = useMemo(\n () =>\n Object.fromEntries(\n listParameters\n .filter((parameter) => parameter[\"x-clicky\"]?.role === \"filter\")\n .map((parameter) => [\n parameter.name,\n parseMultiFilterValue(filters[parameter.name] ?? \"\"),\n ]),\n ),\n [filters, listParameters],\n );\n const onCellFilterChange = useCallback(\n ({ key, value, mode }: CellFilterChange) => {\n if (\n !listParameters.some(\n (parameter) =>\n parameter.name === key && parameter[\"x-clicky\"]?.role === \"filter\",\n )\n ) {\n throw new Error(`Clicky table column references unknown filter parameter ${key}`);\n }\n\n setFilters((current) => {\n const selected = parseMultiFilterValue(current[key] ?? \"\");\n if (mode === undefined) {\n delete selected[value];\n } else {\n selected[value] = mode;\n }\n\n const next = { ...current };\n const serialized = serializeMultiFilterValue(selected);\n if (serialized) {\n next[key] = serialized;\n } else {\n delete next[key];\n }\n\n const offset = listParameters.find(\n (parameter) => parameter[\"x-clicky\"]?.role === \"offset\",\n );\n if (offset) next[offset.name] = \"0\";\n return next;\n });\n },\n [listParameters],\n );\n const resultFilterConfig = useMemo<OperationResultFilterConfig>(\n () => ({\n filters: decoratedFilters,\n cellFilters,\n onCellFilterChange,\n ...(filterBarConfig.search ? { search: filterBarConfig.search } : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }),\n [\n cellFilters,\n decoratedFilters,\n filterBarConfig.search,\n filterBarConfig.timeRange,\n onCellFilterChange,\n ],\n );\n\n const showTable = !!listEndpoint;\n let listError: unknown;\n if (!listQuery.isFetching) {\n if (listQuery.isError) {\n listError = listQuery.error;\n } else if (listQuery.data?.success === false) {\n listError = new Error(\n listQuery.data.error ||\n listQuery.data.message ||\n listQuery.data.stderr ||\n `Command failed with exit code ${listQuery.data.exit_code}`,\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(\n listError,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n : undefined;\n const tableResponse =\n listQuery.data?.success === false ? null : (listQuery.data ?? null);\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(\n op: ResolvedOperation,\n ): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if (\n (op.operation.parameters ?? []).some((param) => param.name === \"filter\")\n ) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\n </div>\n );\n }\n\n const actionBar = (\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n />\n );\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {actionsContainer ? createPortal(actionBar, actionsContainer) : actionBar}\n\n {showTable ? (\n <div\n className=\"min-h-0 flex-1\"\n data-slot=\"operation-catalog-results\"\n >\n {(() => {\n const defaultView = (\n <OperationResultView\n response={tableResponse}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0\"\n detailOperation={detailOperation}\n filterConfig={resultFilterConfig}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(download ? { download } : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n filterConfig: resultFilterConfig,\n // A renderer that replaces the table owns the whole surface,\n // pager and download menu included. Without these it can only\n // drop them, which is how a replaced view silently loses the\n // ability to reach page two.\n ...(dataTablePagination ? { pagination: dataTablePagination } : {}),\n ...(download ? { download } : {}),\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["jsxs","jsx","useOperations","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findSurfaceDetailOperation","useState","_a","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceCollectionActions","useOperationFilterSearch","parametersToFormConfig","dataTablePaginationFromForm","applyFilterExtensions","parseMultiFilterValue","useCallback","serializeMultiFilterValue","getOperationClickyMeta","OperationActionBar","createPortal","OperationResultView","EndpointList"],"mappings":";;;;;;;;;;;;;;;;AA2FA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAE5E,SAAS,mBAAmB,KAAc,OAAe;AACvD,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,OAAO,EAAE;AACrE,SACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,yFACb,UAAA;AAAA,IAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,eAAe,UAAA,OAAM;AAAA,IACnC,WACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,+CACZ,UAAA,QAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;;AACxB,QAAM,EAAE,YAAY,cAAcC,cAAAA,cAAc,MAAM;AAEtD,QAAM,aAAaC,MAAAA;AAAAA,IACjB,MAAMC,eAAAA,0BAA0B,YAAY,UAAU;AAAA,IACtD,CAAC,YAAY,UAAU;AAAA,EAAA;AAEzB,QAAM,qBAAqB,WAAW,SAAS;AAK/C,QAAM,YAAYD,MAAAA,QAAQ,MAAM;AAC9B,QAAI,mBAAoB,QAAO;AAC/B,WAAO,gBACH,aACAE,kCAAyB,YAAY,QAAQ;AAAA,EACnD,GAAG,CAAC,eAAe,UAAU,YAAY,YAAY,kBAAkB,CAAC;AAMxE,QAAM,eAAeF,MAAAA,QAAQ,MAAM;AACjC,QAAI,CAAC,mBAAoB,QAAO;AAChC,WAAOG,eAAAA,yBAAyB,WAAW,UAAU;AAAA,EACvD,GAAG,CAAC,WAAW,YAAY,kBAAkB,CAAC;AAG9C,QAAM,kBAAkBH,MAAAA;AAAAA,IACtB,MACE,qBACII,eAAAA,2BAA2B,WAAW,UAAU,IAChD;AAAA,IACN,CAAC,WAAW,YAAY,kBAAkB;AAAA,EAAA;AAE5C,QAAM,CAAC,SAAS,UAAU,IAAIC,MAAAA;AAAAA,IAAiC,MAC7D,mBAAA;AAAA,EAAmB;AAErB,QAAM,kBAAiB,6CAAc,UAAU,eAAc,CAAA;AAC7D,QAAM,WAAWL,MAAAA,QAA2C,MAAM;;AAChE,UAAM,QAAOM,MAAA,6CAAc,UAAU,gBAAxB,gBAAAA,IAAqC;AAClD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO;AAAA,MACL,OAAO,WAAW;AAAA,MAClB,GAAI,KAAK,UACL,EAAE,SAAS,KAAK,QAAA,IAChB,CAAA;AAAA,MACJ,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAA,IAAgB,CAAA;AAAA,MAC3D,GAAI,KAAK,gBACL;AAAA,QACE,eAAe,KAAK;AAAA,MAAA,IAItB,CAAA;AAAA,IAAC;AAAA,EAET,GAAG,CAAC,WAAW,OAAO,YAAY,CAAC;AAEnCC,QAAAA,UAAU,MAAM;AACd,sBAAkB,OAAO;AAAA,EAC3B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,YAAYC,WAAAA,SAA4B;AAAA,IAC5C,UAAU;AAAA,MACR;AAAA,MACA,6CAAc;AAAA,MACd,6CAAc;AAAA,MACd;AAAA,IAAA;AAAA,IAEF,SAAS,MACP,OAAO;AAAA,MACL,aAAc;AAAA,MACd,aAAc;AAAA,MACdC,aAAAA,oBAAoB,SAAS,aAAc,UAAU,cAAc,CAAA,CAAE;AAAA,MACrE;AAAA,QACE,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,IAEJ,SAAS,CAAC,CAAC;AAAA,IACX,iBAAiBC,WAAAA;AAAAA,IACjB,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAED,QAAM,cAAcF,WAAAA,SAAkC;AAAA,IACpD,UAAU;AAAA,MACR;AAAA,MACA,6CAAc;AAAA,MACd,6CAAc;AAAA,MACd;AAAA,IAAA;AAAA,IAEF,SAAS,YAAA;;AACN,qBAAMF,MAAA,OAAO,kBAAP,gBAAAA,IAAA;AAAA;AAAA,QACL,aAAc;AAAA,QACd,aAAc;AAAA,QACdG,aAAAA,oBAAoB,SAAS,cAAc;AAAA,QAC3C,EAAE,QAAQ,0BAAA;AAAA,YACN,EAAE,SAAS,GAAC;AAAA;AAAA,IACpB,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO;AAAA,IACpC,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAQD,QAAM,YAAYT,MAAAA;AAAAA,IAChB,MACE,qBACIW,eAAAA,6BAA6B,WAAW,UAAU,IAClD,CAAA;AAAA,IACN,CAAC,WAAW,YAAY,kBAAkB;AAAA,EAAA;AAG5C,QAAM,eAAeC,sBAAAA;AAAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,kBAAkBZ,MAAAA,QAAQ,MAAM;AACpC,UAAM,UAAgC;AAAA,MACpC,kBAAkB,CAAC,OAAO;AAAA,MAC1B;AAAA,IAAA;AAEF,QAAI,YAAY,QAAQ,MAAM;AAC5B,cAAQ,SAAS,YAAY;AAAA,IAC/B;AACA,WAAOa,aAAAA,uBAAuB,gBAAgB,SAAS,YAAY,OAAO;AAAA,EAC5E,GAAG,CAAC,SAAS,gBAAgB,YAAY,MAAM,YAAY,CAAC;AAC5D,QAAM,sBAAsBb,MAAAA;AAAAA,IAC1B,MACEc,aAAAA,4BAA4B,gBAAgB,YAAY,UAAU,IAAI;AAAA,IACxE,CAAC,gBAAgB,YAAY,UAAU,IAAI;AAAA,EAAA;AAE7C,QAAM,mBAAmBd,MAAAA;AAAAA,IACvB,MACE,gBAAgB,QAAQ;AAAA,MAAI,CAAC,WAC3Be,qCAAsB,QAAQ,SAAS;AAAA,IAAA;AAAA,IAE3C,CAAC,gBAAgB,SAAS,SAAS;AAAA,EAAA;AAErC,QAAM,cAAcf,MAAAA;AAAAA,IAClB,MACE,OAAO;AAAA,MACL,eACG,OAAO,CAAC,cAAA;;AAAc,iBAAAM,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA,OAAQ,EAC9D,IAAI,CAAC,cAAc;AAAA,QAClB,UAAU;AAAA,QACVU,sBAAAA,sBAAsB,QAAQ,UAAU,IAAI,KAAK,EAAE;AAAA,MAAA,CACpD;AAAA,IAAA;AAAA,IAEP,CAAC,SAAS,cAAc;AAAA,EAAA;AAE1B,QAAM,qBAAqBC,MAAAA;AAAAA,IACzB,CAAC,EAAE,KAAK,OAAO,WAA6B;AAC1C,UACE,CAAC,eAAe;AAAA,QACd,CAAC;;AACC,2BAAU,SAAS,SAAOX,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA;AAAA,MAAA,GAE9D;AACA,cAAM,IAAI,MAAM,2DAA2D,GAAG,EAAE;AAAA,MAClF;AAEA,iBAAW,CAAC,YAAY;AACtB,cAAM,WAAWU,sBAAAA,sBAAsB,QAAQ,GAAG,KAAK,EAAE;AACzD,YAAI,SAAS,QAAW;AACtB,iBAAO,SAAS,KAAK;AAAA,QACvB,OAAO;AACL,mBAAS,KAAK,IAAI;AAAA,QACpB;AAEA,cAAM,OAAO,EAAE,GAAG,QAAA;AAClB,cAAM,aAAaE,sBAAAA,0BAA0B,QAAQ;AACrD,YAAI,YAAY;AACd,eAAK,GAAG,IAAI;AAAA,QACd,OAAO;AACL,iBAAO,KAAK,GAAG;AAAA,QACjB;AAEA,cAAM,SAAS,eAAe;AAAA,UAC5B,CAAC,cAAA;;AAAc,qBAAAZ,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA;AAAA,QAAA;AAEjD,YAAI,OAAQ,MAAK,OAAO,IAAI,IAAI;AAChC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,cAAc;AAAA,EAAA;AAEjB,QAAM,qBAAqBN,MAAAA;AAAAA,IACzB,OAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAI,gBAAgB,SAAS,EAAE,QAAQ,gBAAgB,OAAA,IAAW,CAAA;AAAA,MAClE,GAAI,gBAAgB,YAChB,EAAE,WAAW,gBAAgB,UAAA,IAC7B,CAAA;AAAA,IAAC;AAAA,IAEP;AAAA,MACE;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,YAAY,CAAC,CAAC;AACpB,MAAI;AACJ,MAAI,CAAC,UAAU,YAAY;AACzB,QAAI,UAAU,SAAS;AACrB,kBAAY,UAAU;AAAA,IACxB,aAAW,eAAU,SAAV,mBAAgB,aAAY,OAAO;AAC5C,kBAAY,IAAI;AAAA,QACd,UAAU,KAAK,SACb,UAAU,KAAK,WACf,UAAU,KAAK,UACf,iCAAiC,UAAU,KAAK,SAAS;AAAA,MAAA;AAAA,IAE/D;AAAA,EACF;AACA,QAAM,aACJ,cAAc,SACV;AAAA,IACE;AAAA,IACA,mBAAkB,6CAAc,SAAQ,EAAE;AAAA,EAAA,IAE5C;AACN,QAAM,kBACJ,eAAU,SAAV,mBAAgB,aAAY,QAAQ,OAAQ,UAAU,QAAQ;AAIhE,WAAS,sBACP,IACwB;AACxB,UAAM,OAAOmB,eAAAA,uBAAuB,EAAE;AACtC,QAAI,QAAQ,QAAQ,CAAC,KAAK,oBAAoB;AAC5C,aAAO,CAAA;AAAA,IACT;AAEA,UAAM,SAAiC,CAAA;AACvC,eAAW,SAAS,GAAG,UAAU,cAAc,CAAA,GAAI;AACjD,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAI,MAAM,OAAO,WAAW,OAAO;AACjC,eAAO,MAAM,IAAI,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK,OAAO,IAAI;AAAA,IACzB;AAEA,SACG,GAAG,UAAU,cAAc,CAAA,GAAI,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,GACvE;AACA,aAAO,SACL,OAAO,QAAQ,OAAO,EACnB,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,KAAK,EAC3B,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EACvC,KAAK,IAAI,KAAK;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,WACEtB,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,eAAA,EAAc,WAAU,YAAA,CAAY;AAAA,MACrCA,2BAAAA,IAAC,eAAA,EAAc,WAAU,gBAAA,CAAgB;AAAA,MACxC,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAAC,GAAG,MACjCA,2BAAAA,IAAC,eAAA,EAAsB,WAAU,OAAA,GAAb,CAAoB,CACzC;AAAA,IAAA,GACH;AAAA,EAEJ;AAEA,QAAM,YACJA,2BAAAA;AAAAA,IAACsB,mBAAAA;AAAAA,IAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,MACjB,YAAY,MAAM,KAAK,UAAU,QAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,MAC5B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,MAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,MACpC,GAAI,eAAe,EAAE,iBAAiB,CAAA;AAAA,IAAC;AAAA,EAAA;AAI5C,SACEvB,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,aAAU;AAAA,MAKT,UAAA;AAAA,QAAA,mBAAmBwB,SAAAA,aAAa,WAAW,gBAAgB,IAAI;AAAA,QAE/D,YACCvB,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,aAAU;AAAA,YAER,WAAA,MAAM;AACN,oBAAM,cACJA,2BAAAA;AAAAA,gBAACwB,oBAAAA;AAAAA,gBAAA;AAAA,kBACC,UAAU;AAAA,kBACV,SAAS,UAAU;AAAA,kBACnB,gBAAgB,WAAW,WAAW,KAAK;AAAA,kBAC3C,cAAa;AAAA,kBACb,WAAW,GAAG,WAAW,KAAK;AAAA,kBAC9B,WAAU;AAAA,kBACV;AAAA,kBACA,cAAc;AAAA,kBACb,GAAI,aAAa,EAAE,OAAO,WAAA,IAAe,CAAA;AAAA,kBACzC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,kBAC1C,GAAI,sBACD,EAAE,YAAY,oBAAA,IACd,CAAA;AAAA,kBACH,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,gBAAC;AAAA,cAAA;AAGpC,qBAAO,iBACH,eAAe;AAAA,gBACb,UAAU,UAAU,QAAQ;AAAA,gBAC5B;AAAA,gBACA,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKd,GAAI,sBAAsB,EAAE,YAAY,oBAAA,IAAwB,CAAA;AAAA,gBAChE,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,gBAC9B,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,cAAC,CACpC,IACD;AAAA,YACN,GAAA;AAAA,UAAG;AAAA,QAAA,IAGLxB,2BAAAA;AAAAA,UAACyB,aAAAA;AAAAA,UAAA;AAAA,YACC,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,qBAA6C;AACpD,MAAI,OAAO,WAAW,YAAa,QAAO,CAAA;AAC1C,QAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,QAAM,SAAiC,CAAA;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,WAAW;AAC3C,QAAI,IAAI,WAAW,IAAI,EAAG;AAC1B,QAAI,UAAU,GAAI,QAAO,GAAG,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,EAAE,aAAqC;AAC5D,SACEzB,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,qCAAqC,aAAa,EAAE,GAAG,KAAA;AAAA,IAAK;AAAA,EAAA;AAG7E;AAEA,SAAS,kBAAkB,SAAiC;AAC1D,MAAI,OAAO,WAAW,YAAa;AACnC,QAAM,SAAS,4BAAA;AACf,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,GAAI,QAAO,IAAI,KAAK,KAAK;AAAA,EACzC;AACA,QAAM,QAAQ,OAAO,SAAA;AACrB,QAAM,OAAO,GAAG,OAAO,SAAS,QAAQ,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE,GAAG,OAAO,SAAS,IAAI;AAC1F,MACE,SACA,GAAG,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,MAAM,GAAG,OAAO,SAAS,IAAI,IAC3E;AACA,WAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,IAAI;AAAA,EAC5D;AACF;AAEA,SAAS,8BAA8B;AACrC,QAAM,UAAU,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC1D,QAAM,OAAO,IAAI,gBAAA;AACjB,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ,WAAW;AAC5C,QAAI,CAAC,IAAI,WAAW,IAAI,EAAG;AAC3B,QAAI,QAAQ,eAAe,IAAI,WAAW,OAAO,EAAG;AACpD,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AACA,SAAO;AACT;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAWlF,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAa1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IAGvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACxE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACzD,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAItC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC,CAAC;AAkBF,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAqB,EACrB,UAAU,EACV,SAAS,EACT,cAAmC,EACnC,WAAgC,EAChC,cAAc,EACd,OAAO,EACP,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,EAAE,qBAAqB,2CAwWvB"}
|