vector-inspector 0.3.6__py3-none-any.whl → 0.3.8__py3-none-any.whl

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.
@@ -0,0 +1,106 @@
1
+ """Reusable UI shell for Vector Inspector applications."""
2
+
3
+ from PySide6.QtWidgets import (
4
+ QMainWindow,
5
+ QWidget,
6
+ QVBoxLayout,
7
+ QHBoxLayout,
8
+ QSplitter,
9
+ QTabWidget,
10
+ )
11
+ from PySide6.QtCore import Qt
12
+
13
+
14
+ class InspectorShell(QMainWindow):
15
+ """Base shell for Inspector applications with splitter, tab widget, and left panel.
16
+
17
+ This provides the basic UI structure that can be reused by Vector Inspector
18
+ and Vector Fusion Studio. Subclasses customize behavior and add domain logic.
19
+ """
20
+
21
+ def __init__(self):
22
+ super().__init__()
23
+
24
+ # Main UI components that subclasses will interact with
25
+ self.left_tabs = None
26
+ self.tab_widget = None
27
+ self.main_splitter = None
28
+
29
+ self._setup_shell_ui()
30
+
31
+ def _setup_shell_ui(self):
32
+ """Setup the main UI shell layout."""
33
+ # Central widget with splitter
34
+ central_widget = QWidget()
35
+ self.setCentralWidget(central_widget)
36
+
37
+ layout = QHBoxLayout(central_widget)
38
+ layout.setContentsMargins(5, 5, 5, 5)
39
+
40
+ # Main splitter (left panel | right tabs)
41
+ self.main_splitter = QSplitter(Qt.Horizontal)
42
+
43
+ # Left panel container (will hold tabs)
44
+ left_panel = QWidget()
45
+ left_layout = QVBoxLayout(left_panel)
46
+ left_layout.setContentsMargins(0, 0, 0, 0)
47
+
48
+ # Create tab widget for left panel
49
+ self.left_tabs = QTabWidget()
50
+ left_layout.addWidget(self.left_tabs)
51
+
52
+ # Right panel - main content tabs
53
+ self.tab_widget = QTabWidget()
54
+
55
+ # Add panels to splitter
56
+ self.main_splitter.addWidget(left_panel)
57
+ self.main_splitter.addWidget(self.tab_widget)
58
+ self.main_splitter.setStretchFactor(0, 1)
59
+ self.main_splitter.setStretchFactor(1, 4)
60
+
61
+ layout.addWidget(self.main_splitter)
62
+
63
+ def add_left_panel(self, widget: QWidget, title: str, index: int = -1):
64
+ """Add a panel to the left tab widget.
65
+
66
+ Args:
67
+ widget: The panel widget to add
68
+ title: Display title for the tab
69
+ index: Optional position (default appends to end)
70
+ """
71
+ if index < 0:
72
+ self.left_tabs.addTab(widget, title)
73
+ else:
74
+ self.left_tabs.insertTab(index, widget, title)
75
+
76
+ def add_main_tab(self, widget: QWidget, title: str, index: int = -1):
77
+ """Add a tab to the main content area.
78
+
79
+ Args:
80
+ widget: The tab widget to add
81
+ title: Display title for the tab
82
+ index: Optional position (default appends to end)
83
+ """
84
+ if index < 0:
85
+ self.tab_widget.addTab(widget, title)
86
+ else:
87
+ self.tab_widget.insertTab(index, widget, title)
88
+
89
+ def set_left_panel_active(self, index: int):
90
+ """Switch to a specific left panel tab."""
91
+ if 0 <= index < self.left_tabs.count():
92
+ self.left_tabs.setCurrentIndex(index)
93
+
94
+ def set_main_tab_active(self, index: int):
95
+ """Switch to a specific main content tab."""
96
+ if 0 <= index < self.tab_widget.count():
97
+ self.tab_widget.setCurrentIndex(index)
98
+
99
+ def get_main_tab_count(self) -> int:
100
+ """Get the number of main content tabs."""
101
+ return self.tab_widget.count()
102
+
103
+ def remove_main_tab(self, index: int):
104
+ """Remove a main content tab."""
105
+ if 0 <= index < self.tab_widget.count():
106
+ self.tab_widget.removeTab(index)
@@ -0,0 +1 @@
1
+ """UI services for dialog management and utilities."""
@@ -0,0 +1,113 @@
1
+ """Service for managing application dialogs."""
2
+
3
+ from PySide6.QtWidgets import QMessageBox, QDialog, QWidget
4
+ from vector_inspector.core.connection_manager import ConnectionManager
5
+
6
+
7
+ class DialogService:
8
+ """Service for launching application dialogs."""
9
+
10
+ @staticmethod
11
+ def show_about(parent: QWidget = None):
12
+ """Show about dialog."""
13
+ from vector_inspector.utils.version import get_app_version
14
+
15
+ version = get_app_version()
16
+ version_html = (
17
+ f"<h2>Vector Inspector {version}</h2>" if version else "<h2>Vector Inspector</h2>"
18
+ )
19
+ about_text = (
20
+ version_html + "<p>A comprehensive desktop application for visualizing, "
21
+ "querying, and managing multiple vector databases simultaneously.</p>"
22
+ '<p><a href="https://github.com/anthonypdawson/vector-inspector" style="color:#2980b9;">GitHub Project Page</a></p>'
23
+ "<hr />"
24
+ "<p>Built with PySide6</p>"
25
+ "<p><b>New:</b> Pinecone support!</p>"
26
+ )
27
+ QMessageBox.about(parent, "About Vector Inspector", about_text)
28
+
29
+ @staticmethod
30
+ def show_backup_restore_dialog(
31
+ connection, collection_name: str = "", parent: QWidget = None
32
+ ) -> int:
33
+ """Show backup/restore dialog.
34
+
35
+ Args:
36
+ connection: Active connection instance
37
+ collection_name: Optional collection name
38
+ parent: Parent widget
39
+
40
+ Returns:
41
+ QDialog.Accepted or QDialog.Rejected
42
+ """
43
+ if not connection:
44
+ QMessageBox.information(parent, "No Connection", "Please connect to a database first.")
45
+ return QDialog.Rejected
46
+
47
+ # Show info if no collection selected
48
+ if not collection_name:
49
+ QMessageBox.information(
50
+ parent,
51
+ "No Collection Selected",
52
+ "You can restore backups without a collection selected.\n"
53
+ "To create a backup, please select a collection first.",
54
+ )
55
+
56
+ from vector_inspector.ui.components.backup_restore_dialog import BackupRestoreDialog
57
+
58
+ dialog = BackupRestoreDialog(connection, collection_name or "", parent)
59
+ return dialog.exec()
60
+
61
+ @staticmethod
62
+ def show_migration_dialog(connection_manager: ConnectionManager, parent: QWidget = None) -> int:
63
+ """Show cross-database migration dialog.
64
+
65
+ Args:
66
+ connection_manager: Connection manager instance
67
+ parent: Parent widget
68
+
69
+ Returns:
70
+ QDialog.Accepted or QDialog.Rejected
71
+ """
72
+ if connection_manager.get_connection_count() < 2:
73
+ QMessageBox.information(
74
+ parent,
75
+ "Insufficient Connections",
76
+ "You need at least 2 active connections to migrate data.\n"
77
+ "Please connect to additional databases first.",
78
+ )
79
+ return QDialog.Rejected
80
+
81
+ from vector_inspector.ui.dialogs.cross_db_migration import CrossDatabaseMigrationDialog
82
+
83
+ dialog = CrossDatabaseMigrationDialog(connection_manager, parent)
84
+ return dialog.exec()
85
+
86
+ @staticmethod
87
+ def show_profile_editor_prompt(parent: QWidget = None):
88
+ """Show message prompting user to create a new profile."""
89
+ QMessageBox.information(
90
+ parent,
91
+ "Connect to Profile",
92
+ "Select a profile from the list and click 'Connect', or click '+' to create a new profile.",
93
+ )
94
+
95
+ @staticmethod
96
+ def show_update_details(latest_release: dict, parent: QWidget = None):
97
+ """Show update details dialog.
98
+
99
+ Args:
100
+ latest_release: Latest release info from GitHub API
101
+ parent: Parent widget
102
+ """
103
+ from vector_inspector.ui.components.update_details_dialog import UpdateDetailsDialog
104
+ from vector_inspector.services.update_service import UpdateService
105
+
106
+ version = latest_release.get("tag_name", "?")
107
+ notes = latest_release.get("body", "")
108
+ instructions = UpdateService.get_update_instructions()
109
+ pip_cmd = instructions["pip"]
110
+ github_url = instructions["github"]
111
+
112
+ dialog = UpdateDetailsDialog(version, notes, pip_cmd, github_url, parent)
113
+ dialog.exec()
@@ -0,0 +1,64 @@
1
+ """Tab registry for Inspector applications."""
2
+
3
+ from typing import List, Tuple, Type
4
+ from PySide6.QtWidgets import QWidget
5
+
6
+
7
+ class TabDefinition:
8
+ """Definition for a tab in the main content area."""
9
+
10
+ def __init__(self, title: str, widget_class: Type[QWidget], lazy_load: bool = False):
11
+ self.title = title
12
+ self.widget_class = widget_class
13
+ self.lazy_load = lazy_load
14
+
15
+
16
+ class InspectorTabs:
17
+ """Registry of standard Inspector tabs.
18
+
19
+ This allows both Vector Inspector and Vector Fusion Studio to use
20
+ the same tab definitions and add their own custom tabs.
21
+ """
22
+
23
+ # Tab indices (for programmatic access)
24
+ INFO_TAB = 0
25
+ DATA_TAB = 1
26
+ SEARCH_TAB = 2
27
+ VISUALIZATION_TAB = 3
28
+
29
+ @staticmethod
30
+ def get_standard_tabs() -> List[TabDefinition]:
31
+ """Get list of standard Inspector tabs.
32
+
33
+ Returns:
34
+ List of TabDefinition objects
35
+ """
36
+ from vector_inspector.ui.views.info_panel import InfoPanel
37
+ from vector_inspector.ui.views.metadata_view import MetadataView
38
+ from vector_inspector.ui.views.search_view import SearchView
39
+ from vector_inspector.ui.views.visualization_view import VisualizationView
40
+
41
+ return [
42
+ TabDefinition("Info", InfoPanel, lazy_load=False),
43
+ TabDefinition("Data Browser", MetadataView, lazy_load=False),
44
+ TabDefinition("Search", SearchView, lazy_load=False),
45
+ TabDefinition("Visualization", VisualizationView, lazy_load=True),
46
+ ]
47
+
48
+ @staticmethod
49
+ def create_tab_widget(tab_def: TabDefinition, connection=None) -> QWidget:
50
+ """Create a widget instance from a tab definition.
51
+
52
+ Args:
53
+ tab_def: Tab definition
54
+ connection: Optional connection to pass to widget
55
+
56
+ Returns:
57
+ Widget instance
58
+ """
59
+ if tab_def.lazy_load:
60
+ # Return placeholder for lazy-loaded tabs
61
+ return QWidget()
62
+ else:
63
+ # Create widget with connection
64
+ return tab_def.widget_class(connection)
@@ -780,6 +780,78 @@ class MetadataView(QWidget):
780
780
  # compute its page and load that page while selecting the row. This
