vexor 0.22.0__py3-none-any.whl → 0.23.0rc1__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.
@@ -56,6 +56,7 @@ class SearchRequest:
56
56
  rerank: str = DEFAULT_RERANK
57
57
  flashrank_model: str | None = None
58
58
  remote_rerank: RemoteRerankConfig | None = None
59
+ embedding_dimensions: int | None = None
59
60
 
60
61
 
61
62
  @dataclass(slots=True)
@@ -409,6 +410,7 @@ def perform_search(request: SearchRequest) -> SearchResponse:
409
410
  exclude_patterns=request.exclude_patterns,
410
411
  extensions=request.extensions,
411
412
  no_cache=request.no_cache,
413
+ embedding_dimensions=request.embedding_dimensions,
412
414
  )
413
415
  if result.status == IndexStatus.EMPTY:
414
416
  return SearchResponse(
@@ -493,6 +495,7 @@ def perform_search(request: SearchRequest) -> SearchResponse:
493
495
  exclude_patterns=index_excludes,
494
496
  extensions=index_extensions,
495
497
  no_cache=request.no_cache,
498
+ embedding_dimensions=request.embedding_dimensions,
496
499
  )
497
500
  if result.status == IndexStatus.EMPTY:
498
501
  return SearchResponse(
@@ -570,6 +573,7 @@ def perform_search(request: SearchRequest) -> SearchResponse:
570
573
  base_url=request.base_url,
571
574
  api_key=request.api_key,
572
575
  local_cuda=request.local_cuda,
576
+ embedding_dimensions=request.embedding_dimensions,
573
577
  )
574
578
  query_vector = None
575
579
  query_hash = None
@@ -586,8 +590,10 @@ def perform_search(request: SearchRequest) -> SearchResponse:
586
590
  query_vector = None
587
591
 
588
592
  if query_vector is None and not request.no_cache:
589
- query_text_hash = embedding_cache_key(request.query)
590
- cached = load_embedding_cache(request.model_name, [query_text_hash])
593
+ query_text_hash = embedding_cache_key(request.query, dimension=request.embedding_dimensions)
594
+ cached = load_embedding_cache(
595
+ request.model_name, [query_text_hash], dimension=request.embedding_dimensions
596
+ )
591
597
  query_vector = cached.get(query_text_hash)
592
598
  if query_vector is not None and query_vector.size != file_vectors.shape[1]:
593
599
  query_vector = None
@@ -596,11 +602,12 @@ def perform_search(request: SearchRequest) -> SearchResponse:
596
602
  query_vector = searcher.embed_texts([request.query])[0]
597
603
  if not request.no_cache:
598
604
  if query_text_hash is None:
599
- query_text_hash = embedding_cache_key(request.query)
605
+ query_text_hash = embedding_cache_key(request.query, dimension=request.embedding_dimensions)
600
606
  try:
601
607
  store_embedding_cache(
602
608
  model=request.model_name,
603
609
  embeddings={query_text_hash: query_vector},
610
+ dimension=request.embedding_dimensions,
604
611
  )
605
612
  except Exception: # pragma: no cover - best-effort cache storage
606
613
  pass
@@ -624,6 +631,18 @@ def perform_search(request: SearchRequest) -> SearchResponse:
624
631
  candidate_count = min(len(paths), candidate_limit)
625
632
 
626
633
  query_vector = np.asarray(query_vector, dtype=np.float32).ravel()
634
+
635
+ # Validate dimension compatibility between query and index
636
+ index_dimension = file_vectors.shape[1] if file_vectors.ndim == 2 else 0
637
+ query_dimension = query_vector.shape[0]
638
+ if index_dimension != query_dimension:
639
+ raise ValueError(
640
+ f"Embedding dimension mismatch: index has {index_dimension}-dim vectors, "
641
+ f"but query embedding is {query_dimension}-dim. "
642
+ f"This typically happens when embedding_dimensions was changed after building the index. "
643
+ f"Rebuild the index with: vexor index {request.directory}"
644
+ )
645
+
627
646
  similarities = np.asarray(file_vectors @ query_vector, dtype=np.float32)
