vector-inspector 0.3.9__tar.gz → 0.3.12__tar.gz

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.
Files changed (91) hide show
  1. vector_inspector-0.3.12/LICENSE +1 -0
  2. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/PKG-INFO +19 -37
  3. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/README.md +16 -34
  4. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/pyproject.toml +72 -3
  5. vector_inspector-0.3.12/src/vector_inspector/__init__.py +12 -0
  6. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connection_manager.py +91 -19
  7. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/base_connection.py +43 -43
  8. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/chroma_connection.py +1 -1
  9. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/pgvector_connection.py +12 -172
  10. vector_inspector-0.3.12/src/vector_inspector/core/connections/pinecone_connection.py +1275 -0
  11. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/qdrant_connection.py +35 -44
  12. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_utils.py +14 -5
  13. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/logging.py +3 -1
  14. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/extensions/__init__.py +6 -0
  15. vector_inspector-0.3.12/src/vector_inspector/extensions/telemetry_settings_panel.py +25 -0
  16. vector_inspector-0.3.12/src/vector_inspector/main.py +68 -0
  17. vector_inspector-0.3.12/src/vector_inspector/services/backup_restore_service.py +418 -0
  18. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/settings_service.py +79 -19
  19. vector_inspector-0.3.12/src/vector_inspector/services/telemetry_service.py +88 -0
  20. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/backup_restore_dialog.py +215 -101
  21. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/connection_manager_panel.py +155 -14
  22. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/dialogs/cross_db_migration.py +126 -99
  23. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/dialogs/settings_dialog.py +13 -6
  24. vector_inspector-0.3.12/src/vector_inspector/ui/loading_screen.py +169 -0
  25. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/main_window.py +44 -19
  26. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/services/dialog_service.py +1 -0
  27. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/collection_browser.py +36 -34
  28. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/connection_view.py +7 -1
  29. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/info_panel.py +118 -52
  30. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/metadata_view.py +30 -31
  31. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/search_view.py +20 -19
  32. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/visualization_view.py +18 -15
  33. vector_inspector-0.3.12/tests/test_backup_restore_service.py +213 -0
  34. vector_inspector-0.3.9/src/vector_inspector/__init__.py +0 -3
  35. vector_inspector-0.3.9/src/vector_inspector/core/connections/pinecone_connection.py +0 -778
  36. vector_inspector-0.3.9/src/vector_inspector/main.py +0 -25
  37. vector_inspector-0.3.9/src/vector_inspector/services/backup_restore_service.py +0 -205
  38. vector_inspector-0.3.9/tests/test_backup_restore_service.py +0 -97
  39. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/__main__.py +0 -0
  40. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/config/__init__.py +0 -0
  41. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/config/known_embedding_models.json +0 -0
  42. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/__init__.py +0 -0
  43. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/cache_manager.py +0 -0
  44. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/__init__.py +0 -0
  45. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/qdrant_helpers/__init__.py +0 -0
  46. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/qdrant_helpers/qdrant_embedding_resolver.py +0 -0
  47. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/qdrant_helpers/qdrant_filter_builder.py +0 -0
  48. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/connections/template_connection.py +0 -0
  49. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_providers/__init__.py +0 -0
  50. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_providers/base_provider.py +0 -0
  51. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_providers/clip_provider.py +0 -0
  52. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_providers/provider_factory.py +0 -0
  53. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/embedding_providers/sentence_transformer_provider.py +0 -0
  54. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/model_registry.py +0 -0
  55. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/core/provider_factory.py +0 -0
  56. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/__init__.py +0 -0
  57. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/backup_helpers.py +0 -0
  58. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/credential_service.py +0 -0
  59. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/filter_service.py +0 -0
  60. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/import_export_service.py +0 -0
  61. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/profile_service.py +0 -0
  62. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/update_service.py +0 -0
  63. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/services/visualization_service.py +0 -0
  64. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/__init__.py +0 -0
  65. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/__init__.py +0 -0
  66. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/filter_builder.py +0 -0
  67. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/item_dialog.py +0 -0
  68. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/loading_dialog.py +0 -0
  69. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/profile_manager_panel.py +0 -0
  70. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/splash_window.py +0 -0
  71. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/components/update_details_dialog.py +0 -0
  72. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/controllers/__init__.py +0 -0
  73. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/controllers/connection_controller.py +0 -0
  74. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/dialogs/__init__.py +0 -0
  75. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/dialogs/embedding_config_dialog.py +0 -0
  76. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/dialogs/provider_type_dialog.py +0 -0
  77. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/main_window_shell.py +0 -0
  78. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/services/__init__.py +0 -0
  79. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/tabs.py +0 -0
  80. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/ui/views/__init__.py +0 -0
  81. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/utils/__init__.py +0 -0
  82. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/utils/lazy_imports.py +0 -0
  83. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/src/vector_inspector/utils/version.py +0 -0
  84. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_backup_helpers.py +0 -0
  85. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_chroma_connection.py +0 -0
  86. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_filter_service.py +0 -0
  87. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_pgvector_connection.py +0 -0
  88. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_pinecone_connection.py +0 -0
  89. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_qdrant_connection.py +0 -0
  90. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_runner.py +0 -0
  91. {vector_inspector-0.3.9 → vector_inspector-0.3.12}/tests/test_settings_service.py +0 -0