781
781
  # ensures the edited item becomes visible even if the backend moved it.
782
782
  try:
783
+ # Quick in-place update: if the updated item is still on the
784
+ # currently-visible page, update the in-memory page and
785
+ # table cells and emit `dataChanged` so the view refreshes
786
+ # immediately without a full reload.
787
+ updated_id = updated_data.get("id")
788
+ if (
789
+ self.current_data
790
+ and self.current_data.get("ids")
791
+ and updated_id in self.current_data.get("ids", [])
792
+ ):
793
+ try:
794
+ row_idx = self.current_data["ids"].index(updated_id)
795
+
796
+ # Update in-memory lists
797
+ if "documents" in self.current_data and row_idx < len(
798
+ self.current_data["documents"]
799
+ ):
800
+ self.current_data["documents"][row_idx] = (
801
+ updated_data["document"] if updated_data["document"] else ""
802
+ )
803
+ if "metadatas" in self.current_data and row_idx < len(
804
+ self.current_data["metadatas"]
805
+ ):
806
+ self.current_data["metadatas"][row_idx] = (
807
+ updated_data["metadata"] if updated_data["metadata"] else {}
808
+ )
809
+
810
+ # Update table cell text for document column
811
+ doc_text = (
812
+ str(self.current_data["documents"][row_idx])
813
+ if self.current_data["documents"][row_idx]
814
+ else ""
815
+ )
816
+ if len(doc_text) > 100:
817
+ doc_text = doc_text[:100] + "..."
818
+ self.table.setItem(row_idx, 1, QTableWidgetItem(doc_text))
819
+
820
+ # Update metadata columns based on current header names
821
+ metadata_keys = []
822
+ for col in range(2, self.table.columnCount()):
823
+ hdr = self.table.horizontalHeaderItem(col)
824
+ if hdr:
825
+ metadata_keys.append(hdr.text())
826
+
827
+ if "metadatas" in self.current_data:
828
+ meta = self.current_data["metadatas"][row_idx]
829
+ for col_idx, key in enumerate(metadata_keys, start=2):
830
+ value = meta.get(key, "")
831
+ self.table.setItem(
832
+ row_idx, col_idx, QTableWidgetItem(str(value))
833
+ )
834
+
835
+ # Emit dataChanged on the underlying model so views refresh
836
+ try:
837
+ model = self.table.model()
838
+ top = model.index(row_idx, 0)
839
+ bottom = model.index(row_idx, self.table.columnCount() - 1)
840
+ model.dataChanged.emit(top, bottom, [Qt.DisplayRole, Qt.EditRole])
841
+ except Exception:
842
+ pass
843
+
844
+ # Restore selection/scroll and return
845
+ self.table.verticalScrollBar().setValue(
846
+ self.table.verticalScrollBar().value()
847
+ )
848
+ self.table.selectRow(row_idx)
849
+ self.table.scrollToItem(self.table.item(row_idx, 0))
850
+ return
851
+ except Exception:
852
+ # Fall through to server-side search if in-place update fails
853
+ pass
854
+
783
855
  server_filter = None