628
647
  top_indices = _top_indices(similarities, candidate_count)
629
648
  chunk_meta_by_id: dict[int, dict] = {}
@@ -718,14 +737,17 @@ def search_from_vectors(
718
737
  base_url=request.base_url,
719
738
  api_key=request.api_key,
720
739
  local_cuda=request.local_cuda,
740
+ embedding_dimensions=request.embedding_dimensions,
721
741
  )
722
742
  query_vector = None
723
743
  query_text_hash = None
724
744
  if not request.no_cache:
725
745
  from ..cache import embedding_cache_key, load_embedding_cache, store_embedding_cache
726
746
 
727
- query_text_hash = embedding_cache_key(request.query)
728
- cached = load_embedding_cache(request.model_name, [query_text_hash])
747
+ query_text_hash = embedding_cache_key(request.query, dimension=request.embedding_dimensions)
748
+ cached = load_embedding_cache(
749
+ request.model_name, [query_text_hash], dimension=request.embedding_dimensions
750
+ )
729
751
  query_vector = cached.get(query_text_hash)
730
752
  if query_vector is not None and query_vector.size != file_vectors.shape[1]:
731
753
  query_vector = None
@@ -736,11 +758,12 @@ def search_from_vectors(
736
758
  if query_text_hash is None:
737
759
  from ..cache import embedding_cache_key, store_embedding_cache
738
760
 
739
- query_text_hash = embedding_cache_key(request.query)
761
+ query_text_hash = embedding_cache_key(request.query, dimension=request.embedding_dimensions)
740
762
  try:
741
763
  store_embedding_cache(
742
764
  model=request.model_name,
743
765
  embeddings={query_text_hash: query_vector},
766
+ dimension=request.embedding_dimensions,
744
767
  )
745
768
  except Exception: # pragma: no cover - best-effort cache storage
746
769
  pass
@@ -754,6 +777,18 @@ def search_from_vectors(
754
777
  candidate_count = min(len(paths), candidate_limit)
755
778
 
756
779
  query_vector = np.asarray(query_vector, dtype=np.float32).ravel()
780
+
781
+ # Validate dimension compatibility between query and index
782
+ index_dimension = file_vectors.shape[1] if file_vectors.ndim == 2 else 0
783
+ query_dimension = query_vector.shape[0]
784
+ if index_dimension != query_dimension:
785
+ raise ValueError(
786
+ f"Embedding dimension mismatch: index has {index_dimension}-dim vectors, "
787
+ f"but query embedding is {query_dimension}-dim. "
788
+ f"This typically happens when embedding_dimensions was changed after building the index. "
789
+ f"Rebuild the index with: vexor index {request.directory}"
790
+ )
791
+
757
792
  similarities = np.asarray(file_vectors @ query_vector, dtype=np.float32)
758
793
  top_indices = _top_indices(similarities, candidate_count)
759
794
  chunk_entries = metadata.get("chunks", [])
@@ -827,6 +862,7 @@ def _perform_search_with_temporary_index(request: SearchRequest) -> SearchRespon
827
862
  exclude_patterns=request.exclude_patterns,
828
863
  extensions=request.extensions,
829
864
  no_cache=request.no_cache,
865
+ embedding_dimensions=request.embedding_dimensions,
830
866
  )
831
867
  return search_from_vectors(
832
868
  request,
@@ -863,6 +899,18 @@ def _load_index_vectors_for_request(
863
899
  request.extensions,
864
900
  respect_gitignore=request.respect_gitignore,
865
901
  )
902
+ # Check dimension compatibility when user explicitly requests a specific dimension
903
+ cached_dimension = metadata.get("dimension")
904
+ requested_dimension = request.embedding_dimensions
905
+ if (
906
+ cached_dimension is not None
907
+ and requested_dimension is not None
908
+ and cached_dimension != requested_dimension
909
+ ):
910
+ raise FileNotFoundError(
911
+ f"Cached index has dimension {cached_dimension}, "
912
+ f"but requested {requested_dimension}"
913
+ )
866
914
  return (
867
915
  paths,
868
916
  file_vectors,
@@ -933,6 +981,15 @@ def _select_cache_superset(
933
981
  continue
934
982
  if entry.get("mode") != request.mode:
935
983
  continue
984
+ # Check embedding dimension compatibility when user explicitly requests a specific dimension
985
+ cached_dimension = entry.get("dimension")
986
+ requested_dimension = request.embedding_dimensions
987
+ if (
988
+ cached_dimension is not None
989
+ and requested_dimension is not None
990
+ and cached_dimension != requested_dimension
991
+ ):
992
+ continue
936
993
  cached_excludes = tuple(entry.get("exclude_patterns") or ())
937
994
  cached_exclude_set = set(normalize_exclude_patterns(cached_excludes))
938
995
  if requested_exclude_set:
vexor/text.py CHANGED
@@ -61,7 +61,9 @@ class Messages:
61
61
  HELP_SET_EMBED_CONCURRENCY = "Set the number of concurrent embedding requests."
62
62
  HELP_SET_EXTRACT_CONCURRENCY = "Set the number of concurrent file extraction workers."
63
63
  HELP_SET_EXTRACT_BACKEND = "Set the extraction backend (auto, thread, process)."
64
- HELP_SET_PROVIDER = "Set the default embedding provider (e.g., gemini, openai, custom, or local)."
64
+ HELP_SET_PROVIDER = (
65
+ "Set the default embedding provider (e.g., openai, gemini, voyageai, custom, or local)."
66
+ )
65
67
  HELP_SET_BASE_URL = "Override the provider's base URL (leave unset for official endpoints)."
66
68
  HELP_CLEAR_BASE_URL = "Remove the custom base URL override."
67
69
  HELP_SET_AUTO_INDEX = "Enable/disable automatic indexing before search (default: enabled)."
@@ -90,6 +92,11 @@ class Messages:
90
92
  HELP_LOCAL_CLEANUP = "Delete the local model cache stored under ~/.vexor/models."
91
93
  HELP_LOCAL_CUDA = "Enable CUDA for local embedding (requires onnxruntime-gpu)."
92
94
  HELP_LOCAL_CPU = "Disable CUDA and use CPU for local embedding."
95
+ HELP_SET_EMBEDDING_DIMENSIONS = (
96
+ "Set the embedding dimensions for providers that support it "
97
+ "(e.g., Voyage AI: 256, 512, 1024, 2048; OpenAI text-embedding-3: 256-3072)."
98
+ )
99
+ HELP_CLEAR_EMBEDDING_DIMENSIONS = "Clear the embedding dimensions setting (use model default)."
93
100
 
94
101
  ERROR_API_KEY_MISSING = (
95
102
  "API key is missing or still set to the placeholder. "
@@ -176,13 +183,16 @@ class Messages:
176
183
  INIT_OPTION_PROVIDER_OPENAI_DESC = "default"
177
184
  INIT_OPTION_PROVIDER_GEMINI = "Gemini"
178
185
  INIT_OPTION_PROVIDER_GEMINI_DESC = "Google AI"
186
+ INIT_OPTION_PROVIDER_VOYAGEAI = "Voyage AI"
187
+ INIT_OPTION_PROVIDER_VOYAGEAI_DESC = "embedding API"
179
188
  INIT_OPTION_PROVIDER_CUSTOM = "Custom"
180
189
  INIT_OPTION_PROVIDER_CUSTOM_DESC = "OpenAI-compatible"
181
- INIT_PROMPT_PROVIDER = "Choose A/B/C"
190
+ INIT_PROMPT_PROVIDER = "Choose A/B/C/D"
182
191
  INIT_PROMPT_CUSTOM_BASE_URL = "Custom base URL"
183
192
  INIT_PROMPT_CUSTOM_MODEL = "Custom model name"
184
193
  INIT_PROMPT_API_KEY_OPENAI = "OpenAI API key (leave blank to use environment variables)"
185
194
  INIT_PROMPT_API_KEY_GEMINI = "Gemini API key (leave blank to use environment variables)"
195
+ INIT_PROMPT_API_KEY_VOYAGE = "Voyage API key (leave blank to use environment variables)"
186
196
  INIT_PROMPT_API_KEY_CUSTOM = "API key (leave blank to use environment variables)"
187
197
  INIT_CONFIRM_SKIP_API_KEY = "No API key found. Continue without it?"
188
198
  INIT_USING_ENV_API_KEY = "Using API key from environment."
@@ -293,6 +303,9 @@ class Messages:
293
303
  INFO_LOCAL_SETUP_DONE = "Local model ready: {model}. Provider set to local."
294
304
  INFO_LOCAL_CUDA_ENABLED = "Local embeddings will use CUDA."
295
305
  INFO_LOCAL_CUDA_DISABLED = "Local embeddings will use CPU."
306
+ INFO_EMBEDDING_DIMENSIONS_SET = "Embedding dimensions set to {value}."
307
+ INFO_EMBEDDING_DIMENSIONS_CLEARED = "Embedding dimensions cleared (using model default)."
308
+ ERROR_EMBEDDING_DIMENSIONS_INVALID = "Embedding dimensions must be a positive integer."
296
309
  INFO_FLASHRANK_SETUP_START = "Preparing FlashRank model..."
297
310
  INFO_FLASHRANK_SETUP_DONE = "FlashRank model ready."
298
311
  DOCTOR_LOCAL_CUDA_MISSING = "CUDA provider not available for local embeddings"
@@ -314,6 +327,7 @@ class Messages:
314
327
  "API key set: {api}\n"
315
328
  "Default provider: {provider}\n"
316
329
  "Default model: {model}\n"
330
+ "Embedding dimensions: {embedding_dimensions}\n"
317
331
  "Default batch size: {batch}\n"
318
332
  "Embedding concurrency: {concurrency}\n"
319
333
  "Extract concurrency: {extract_concurrency}\n"
@@ -350,7 +364,7 @@ class Messages:
350
364
  DOCTOR_API_KEY_MISSING = "API key not configured"
351
365
  DOCTOR_API_KEY_MISSING_DETAIL = (
352
366
  "Run `vexor config --set-api-key <KEY>` or set VEXOR_API_KEY / "
353
- "OPENAI_API_KEY / GOOGLE_GENAI_API_KEY environment variable."
367
+ "OPENAI_API_KEY / GOOGLE_GENAI_API_KEY / VOYAGE_API_KEY environment variable."
354
368
  )
355
369
  DOCTOR_API_KEY_NOT_REQUIRED = "Local provider selected (no API key required)"
356
370
  DOCTOR_API_SKIPPED = "Skipped (no API key)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vexor
3
- Version: 0.22.0
3
+ Version: 0.23.0rc1
4
4
  Summary: A vector-powered CLI for semantic search over files.
5
5
  Project-URL: Repository, https://github.com/scarletkc/vexor
6
6
  Author: scarletkc
@@ -22,7 +22,7 @@ Classifier: Topic :: Text Processing :: Indexing
22
22
  Classifier: Topic :: Utilities
23
23
  Requires-Python: >=3.9
24
24
  Requires-Dist: charset-normalizer>=3.3.0
25
- Requires-Dist: google-genai>=0.5.0
25
+ Requires-Dist: google-genai>=1.57.0
26
26
  Requires-Dist: numpy>=1.23.0
27
27
  Requires-Dist: openai>=1.0.0
28
28
  Requires-Dist: pathspec>=0.12.1
@@ -64,6 +64,7 @@ Description-Content-Type: text/markdown
64
64
  [![CI](https://img.shields.io/github/actions/workflow/status/scarletkc/vexor/publish.yml?branch=main)](https://github.com/scarletkc/vexor/actions/workflows/publish.yml)
65
65
  [![Codecov](https://img.shields.io/codecov/c/github/scarletkc/vexor/main)](https://codecov.io/github/scarletkc/vexor)
66
66
  [![License](https://img.shields.io/github/license/scarletkc/vexor.svg)](https://github.com/scarletkc/vexor/blob/main/LICENSE)
67
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/scarletkc/vexor)
67
68
 
68
69
  </div>
69
70
 
@@ -171,12 +172,15 @@ Skill source: [`plugins/vexor/skills/vexor-cli`](https://github.com/scarletkc/ve
171
172
  ## Configuration
172
173
 
173
174
  ```bash
174
- vexor config --set-provider openai # default; also supports gemini/custom/local
175
+ vexor config --set-provider openai # default; also supports gemini/voyageai/custom/local
175
176
  vexor config --set-model text-embedding-3-small
177
+ vexor config --set-provider voyageai # uses voyage defaults when model/base_url are unset
176
178
  vexor config --set-batch-size 0 # 0 = single request
177
179
  vexor config --set-embed-concurrency 4 # parallel embedding requests
178
180
  vexor config --set-extract-concurrency 4 # parallel file extraction workers
179
181
  vexor config --set-extract-backend auto # auto|thread|process (default: auto)
182
+ vexor config --set-embedding-dimensions 1024 # optional, model/provider dependent
183
+ vexor config --clear-embedding-dimensions # reset to model default dimension
180
184
  vexor config --set-auto-index true # auto-index before search (default)
181
185
  vexor config --rerank bm25 # optional BM25 rerank for top-k results
182
186
  vexor config --rerank flashrank # FlashRank rerank (requires optional extra)
@@ -202,7 +206,7 @@ Config stored in `~/.vexor/config.json`.
202
206
  ```bash
203
207
  vexor config --set-api-key "YOUR_KEY"
204
208
  ```
205
- Or via environment: `VEXOR_API_KEY`, `OPENAI_API_KEY`, or `GOOGLE_GENAI_API_KEY`.
209
+ Or via environment: `VEXOR_API_KEY`, `OPENAI_API_KEY`, `GOOGLE_GENAI_API_KEY`, or `VOYAGE_API_KEY`.
206
210
 
207
211
  ### Rerank
208
212
 
@@ -222,11 +226,30 @@ Recommended defaults:
222
226
 
223
227
  ### Providers: Remote vs Local
224
228
 
225
- Vexor supports both remote API providers (`openai`, `gemini`, `custom`) and a local provider (`local`):
229
+ Vexor supports both remote API providers (`openai`, `gemini`, `voyageai`, `custom`) and a local provider (`local`):
226
230
  - Remote providers use `api_key` and optional `base_url`.
231
+ - `voyageai` defaults to `https://api.voyageai.com/v1` when `base_url` is not set.
227
232
  - `custom` is OpenAI-compatible and requires both `model` and `base_url`.
228
233
  - Local provider ignores `api_key/base_url` and only uses `model` plus `local_cuda` (CPU/GPU switch).
229
234
 
235
+ ### Embedding Dimensions
236
+
237
+ Embedding dimensions are optional. If unset, the provider/model default is used.
238
+ Custom dimensions are validated for:
239
+ - OpenAI `text-embedding-3-*`
240
+ - Voyage `voyage-3*` and `voyage-code-3*`
241
+
242
+ ```bash
243
+ vexor config --set-embedding-dimensions 1024
244
+ vexor config --clear-embedding-dimensions
245
+ ```
246
+
247
+ If you change dimensions after an index is built, rebuild the index:
248
+
249
+ ```bash
250
+ vexor index --path .
251
+ ```
252
+
230
253
  ### Local Model (Offline)
231
254
 
232
255
  Install the lightweight local backend:
@@ -1,33 +1,33 @@
1
- vexor/__init__.py,sha256=EQXPbwsXfHJAK3mNlhYfc4UwVqOMqL52cO46xg1GNCo,632
1
+ vexor/__init__.py,sha256=B7BRcp5NDsgB_zUnP_wghH_Orw5RZ-VTRWam3R7It6Q,635
2
2
  vexor/__main__.py,sha256=ZFzom1wCfP6TPXe3aoDFpNcUgjbCZ7Quy_vfzNsH5Fw,426
3
- vexor/api.py,sha256=W6eJLNbg5uBC2gcE8kq34iUciJCYZjY9Zsytxunl-vs,35860
4
- vexor/cache.py,sha256=irCGy5XIcRKX5EFk7plKDVqGHrTjRpaWgXnFDiVChXk,57323
5
- vexor/cli.py,sha256=M9GKdD_mJ068Zpm62znTp0KhhKp1dkh_WHmfJHR9hwU,68094
6
- vexor/config.py,sha256=CEL5u7afZV81Y0i9FVsj8GVzZlb2C2gC17r5lNKu-aM,18570
3
+ vexor/api.py,sha256=VKTTKbp1I82eZ3LT-J6PI9WOoaKSF1cgGIPwq5w2BYE,38137
4
+ vexor/cache.py,sha256=cjnYUWp0sYnlviSRMTopmQlepDEk8_4tlwf7SnwX_ck,58766
5
+ vexor/cli.py,sha256=PCUIY4LF-xiifuH9D82CuLLq9tNs9uRNfAgcSap2gLw,70895
6
+ vexor/config.py,sha256=DiXZiUsZ1hidIQ5LI-2Fik6qpGRmK6Eh7h0DugT6oCM,24303
7
7
  vexor/modes.py,sha256=N_wAWoqbxmCfko-v520p59tpAYvUwraCSSQRtMaF4ac,11549
8
8
  vexor/output.py,sha256=iooZgLlK8dh7ajJ4XMHUNNx0qyTVtD_OAAwrBx5MeqE,864
9
- vexor/search.py,sha256=MSU4RmH6waFYOofkIdo8_ElTiz1oNaKuvr-3umif7Bs,6826
10
- vexor/text.py,sha256=2aK5nJHkosmbmyzp9o_Tzb3YlmVnju_IX8BcEPUdhTA,24794
9
+ vexor/search.py,sha256=fWzbTcRhWGaMkOwjWMGUUSoJLTvMm6472Yhij-VWeZE,7593
10
+ vexor/text.py,sha256=VM7CQH8f1tqn_N19l4ycjAekVMxi002Y5Qsfp3EcDD0,25655
11
11
  vexor/utils.py,sha256=GzfYW2rz1-EuJjkevqZVe8flLRtrQ60OWMmFNbMh62k,12472
12
12
  vexor/providers/__init__.py,sha256=kCEoV03TSLKcxDUYVNjXnrVoLU5NpfNXjp1w1Ak2imE,92
13
13
  vexor/providers/gemini.py,sha256=IWHHjCMJC0hUHQPhuaJ_L_97c_mnOXkPkCVdrIR6z-g,5705
14
14
  vexor/providers/local.py,sha256=5X_WYCXgyBGIVvvVLgMnDjTkPR4GBF0ksNPyviBlB7w,4838
15
- vexor/providers/openai.py,sha256=YnJDY9gJW7RfGGdkgswVHvmOKNvgLRQUsbpA1MUuLPg,5356
15
+ vexor/providers/openai.py,sha256=uGI2qYc8BixxL58s6yQHr7OuocBhpLG4m93C4Y2JYYg,5994
16
16
  vexor/services/__init__.py,sha256=dA_i2N03vlYmbZbEK2knzJLWviunkNWbzN2LWPNvMk0,160
17
17
  vexor/services/cache_service.py,sha256=ywt6AgupCJ7_wC3je4znCMw5_VBouw3skbDTAt8xw6o,1639
18
- vexor/services/config_service.py,sha256=PojolfbSKh9pW8slF4qxCOs9hz5L6xvjf_nB7vfVlsU,5039
18
+ vexor/services/config_service.py,sha256=uU-jd-H18GW6R0-AJSoCXFYJ1vRqf28YzwZRjn1-S9E,6159
19
19
  vexor/services/content_extract_service.py,sha256=oO7Hbadwp3uiyqCbr_4MRXQsUeMix2D98i-Yp94PwFk,26495
20
- vexor/services/index_service.py,sha256=FXf1bBoqj4-K1l38ItxHf6Oh7QHVIdNAdVY2kg_Zoq8,32265
21
- vexor/services/init_service.py,sha256=3D04hylGA9FRQhLHCfR95nMko3vb5MNBcRb9nWWaUE8,26863
20
+ vexor/services/index_service.py,sha256=iyIP8ZcqjwjPbQOcGiJLYTFMIsX1CxswhHC9v6c-W00,34940
21
+ vexor/services/init_service.py,sha256=9foGfQqLK-iomEjH820yMue3AQeveLJzQtaQA4nvYRo,27217
22
22
  vexor/services/js_parser.py,sha256=eRtW6KlK4JBYDGbyoecHVqLZ0hcx-Cc0kx6bOujHPAQ,16254
23
23
  vexor/services/keyword_service.py,sha256=vmke8tII9kTwRDdBaLHBc6Hpy_B3p98L65iGkCQgtMU,2211
24
- vexor/services/search_service.py,sha256=-7qHfebMOmXWiVBVYoBji6eaZr8OOY3q1vbtJaY3I6E,39076
24
+ vexor/services/search_service.py,sha256=HsN0QpGc7yWIj-xbuQjwUZp8PbQKGgR4_0aJTI_tsR0,41948
25
25
  vexor/services/skill_service.py,sha256=Rrgt3OMsKPPiXOiRhSNAWjBM9UNz9qmSWQe3uYGzq4M,4863
26
26
  vexor/services/system_service.py,sha256=KPlv83v3rTvBiNiH7vrp6tDmt_AqHxuUd-5RI0TfvWs,24638
27
27
  vexor/_bundled_skills/vexor-cli/SKILL.md,sha256=m3FlyqgHBdRwyGPEp8PrUS21K0G2jEl88tRvhSPta08,2798
28
28
  vexor/_bundled_skills/vexor-cli/references/install-vexor.md,sha256=IUBShLI1mAxugwUIMAJQ5_j6KcaPWfobe0gSd6MWU7w,1245
29
- vexor-0.22.0.dist-info/METADATA,sha256=UAqD6ciQCaP3eBrOGA3unO_XLX0eArcYHfcXuRhjN8c,14154
30
- vexor-0.22.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
31
- vexor-0.22.0.dist-info/entry_points.txt,sha256=dvxp6Q1R1d6bozR7TwmpdJ0X_v83MkzsLPagGY_lfr0,40
32
- vexor-0.22.0.dist-info/licenses/LICENSE,sha256=wP7TAKRll1t9LoYGxWS9NikPM_0hCc00LmlLyvQBsL8,1066
33
- vexor-0.22.0.dist-info/RECORD,,
29
+ vexor-0.23.0rc1.dist-info/METADATA,sha256=HRGdeudEBPih9In7KEm-kWCJNDOUcq_cmZOZlXsnTGc,15048
30
+ vexor-0.23.0rc1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
31
+ vexor-0.23.0rc1.dist-info/entry_points.txt,sha256=dvxp6Q1R1d6bozR7TwmpdJ0X_v83MkzsLPagGY_lfr0,40
32
+ vexor-0.23.0rc1.dist-info/licenses/LICENSE,sha256=wP7TAKRll1t9LoYGxWS9NikPM_0hCc00LmlLyvQBsL8,1066
33
+ vexor-0.23.0rc1.dist-info/RECORD,,