@@ -0,0 +1 @@
1
+ All rights reserved. Anthony Dawson
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vector-inspector
3
- Version: 0.3.9
3
+ Version: 0.3.12
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
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://vector-inspector.divinedevops.com
8
8
  Project-URL: Source, https://github.com/anthonypdawson/vector-inspector
9
9
  Project-URL: Issues, https://github.com/anthonypdawson/vector-inspector/issues
10
10
  Project-URL: Documentation, https://github.com/anthonypdawson/vector-inspector#readme
11
- Requires-Python: <3.14,>=3.10
11
+ Requires-Python: >=3.10
12
12
  Requires-Dist: chromadb>=0.4.22
13
13
  Requires-Dist: qdrant-client>=1.7.0
14
14
  Requires-Dist: pyside6>=6.6.0
@@ -26,45 +26,19 @@ Requires-Dist: keyring>=25.7.0
26
26
  Requires-Dist: hf-xet>=1.2.0
27
27
  Requires-Dist: pymilvus>=2.6.6
28
28
  Requires-Dist: lancedb>=0.27.0
29
- Requires-Dist: psycopg2>=2.9.11
29
+ Requires-Dist: psycopg2-binary>=2.9.11
30
30
  Requires-Dist: pgvector>=0.4.2
31
31
  Description-Content-Type: text/markdown
32
32
 
33
33
  # Latest updates
34
34
 
35
- - Major refactor and studio-ready architecture
36
- - Refactored main window into modular components (InspectorShell, ProviderFactory, DialogService, ConnectionController, InspectorTabs)
37
- - MainWindow is reusable as a widget; tab system is pluggable so Studio can extend or override tabs
38
-
39
- - Data browser improvements
40
- - Added Generate embeddings on edit (persisted per user)
41
-
42
- - Settings / Preferences
43
- - SettingsService persists preferences and exposes typed accessors (breadcrumb, search defaults, auto-embed, window geometry)
44
- - SettingsService emits a setting_changed Qt signal so UI reacts immediately
45
- - SettingsDialog (modal) added with add_section API and hook integration for extension panels
46
- - Breadcrumb controls moved out of core so Pro (Vector Studio) injects them via the settings_panel_hook
47
-
48
- - Extension hook for settings panels
49
- - *settings_panel_hook* added to *vector_inspector.extensions*; Vector Studio registers breadcrumb controls at startup
50
-
51
- - Breadcrumb and UI improvements
52
- - Breadcrumb label now elides long trails (left/middle) and shows full trail on hover
53
- - SearchView supports runtime elide-mode changes and responds to settings signals
54
-
55
- - Window geometry persistence
56
- - Main window saves/restores geometry when window.restore_geometry is enabled
57
-
58
- - Pro (Vector Studio) features
59
- - *Search Similar* (Pro): right-click any row in Data Browser or Search Results to run a vector-to-vector similarity search
60
- - *table_context_menu* handler hardened for many embedding/id formats and includes fallbacks
61
- - Vector Studio injects breadcrumb controls into Settings dialog via *settings_panel_hook*
62
-
63
- - Tests and CI
64
- - Added *tests/test_settings_injection.py* to assert settings panel hook registration
65
- - Updated context-menu tests to use *log_info* and *assert* for pytest
66
- - Local test run: 5 tests passed; GUI-heavy suite ~9s due to PySide6 startup
67
-
35
+ ## Pinecone Hosted Model Support Improvements
36
+ - Direct Text Search: Added full support for Pinecone indexes with integrated (hosted) embedding models. You can now perform semantic search using plain text queries—no local embedding required.
37
+ - Accurate Model Detection: The app now detects and displays the hosted model name (e.g., llama-text-embed-v2) in the info panel for Pinecone indexes.
38
+ - Robust Query Handling: The search logic now uses Pinecone’s search() API for hosted models, with correct response parsing and error handling.
39
+ - Future-Proof: Retained the ability to generate embeddings via Pinecone’s inference API for future features or advanced workflows.
40
+ - Improved Error Handling: Added better checks and debug logging for Pinecone API responses.
41
+ - These changes make Pinecone integration seamless and future-ready for both text and vector search scenarios.
68
42
  ---