784
856
  if self.filter_group.isChecked() and self.filter_builder.has_filters():
785
857
  server_filter, _ = self.filter_builder.get_filters_split()
@@ -1,5 +1,12 @@
1
- APP_VERSION = "0.3.3" # Update this when pyproject.toml version changes
2
-
3
-
4
1
  def get_app_version():
5
- return APP_VERSION
2
+ try:
3
+ from importlib.metadata import version, PackageNotFoundError
4
+ except ImportError:
5
+ try:
6
+ from importlib_metadata import version, PackageNotFoundError # type: ignore
7
+ except ImportError:
8
+ return "?"
9
+ try:
10
+ return version("vector-inspector")
11
+ except PackageNotFoundError:
12
+ return "?"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vector-inspector
3
- Version: 0.3.6
3
+ Version: 0.3.8
4
4
  Summary: A comprehensive desktop application for visualizing, querying, and managing vector database data
5
5
  Author-Email: Anthony Dawson <anthonypdawson+github@gmail.com>
6
6
  License: MIT
@@ -31,9 +31,31 @@ Requires-Dist: pgvector>=0.4.2
31
31
  Description-Content-Type: text/markdown
32
32
 
33
33
  # Latest updates
34
- - Added Postgres (pgvector extension) support as a new vector database connection option.
35
- - Fixed issue with embedding regeneration on add/edit
36
- - Added option for editing items without regenerating embeddings
34
+
35
+ ## Vector Inspector 2026.01 Release Notes
36
+
37
+ ### Major Refactor and Studio-Ready Architecture
38
+ - Refactored main window into modular components:
39
+ - InspectorShell: reusable UI shell (splitter, tabs, layout)
40
+ - ProviderFactory: centralized connection creation
41
+ - DialogService: dialog management
42
+ - ConnectionController: connection lifecycle and threading
43
+ - InspectorTabs: pluggable tab registry
44
+ - MainWindow now inherits from InspectorShell and is fully reusable as a widget
45
+ - Bootstrap logic is separated from UI logic—Studio can host Inspector as a component
46
+ - Tab system is now pluggable: Studio and Inspector can add, remove, or override tabs via TabDefinition
47
+ - All Inspector UI logic is self-contained; Studio can extend without modifying Inspector code
48
+
49
+ ### Data Browser Improvements
50
+ - Added a checkbox: Generate embeddings on edit (default: checked)
51
+ - When unchecked, editing a row skips embedding regeneration
52
+ - Setting is persisted per user
53
+
54
+ ### Developer and Architecture Notes
55
+ - All modules pass syntax checks and are ready for Studio integration
56
+ - No breaking changes for existing Inspector users
57
+ - Inspector is now a true UI module, not just an application
58
+
37
59
  ---
38
60
 
39
61
  # Vector Inspector
@@ -41,7 +63,7 @@ Description-Content-Type: text/markdown
41
63
  > **Disclaimer:** This tool is currently under active development and is **not production ready**. Not all features have been thoroughly tested and code is released frequently. Use with caution in critical or production environments.
42
64
 
43
65
  [![CI](https://github.com/anthonypdawson/vector-inspector/actions/workflows/ci-tests.yml/badge.svg?branch=master)](https://github.com/anthonypdawson/vector-inspector/actions/workflows/ci-tests.yml)
44
- [![Publish](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish.yml/badge.svg?branch=master)](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish.yml)
66
+ [![Publish](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish%20copy.yml/badge.svg?branch=master)](https://github.com/anthonypdawson/vector-inspector/actions/workflows/publish%20copy.yml)
45
67
 
46
68
  [![PyPI Version](https://img.shields.io/pypi/v/vector-inspector.svg?cacheSeconds=300)](https://pypi.org/project/vector-inspector/)
47
69
  [![PyPI Downloads](https://static.pepy.tech/personalized-badge/vector-inspector?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/vector-inspector)
@@ -1,6 +1,6 @@
1
- vector_inspector-0.3.6.dist-info/METADATA,sha256=p7H27JQIdMv3bNqDlU98WDzCVdWkNJTirylQTbGW8DQ,10587
2
- vector_inspector-0.3.6.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
3
- vector_inspector-0.3.6.dist-info/entry_points.txt,sha256=u96envMI2NFImZUJDFutiiWl7ZoHrrev9joAgtyvTxo,80
1
+ vector_inspector-0.3.8.dist-info/METADATA,sha256=efuN0ywBf5QkEwGbRDiOV9YHG9pLNdBWBqnHPDsqUg0,11574
2
+ vector_inspector-0.3.8.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
3
+ vector_inspector-0.3.8.dist-info/entry_points.txt,sha256=u96envMI2NFImZUJDFutiiWl7ZoHrrev9joAgtyvTxo,80
4
4
  vector_inspector/__init__.py,sha256=Q8XbXn98o0eliQWPePhy-aGUz2KNnVg7bQq-sBPl7zQ,119
5
5
  vector_inspector/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
6
6
  vector_inspector/config/__init__.py,sha256=vHkVsXSUdInsfzWSOLPZzaaELa3SGenAgfpY5EYbsYA,95
@@ -10,10 +10,10 @@ vector_inspector/core/cache_manager.py,sha256=cHdbIYR-eS9vLLTqvq4Xejyi5Z7Fm9DqMh
10
10
  vector_inspector/core/connection_manager.py,sha256=xNmgSXqJcMC-iaOY33-Xnfxq4QjUN4CuwppPjzhn3DY,9958
11
11
  vector_inspector/core/connections/__init__.py,sha256=lDZ-Qv-CbBvVcSlT8K2824zojovEIKhykHVSLARHZWs,345
12
12
  vector_inspector/core/connections/base_connection.py,sha256=jDA1cEeNbTghqcCZYoLRpRPXIUteU5mSdpKcjvr4JQI,12236
13
- vector_inspector/core/connections/chroma_connection.py,sha256=YE5kzW5poGqQqEvwVWx_E9_E3iPag8y6uGFSG0Mv9jY,20799
14
- vector_inspector/core/connections/pgvector_connection.py,sha256=rcx567u5vQxQv-v_lEoi34hmfHpoM7f3UTelatzSRCw,43688
15
- vector_inspector/core/connections/pinecone_connection.py,sha256=TbvPmbMygkqssb7w4HGc-h_PxI-KimIf1OL9bQ_fyLk,26804
16
- vector_inspector/core/connections/qdrant_connection.py,sha256=67SxKiHH3m3jxGIyHt7E6ZduNiQ93ROKLsbfag_h7-I,31478
13
+ vector_inspector/core/connections/chroma_connection.py,sha256=Mks17olaHIxvJAdCVB6EoQa5Tj7ScoD3_b2--Ra0Owk,21006
14
+ vector_inspector/core/connections/pgvector_connection.py,sha256=7xzS3WRaa8IMt-RMU056kzxqiu2SLPgYxDMz_Xw5LVc,43812
15
+ vector_inspector/core/connections/pinecone_connection.py,sha256=V6nHLB6DXfQJG8LiH1uPtWFs6otACkaNxeYrM0uY0AQ,26954
16
+ vector_inspector/core/connections/qdrant_connection.py,sha256=GkLmnwnswakSMRM16pmtjkR6QXBszDhvg-aKhmI9jxw,31958
17
17
  vector_inspector/core/connections/qdrant_helpers/__init__.py,sha256=u2YNjiW4sbNtqhTNOQr4hmOFqirlNlllsyBK2gWs9eU,262
18
18
  vector_inspector/core/connections/qdrant_helpers/qdrant_embedding_resolver.py,sha256=9lQrVnjIDH2YyMMZwHdAtcSeWhNwUDrmMkFik3xWvGU,1547
19
19
  vector_inspector/core/connections/qdrant_helpers/qdrant_filter_builder.py,sha256=WebqoWXuejaRUhpNTrEqf2JPG3BRQGhkz1HG82jBqLc,2514
@@ -26,6 +26,7 @@ vector_inspector/core/embedding_providers/sentence_transformer_provider.py,sha25
26
26
  vector_inspector/core/embedding_utils.py,sha256=UCnJllDS_YPqbOPVo_kxSCUxM64C5tmcH-fuU9IUifQ,5558
27
27
  vector_inspector/core/logging.py,sha256=HQ6_OZgZmaS3OMFOTAqc0oRbZujqo1W0w8OU4viXP1g,845
28
28
  vector_inspector/core/model_registry.py,sha256=fdofceD3iyNpECVC7djTEAaDYgHX_7JQ3ROh5A0plpY,6269
29
+ vector_inspector/core/provider_factory.py,sha256=QFDpJTOBJVYAdOLlY0GxSWl87Yj_UT9ZzOm9cjVsGMU,3924
29
30
  vector_inspector/main.py,sha256=iZeMPH94q6Ma92hWQLJ7on3rwxytUoS0V8n9MkAuEaY,595
30
31
  vector_inspector/services/__init__.py,sha256=QLgH7oybjHuEYDFNiBgmJxvSpgAzHEuBEPXa3SKJb_I,67
31
32
  vector_inspector/services/backup_helpers.py,sha256=aX1ONFegERq6dpoNM1eJrbyE1gWCV3SuUHMyPpnxrYM,2005
@@ -35,6 +36,7 @@ vector_inspector/services/filter_service.py,sha256=xDrMxNWsYzRcR1n0Fd-yp6Fo-4aLb
35
36
  vector_inspector/services/import_export_service.py,sha256=4NOfAa6ZyvMyj5cDM4xu0Wqx0pgnK3cCNBGo3E6j4LE,10200
36
37
  vector_inspector/services/profile_service.py,sha256=AMeC6XOfI6Qumi0bKlTbqU-czMcle0rrHYK68ceK5r8,12856
37
38
  vector_inspector/services/settings_service.py,sha256=YfuPK4VIn7Kd36dpGsgzLAJw3fGybopDUcHhR30GSaY,7692
39
+ vector_inspector/services/update_service.py,sha256=B_l0qQUe0L_rYWNYnqvXET4UNf6bCSsl2LTkINtp0GE,2771
38
40
  vector_inspector/services/visualization_service.py,sha256=9TOK1S1u1U74wLpF5NdDiryyrjOzFnvE8kwjugf95Wk,4208
39
41
  vector_inspector/ui/__init__.py,sha256=262ZiXO6Luk8vZnhCIoYxOtGiny0bXK-BTKjxUNBx-w,43
40
42
  vector_inspector/ui/components/__init__.py,sha256=S-GWU1P820dJ6mHmeeBEy-CGF9fjpBeNf8vrbhRlFMk,30
@@ -44,20 +46,27 @@ vector_inspector/ui/components/filter_builder.py,sha256=NSR_hp-rzUZVAca6dIJhTxZA
44
46
  vector_inspector/ui/components/item_dialog.py,sha256=VMwehEjQ6xrdxWygR9J-hHsLfzOVb_E3ePUGYO_c7XA,3951
45
47
  vector_inspector/ui/components/loading_dialog.py,sha256=YEKYGU-R-Zz4CjXSArJtkNxgTy4O9hI5Bbt6qlIzD8U,1018
46
48
  vector_inspector/ui/components/profile_manager_panel.py,sha256=U-Ea6KC97ltj7bYtG4h9Okb97SbfBAvH1SusbYHTn1o,27930
47
- vector_inspector/ui/components/splash_window.py,sha256=lnCdva1fys0BQ1k_rEIQuWjQYXdhGZOf8zRweG2VdyM,1904
49
+ vector_inspector/ui/components/splash_window.py,sha256=AYuRRdLfnuS3ueMSCLfpGG4Q348g_uDIGRyhK4ovzzU,2507
50
+ vector_inspector/ui/components/update_details_dialog.py,sha256=IQl4QZ30tHHOFay68qGOajQ6JuOB85plNoEazzMYS6k,1587
51
+ vector_inspector/ui/controllers/__init__.py,sha256=Wrc4GsLBbIU3FFk9py9URcblNCp-auGAAT1XPi20nWY,53
52
+ vector_inspector/ui/controllers/connection_controller.py,sha256=cx5Vgdn7cleMeJdUewDHd4NXSMmPUOFDwxQQVArfXuE,6494
48
53
  vector_inspector/ui/dialogs/__init__.py,sha256=xtT77L91PFfm3zHYRENHkWHJaKPm1htuUzRXAF53P8w,211
49
54
  vector_inspector/ui/dialogs/cross_db_migration.py,sha256=BaUyic8l5Ywwql2hQyxVrCXHMjGtqerNAQHDYxcbQ54,15872
50
55
  vector_inspector/ui/dialogs/embedding_config_dialog.py,sha256=1K5LBSBXp590BvKwtHx9qgPwGREsn1mJ8cjFGSZHnMA,12926
51
56
  vector_inspector/ui/dialogs/provider_type_dialog.py,sha256=W_FAJuvicwBUJJ7PyvKow9lc8_a5pnE3RIAsh-DVndQ,6809
52
- vector_inspector/ui/main_window.py,sha256=UFWQt-yCTJhdS05bHX5bZfw_Bv4iAw1GavBc-mNaug4,27842
57
+ vector_inspector/ui/main_window.py,sha256=mZfUm29Ur-dfR4pbHXRSaDsQmIHFY1_SfOahHE_o1DI,21493
58
+ vector_inspector/ui/main_window_shell.py,sha256=0o4KxRc4KXu-mJxni9dv74a5DzP4OIvJoLTX7BLqDoo,3425
59
+ vector_inspector/ui/services/__init__.py,sha256=m2DGkhYlcQQGMtNQsup5eKmhCFhOhXHi-g9Hw0GH1vE,55
60
+ vector_inspector/ui/services/dialog_service.py,sha256=1NHWSMvNadcmoh8tgUMSa8N7g8xYDOTaWMr1G8i9e8A,4261
61
+ vector_inspector/ui/tabs.py,sha256=nniOLax93udxFt1t3s-kx1BpguXBEiDUmC1HA9J-scw,2071
53
62
  vector_inspector/ui/views/__init__.py,sha256=FeMtVzSbVFBMjdwLQSQqD0FRW4ieJ4ZKXtTBci2e_bw,30
54
63
  vector_inspector/ui/views/collection_browser.py,sha256=oG9_YGPoVuMs-f_zSd4EcITmEU9caxvwuubsFUrNf-c,3991
55
64
  vector_inspector/ui/views/connection_view.py,sha256=3oGbClqwpVuUD3AIT8TuM-8heDvwMYw7RowHT3b1b8o,23749
56
65
  vector_inspector/ui/views/info_panel.py,sha256=6LwOQFmRdFOcNZo_BcZ8DZ5a5GTdGLwO2IIHqYWNBdQ,26179
57
- vector_inspector/ui/views/metadata_view.py,sha256=WV21oTB8MV1CvMCyQ1T5zEM1OFCoMPEXxV0L-r0d7VE,41771
66
+ vector_inspector/ui/views/metadata_view.py,sha256=75ITKS-DPw1GVUBWI1ppTbADb5Ka4d82wPhM7iFxDGo,45776
58
67
  vector_inspector/ui/views/search_view.py,sha256=LFGmbyVoB04bE6KX-Gt-WYmFrFfnMy808iHWiWVH-gU,12291
59
68
  vector_inspector/ui/views/visualization_view.py,sha256=wgkSkOM-ShOHDj1GCUtKnqH87Io5vYtiOdubGV5rN44,11050
60
69
  vector_inspector/utils/__init__.py,sha256=jhHBQC8C8bfhNlf6CAt07ejjStp_YAyleaYr2dm0Dk0,38
61
70
  vector_inspector/utils/lazy_imports.py,sha256=2XZ3ZnwTvZ5vvrh36nJ_TUjwwkgjoAED6i6P9yctvt0,1211
62
- vector_inspector/utils/version.py,sha256=wFhZKqblnXu2pyXkg9pCOsUhFNOgTxEKS5fQZxXDQYk,121
63
- vector_inspector-0.3.6.dist-info/RECORD,,
71
+ vector_inspector/utils/version.py,sha256=2Xk9DEKlDRGEszNNiYnK7ps1i3OH56H2uZhR0_yZORs,382
72
+ vector_inspector-0.3.8.dist-info/RECORD,,