69
43
 
70
44
  # Vector Inspector
@@ -72,7 +46,7 @@ Description-Content-Type: text/markdown
72
46
  > **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.
73
47
 
74
48
  [![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)
75
- [![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)
49
+ [![Publish](https://github.com/anthonypdawson/vector-inspector/actions/workflows/release-and-publish.yml/badge.svg?branch=master)](https://github.com/anthonypdawson/vector-inspector/actions/workflows/release-and-publish.yml)
76
50
 
77
51
  [![PyPI Version](https://img.shields.io/pypi/v/vector-inspector.svg?cacheSeconds=300)](https://pypi.org/project/vector-inspector/)
78
52
  [![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)
@@ -80,6 +54,14 @@ Description-Content-Type: text/markdown
80
54
 
81
55
  A comprehensive desktop application for visualizing, querying, and managing vector database data. Similar to SQL database viewers, Vector Inspector provides an intuitive GUI for exploring vector embeddings, metadata, and performing similarity searches across multiple vector database providers.
82
56
 
57
+ <p align="center">
58
+ <a href="site/images/demo.gif" target="_blank">
59
+ <img src="site/images/demo.gif" alt="Vector Inspector Demo" width="600"/>
60
+ </a>
61
+ </p>
62
+
63
+ **Quick Demo:** See Vector Inspector in action!
64
+
83
65
  ## Overview
84
66
 
85
67
  Vector Inspector bridges the gap between vector databases and user-friendly data exploration tools. While vector databases are powerful for semantic search and AI applications, they often lack the intuitive inspection and management tools that traditional SQL databases have. This project aims to provide that missing layer.
@@ -1,38 +1,12 @@
1
1
  # Latest updates
2
2
 
3
- - Major refactor and studio-ready architecture
4
- - Refactored main window into modular components (InspectorShell, ProviderFactory, DialogService, ConnectionController, InspectorTabs)
5
- - MainWindow is reusable as a widget; tab system is pluggable so Studio can extend or override tabs
6
-
7
- - Data browser improvements
8
- - Added Generate embeddings on edit (persisted per user)
9
-
10
- - Settings / Preferences
11
- - SettingsService persists preferences and exposes typed accessors (breadcrumb, search defaults, auto-embed, window geometry)
12
- - SettingsService emits a setting_changed Qt signal so UI reacts immediately
13
- - SettingsDialog (modal) added with add_section API and hook integration for extension panels
14
- - Breadcrumb controls moved out of core so Pro (Vector Studio) injects them via the settings_panel_hook
15
-
16
- - Extension hook for settings panels
17
- - *settings_panel_hook* added to *vector_inspector.extensions*; Vector Studio registers breadcrumb controls at startup
18
-
19
- - Breadcrumb and UI improvements
20
- - Breadcrumb label now elides long trails (left/middle) and shows full trail on hover
21
- - SearchView supports runtime elide-mode changes and responds to settings signals
22
-
23
- - Window geometry persistence
24
- - Main window saves/restores geometry when window.restore_geometry is enabled
25
-
26
- - Pro (Vector Studio) features
27
- - *Search Similar* (Pro): right-click any row in Data Browser or Search Results to run a vector-to-vector similarity search
28
- - *table_context_menu* handler hardened for many embedding/id formats and includes fallbacks
29
- - Vector Studio injects breadcrumb controls into Settings dialog via *settings_panel_hook*
30
-
31
- - Tests and CI
32
- - Added *tests/test_settings_injection.py* to assert settings panel hook registration
33
- - Updated context-menu tests to use *log_info* and *assert* for pytest
34
- - Local test run: 5 tests passed; GUI-heavy suite ~9s due to PySide6 startup
35
-
3
+ ## Pinecone Hosted Model Support Improvements
4
+ - Direct Text Search: Added full support for Pinecone indexes with integrated (hosted) embedding models. You can now perform semantic search using plain text queries—no local embedding required.
5
+ - Accurate Model Detection: The app now detects and displays the hosted model name (e.g., llama-text-embed-v2) in the info panel for Pinecone indexes.
6
+ - Robust Query Handling: The search logic now uses Pinecone’s search() API for hosted models, with correct response parsing and error handling.
7
+ - Future-Proof: Retained the ability to generate embeddings via Pinecone’s inference API for future features or advanced workflows.
8
+ - Improved Error Handling: Added better checks and debug logging for Pinecone API responses.
9
+ - These changes make Pinecone integration seamless and future-ready for both text and vector search scenarios.
36
10
  ---
37
11
 
38
12
  # Vector Inspector
@@ -40,7 +14,7 @@
40
14
  > **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.
41
15
 
42
16
  [![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)
43
- [![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)
17
+ [![Publish](https://github.com/anthonypdawson/vector-inspector/actions/workflows/release-and-publish.yml/badge.svg?branch=master)](https://github.com/anthonypdawson/vector-inspector/actions/workflows/release-and-publish.yml)
44
18
 
45
19
  [![PyPI Version](https://img.shields.io/pypi/v/vector-inspector.svg?cacheSeconds=300)](https://pypi.org/project/vector-inspector/)
46
20
  [![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)
@@ -48,6 +22,14 @@
48
22
 
49
23
  A comprehensive desktop application for visualizing, querying, and managing vector database data. Similar to SQL database viewers, Vector Inspector provides an intuitive GUI for exploring vector embeddings, metadata, and performing similarity searches across multiple vector database providers.
50
24
 
25
+ <p align="center">
26
+ <a href="site/images/demo.gif" target="_blank">
27
+ <img src="site/images/demo.gif" alt="Vector Inspector Demo" width="600"/>
28
+ </a>
29
+ </p>
30
+
31
+ **Quick Demo:** See Vector Inspector in action!
32
+
51
33
  ## Overview
52
34
 
53
35
  Vector Inspector bridges the gap between vector databases and user-friendly data exploration tools. While vector databases are powerful for semantic search and AI applications, they often lack the intuitive inspection and management tools that traditional SQL databases have. This project aims to provide that missing layer.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vector-inspector"
3
- version = "0.3.9"
3
+ version = "0.3.12"
4
4
  description = "A comprehensive desktop application for visualizing, querying, and managing vector database data"
5
5
  authors = [
6
6
  { name = "Anthony Dawson", email = "anthonypdawson+github@gmail.com" },
@@ -23,10 +23,10 @@ dependencies = [
23
23
  "hf-xet>=1.2.0",
24
24
  "pymilvus>=2.6.6",
25
25
  "lancedb>=0.27.0",
26
- "psycopg2>=2.9.11",
26
+ "psycopg2-binary>=2.9.11",
27
27
  "pgvector>=0.4.2",
28
28
  ]
29
- requires-python = ">=3.10,<3.14"
29
+ requires-python = ">=3.10"
30
30
  readme = "README.md"
31
31
 
32
32
  [project.license]
@@ -55,6 +55,10 @@ dev = [
55
55
  "ruff>=0.14.14",
56
56
  "mypy>=1.19.1",
57
57
  "ipython>=8.18.0",
58
+ "briefcase>=0.3.26",
59
+ "pyarmor>=9.2.3",
60
+ "bumpver>=2025.1131",
61
+ "pyside6-stubs>=6.7.3.0",
58
62
  ]
59
63
 
60
64
  [tool.ruff]
@@ -92,6 +96,7 @@ select = [
92
96
  ignore = [
93
97
  "E501",
94
98
  "I001",
99
+ "UP045",
95
100
  ]
96
101
 
97
102
  [tool.ruff.lint.isort]
@@ -111,3 +116,67 @@ cmd = "python -m vector_inspector.main"
111
116
 
112
117
  [tool.pdm.scripts.vector-inspector.env]
113
118
  PYTHONPATH = "src"
119
+
120
+ [tool.briefcase]
121
+ project_name = "Vector Inspector"
122
+ bundle = "com.divinedevops.vector-inspector"
123
+ version = "0.3.12"
124
+ url = "https://vector-inspector.divinedevops.com"
125
+ author = "Anthony Dawson"
126
+ author_email = "anthonypdawson+github@gmail.com"
127
+
128
+ [tool.briefcase.license]
129
+ file = "LICENSE"
130
+
131
+ [tool.briefcase.app.vector-inspector]
132
+ formal_name = "Vector Inspector"
133
+ description = "A comprehensive desktop application for visualizing, querying, and managing vector database data"
134
+ long_description = "More details about the app should go here.\n"
135
+ sources = [
136
+ "src/vector_inspector",
137
+ ]
138
+ test_sources = [
139
+ "tests",
140
+ ]
141
+ requires = []
142
+ test_requires = []
143
+
144
+ [tool.briefcase.app.vector-inspector.macOS]
145
+ universal_build = true
146
+ requires = []
147
+
148
+ [tool.briefcase.app.vector-inspector.linux]
149
+ requires = []
150
+
151
+ [tool.briefcase.app.vector-inspector.linux.system.debian]
152
+ system_requires = []
153
+ system_runtime_requires = []
154
+
155
+ [tool.briefcase.app.vector-inspector.linux.system.rhel]
156
+ system_requires = []
157
+ system_runtime_requires = []
158
+
159
+ [tool.briefcase.app.vector-inspector.linux.system.suse]
160
+ system_requires = []
161
+ system_runtime_requires = []
162
+
163
+ [tool.briefcase.app.vector-inspector.linux.system.arch]
164
+ system_requires = []
165
+ system_runtime_requires = []
166
+
167
+ [tool.briefcase.app.vector-inspector.linux.flatpak]
168
+ flatpak_runtime = "org.freedesktop.Platform"
169
+ flatpak_runtime_version = "25.08"
170
+ flatpak_sdk = "org.freedesktop.Sdk"
171
+
172
+ [tool.briefcase.app.vector-inspector.windows]
173
+ requires = []
174
+
175
+ [tool.briefcase.app.vector-inspector.iOS]
176
+ requires = []
177
+
178
+ [tool.briefcase.app.vector-inspector.android]
179
+ requires = []
180
+
181
+ [tool.briefcase.app.vector-inspector.web]
182
+ requires = []
@@ -0,0 +1,12 @@
1
+ """Vector Inspector - A comprehensive desktop application for vector database visualization."""
2
+
3
+ __version__ = "0.3.12" # Keep in sync with pyproject.toml for dev mode fallback
4
+
5
+
6
+ def get_version():
7
+ try:
8
+ from importlib.metadata import version, PackageNotFoundError
9
+
10
+ return version("vector-inspector")
11
+ except Exception:
12
+ return __version__
@@ -1,13 +1,15 @@
1
1
  """Connection manager for handling multiple vector database connections."""
2
2
 
3
3
  import uuid
4
- from typing import Dict, Optional, List, Any
5
4
  from enum import Enum
5
+ from typing import Any
6
+
6
7
  from PySide6.QtCore import QObject, Signal
7
8
 
8
- from .connections.base_connection import VectorDBConnection
9
9
  from vector_inspector.core.logging import log_error
10
10
 
11
+ from .connections.base_connection import VectorDBConnection
12
+
11
13
 
12
14
  class ConnectionState(Enum):
13
15
  """Possible connection states."""
@@ -27,7 +29,7 @@ class ConnectionInstance:
27
29
  name: str,
28
30
  provider: str,
29
31
  connection: VectorDBConnection,
30
- config: Dict[str, Any],
32
+ config: dict[str, Any],
31
33
  ):
32
34
  """
33
35
  Initialize a connection instance.
@@ -42,12 +44,17 @@ class ConnectionInstance:
42
44
  self.id = connection_id
43
45
  self.name = name
44
46
  self.provider = provider
45
- self.connection = connection
47
+ self.database = connection
46
48
  self.config = config
47
49
  self.state = ConnectionState.DISCONNECTED
48
- self.active_collection: Optional[str] = None
49
- self.collections: List[str] = []
50
- self.error_message: Optional[str] = None
50
+ self.active_collection: str | None = None
51
+ self.collections: list[str] = []
52
+ self.error_message: str | None = None
53
+
54
+ # Set profile_name on the underlying connection object so it can be used
55
+ # for settings lookups (embedding models, etc.)
56
+ # Note: This dynamically adds an attribute to the connection object
57
+ self.database.profile_name = name # type: ignore[attr-defined]
51
58
 
52
59
  def get_display_name(self) -> str:
53
60
  """Get a display-friendly connection name."""
@@ -59,6 +66,59 @@ class ConnectionInstance:
59
66
  return f"{self.name} > {self.active_collection}"
60
67
  return self.name
61
68
 
69
+ def __getattr__(self, name):
70
+ """Forward unknown attribute lookups to the underlying database connection.
71
+
72
+ This allows `ConnectionInstance` to act as a thin wrapper while
73
+ exposing the provider-specific API (e.g. `get_all_items`,
74
+ `query_collection`) without callers needing to access
75
+ `.database` explicitly.
76
+ """
77
+ return getattr(self.database, name)
78
+
79
+ # Convenience proxy methods to forward common operations to the underlying
80
+ # VectorDBConnection. This prevents callers from needing to access
81
+ # `instance.database` directly and centralizes error handling.
82
+ def list_collections(self) -> list[str]:
83
+ """Return list of collections from the underlying database connection.
84
+
85
+ Falls back to the cached `collections` attribute on error.
86
+ """
87
+ try:
88
+ return self.database.list_collections()
89
+ except Exception:
90
+ return self.collections or []
91
+
92
+ def connect(self) -> bool:
93
+ """Proxy to connect the underlying database connection."""
94
+ return self.database.connect()
95
+
96
+ def disconnect(self) -> None:
97
+ """Proxy to disconnect the underlying database connection; logs errors."""
98
+ try:
99
+ self.database.disconnect()
100
+ except Exception as e:
101
+ log_error("Error disconnecting underlying database: %s", e)
102
+
103
+ @property
104
+ def is_connected(self) -> bool:
105
+ """Whether the underlying database connection is currently connected."""
106
+ return getattr(self.database, "is_connected", False)
107
+
108
+ def get_collection_info(self, collection_name: str):
109
+ """Proxy to get collection-specific information."""
110
+ try:
111
+ return self.database.get_collection_info(collection_name)
112
+ except Exception:
113
+ return None
114
+
115
+ def delete_collection(self, collection_name: str) -> bool:
116
+ """Proxy to delete a collection on the underlying database connection."""
117
+ try:
118
+ return self.database.delete_collection(collection_name)
119
+ except Exception:
120
+ return False
121
+
62
122
 
63
123
  class ConnectionManager(QObject):
64
124
  """Manages multiple vector database connections and saved profiles.
@@ -85,16 +145,28 @@ class ConnectionManager(QObject):
85
145
  def __init__(self):
86
146
  """Initialize the connection manager."""
87
147
  super().__init__()
88
- self._connections: Dict[str, ConnectionInstance] = {}
89
- self._active_connection_id: Optional[str] = None
148
+ self._connections: dict[str, ConnectionInstance] = {}
149
+ self._active_connection_id: str | None = None
150
+
151
+ def get_active_collection(self) -> str | None:
152
+ """
153
+ Get the active collection name for the currently active connection.
154
+
155
+ Returns:
156
+ The active collection name, or None if no active connection or collection.
157
+ """
158
+ active_conn = self.get_active_connection()
159
+ if active_conn:
160
+ return active_conn.active_collection
161
+ return None
90
162
 
91
163
  def create_connection(
92
164
  self,
93
165
  name: str,
94
166
  provider: str,
95
167
  connection: VectorDBConnection,
96
- config: Dict[str, Any],
97
- connection_id: str = None,
168
+ config: dict[str, Any],
169
+ connection_id: str | None = None,
98
170
  ) -> str:
99
171
  """
100
172
  Create a new connection instance (not yet connected).
@@ -138,17 +210,17 @@ class ConnectionManager(QObject):
138
210
  if connection_id in self._connections:
139
211
  self.connection_opened.emit(connection_id)
140
212
 
141
- def get_connection(self, connection_id: str) -> Optional[ConnectionInstance]:
213
+ def get_connection(self, connection_id: str) -> ConnectionInstance | None:
142
214
  """Get a connection instance by ID."""
143
215
  return self._connections.get(connection_id)
144
216
 
145
- def get_active_connection(self) -> Optional[ConnectionInstance]:
217
+ def get_active_connection(self) -> ConnectionInstance | None:
146
218
  """Get the currently active connection instance."""
147
219
  if self._active_connection_id:
148
220
  return self._connections.get(self._active_connection_id)
149
221
  return None
150
222
 
151
- def get_active_connection_id(self) -> Optional[str]:
223
+ def get_active_connection_id(self) -> str | None:
152
224
  """Get the currently active connection ID."""
153
225
  return self._active_connection_id
154
226
 
@@ -185,7 +257,7 @@ class ConnectionManager(QObject):
185
257
 
186
258
  # Disconnect the connection
187
259
  try:
188
- instance.connection.disconnect()
260
+ instance.disconnect()
189
261
  except Exception as e:
190
262
  log_error("Error disconnecting: %s", e)
191
263
 
@@ -206,7 +278,7 @@ class ConnectionManager(QObject):
206
278
  return True
207
279
 
208
280
  def update_connection_state(
209
- self, connection_id: str, state: ConnectionState, error: Optional[str] = None
281
+ self, connection_id: str, state: ConnectionState, error: str | None = None
210
282
  ):
211
283
  """
212
284
  Update the state of a connection.
@@ -225,7 +297,7 @@ class ConnectionManager(QObject):
225
297
  instance.error_message = None
226
298
  self.connection_state_changed.emit(connection_id, state)
227
299
 
228
- def update_collections(self, connection_id: str, collections: List[str]):
300
+ def update_collections(self, connection_id: str, collections: list[str]):
229
301
  """
230
302
  Update the collections list for a connection.
231
303
 
@@ -238,7 +310,7 @@ class ConnectionManager(QObject):
238
310
  instance.collections = collections
239
311
  self.collections_updated.emit(connection_id, collections)
240
312
 
241
- def set_active_collection(self, connection_id: str, collection_name: Optional[str]):
313
+ def set_active_collection(self, connection_id: str, collection_name: str | None):
242
314
  """
243
315
  Set the active collection for a connection.
244
316
 
@@ -251,7 +323,7 @@ class ConnectionManager(QObject):
251
323
  instance.active_collection = collection_name
252
324
  self.active_collection_changed.emit(connection_id, collection_name)
253
325
 
254
- def get_all_connections(self) -> List[ConnectionInstance]:
326
+ def get_all_connections(self) -> list[ConnectionInstance]:
255
327
  """Get list of all connection instances."""
256
328
  return list(self._connections.values())
257
329