mcp-code-indexer 4.2.5__py3-none-any.whl → 4.2.7__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.
mcp_code_indexer/main.py CHANGED
@@ -1099,6 +1099,15 @@ async def main() -> None:
1099
1099
  except Exception as e:
1100
1100
  error_handler.log_error(e, context={"phase": "startup"})
1101
1101
  raise
1102
+ finally:
1103
+ # Clean up vector daemon if it was started
1104
+ if vector_daemon_task and not vector_daemon_task.done():
1105
+ logger.info("Cancelling vector daemon")
1106
+ vector_daemon_task.cancel()
1107
+ try:
1108
+ await vector_daemon_task
1109
+ except asyncio.CancelledError:
1110
+ pass
1102
1111
 
1103
1112
 
1104
1113
  def cli_main() -> None:
@@ -18,9 +18,10 @@ def is_vector_mode_available() -> bool:
18
18
  import turbopuffer
19
19
  import tree_sitter
20
20
  import watchdog
21
+ # PyYAML package provides yaml module
21
22
  import yaml
22
23
  return True
23
- except ImportError:
24
+ except ImportError as e:
24
25
  return False
25
26
 
26
27
  def get_vector_config_path() -> Path:
@@ -39,6 +39,7 @@ class VectorDaemon:
39
39
  self.cache_dir = cache_dir
40
40
  self.is_running = False
41
41
  self.shutdown_requested = False
42
+ self.shutdown_event = asyncio.Event()
42
43
 
43
44
  # Process tracking
44
45
  self.monitored_projects: Set[str] = set()
@@ -55,23 +56,24 @@ class VectorDaemon:
55
56
  "last_activity": time.time(),
56
57
  }
57
58
 
58
- # Setup signal handlers
59
- self._setup_signal_handlers()
59
+ # Setup signal handlers will be done in start() method to access event loop
60
60
 
61
61
  def _setup_signal_handlers(self) -> None:
62
62
  """Setup signal handlers for graceful shutdown."""
63
63
  try:
64
- signal.signal(signal.SIGTERM, self._signal_handler)
65
- signal.signal(signal.SIGINT, self._signal_handler)
64
+ loop = asyncio.get_running_loop()
65
+ for sig in [signal.SIGTERM, signal.SIGINT]:
66
+ loop.add_signal_handler(sig, self._signal_handler, sig)
66
67
  if hasattr(signal, 'SIGHUP'):
67
- signal.signal(signal.SIGHUP, self._signal_handler)
68
+ loop.add_signal_handler(signal.SIGHUP, self._signal_handler, signal.SIGHUP)
68
69
  except Exception as e:
69
70
  logger.warning(f"Could not setup signal handlers: {e}")
70
71
 
71
- def _signal_handler(self, signum: int, frame) -> None:
72
+ def _signal_handler(self, signum: int) -> None:
72
73
  """Handle shutdown signals."""
73
74
  logger.info(f"Received signal {signum}, initiating graceful shutdown")
74
75
  self.shutdown_requested = True
76
+ self.shutdown_event.set()
75
77
 
76
78
  async def start(self) -> None:
77
79
  """Start the vector daemon."""
@@ -80,6 +82,10 @@ class VectorDaemon:
80
82
  return
81
83
 
82
84
  self.is_running = True
85
+
86
+ # Setup signal handlers now that we have an event loop
87
+ self._setup_signal_handlers()
88
+
83
89
  logger.info(
84
90
  "Starting vector daemon",
85
91
  extra={
@@ -113,13 +119,13 @@ class VectorDaemon:
113
119
  finally:
114
120
  await self._cleanup()
115
121
 
122
+ async def _notify_shutdown(self) -> None:
123
+ """Notify shutdown event (called from signal handler)."""
124
+ self.shutdown_event.set()
125
+
116
126
  async def _run_until_shutdown(self) -> None:
117
127
  """Run daemon until shutdown is requested."""
118
- while not self.shutdown_requested:
119
- try:
120
- await asyncio.sleep(1.0)
121
- except asyncio.CancelledError:
122
- break
128
+ await self.shutdown_event.wait()
123
129
 
124
130
  async def _monitor_projects(self) -> None:
125
131
  """Monitor projects for vector indexing requirements."""
@@ -346,6 +352,7 @@ def main() -> None:
346
352
  asyncio.run(start_vector_daemon(args.config, args.db_path, args.cache_dir))
347
353
  except KeyboardInterrupt:
348
354
  logger.info("Daemon interrupted by user")
355
+ sys.exit(0)
349
356
  except Exception as e:
350
357
  logger.error(f"Daemon failed: {e}", exc_info=True)
351
358
  sys.exit(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mcp-code-indexer
3
- Version: 4.2.5
3
+ Version: 4.2.7
4
4
  Summary: MCP server that tracks file descriptions across codebases, enabling AI agents to efficiently navigate and understand code through searchable summaries and token-aware overviews.
5
5
  License: MIT
6
6
  Keywords: mcp,model-context-protocol,code-indexer,ai-tools,codebase-navigation,file-descriptions,llm-tools
@@ -48,8 +48,8 @@ Description-Content-Type: text/markdown
48
48
 
49
49
  # MCP Code Indexer 🚀
50
50
 
51
- [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?52)](https://badge.fury.io/py/mcp-code-indexer)
52
- [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?52)](https://pypi.org/project/mcp-code-indexer/)
51
+ [![PyPI version](https://badge.fury.io/py/mcp-code-indexer.svg?54)](https://badge.fury.io/py/mcp-code-indexer)
52
+ [![Python](https://img.shields.io/pypi/pyversions/mcp-code-indexer.svg?54)](https://pypi.org/project/mcp-code-indexer/)
53
53
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
54
54
 
55
55
  A production-ready **Model Context Protocol (MCP) server** that revolutionizes how AI agents navigate and understand codebases. Built for high-concurrency environments with advanced database resilience, the server provides instant access to intelligent descriptions, semantic search, and context-aware recommendations while maintaining 800+ writes/sec throughput.
@@ -19,7 +19,7 @@ mcp_code_indexer/error_handler.py,sha256=ylciEM-cR7E8Gmd8cfh5olcllJm0FnaYBGH86ya
19
19
  mcp_code_indexer/file_scanner.py,sha256=7Ab34lRQGeh5GBCzcSP96p4YK6LDWFGUHLXqi499UZ4,11838
20
20
  mcp_code_indexer/git_hook_handler.py,sha256=sTtZV3-Yy1Evt06R5NZclELeepM4Ia9OQoR2O6BK3Hk,45517
21
21
  mcp_code_indexer/logging_config.py,sha256=M5eVZ5PwfTROib7ISTQ522n2hUSc4hJ_wUgsrJKsTTg,10030
22
- mcp_code_indexer/main.py,sha256=tII1x_LHmD1T951-L1lTzXkR9Vz0z8_pNs-mznfj1CY,37133
22
+ mcp_code_indexer/main.py,sha256=4iNq7p9u9R2Zjj0REeSAZDxvXOhFdbCI0vtHYdrrTeQ,37476
23
23
  mcp_code_indexer/middleware/__init__.py,sha256=UCEPzOlZldlqFzYEfrXw1HvCDvY1jpLvyaDGUzVr2aw,368
24
24
  mcp_code_indexer/middleware/auth.py,sha256=4HkHMDZBNsyPA1VE8qF7pRNKbqG4xIDZjllENbgynxI,7258
25
25
  mcp_code_indexer/middleware/error_middleware.py,sha256=0RnKM5fK_n_7AITK2ueAqv30kLBdjU3vaWOTwWd2Xs0,11965
@@ -41,13 +41,13 @@ mcp_code_indexer/transport/__init__.py,sha256=OrdabRjO3EChnTZ06IIFxO6imRQ3PwtRtJ
41
41
  mcp_code_indexer/transport/base.py,sha256=Lb3IrL8wr1QvUQpx1GyBQW5bvDpJoUFyXWNAw0dbOK4,3258
42
42
  mcp_code_indexer/transport/http_transport.py,sha256=iDxW8CXEIPlpyOtSFkU1qw1FtbKbXgCvJXfVtlXbzIo,13291
43
43
  mcp_code_indexer/transport/stdio_transport.py,sha256=a-Pu3usx_NwkHsN2VU8Qe0EwcA7PGL54Gbu2Ee8e0lU,4792
44
- mcp_code_indexer/vector_mode/__init__.py,sha256=SwCTBPazMHshPPjSTHVGjyVG2mKPTuGP_G1ifVzt6ds,1086
44
+ mcp_code_indexer/vector_mode/__init__.py,sha256=B6FwxtXOFR8CWZQRc40gHnLRrwmWRvpKcOQ8DU9qLrI,1137
45
45
  mcp_code_indexer/vector_mode/chunking/__init__.py,sha256=rjjFMbHsqWIBzL4IajYxXXJud_RvBrpFNjVcxnRIWCE,490
46
46
  mcp_code_indexer/vector_mode/chunking/ast_chunker.py,sha256=GTl_6U0nSgDRRzKS07tJ7RMX8AmJvvY_IsRn95hvVfA,14623
47
47
  mcp_code_indexer/vector_mode/chunking/chunk_optimizer.py,sha256=xD0zEibjt6FLBFaKHNc63-iKTtCgnOlLL_9Hc8mCrzE,19752
48
48
  mcp_code_indexer/vector_mode/chunking/language_handlers.py,sha256=YEpTVjzyJH445OjniGV05apexsfG5KVR4lwBEl4mGJc,18189
49
49
  mcp_code_indexer/vector_mode/config.py,sha256=g5p9Q4EAR20DfLv4RxaQnk3_UdysuvWS8rcsjs1vgwI,6680
50
- mcp_code_indexer/vector_mode/daemon.py,sha256=g8nob8rVpNkfo3ddKhXIwXjmY6DLSiOEPM0pZlcBQDk,12894
50
+ mcp_code_indexer/vector_mode/daemon.py,sha256=fw1gJ6_R3vCt41-uv3M8UVoHv5qHmC3PwGaFBY41Uvk,13218
51
51
  mcp_code_indexer/vector_mode/monitoring/__init__.py,sha256=9rNWCvHxRMvYumdIrPjb5K9fpOwe1Aem24hdh8gXoDM,439
52
52
  mcp_code_indexer/vector_mode/monitoring/change_detector.py,sha256=X82e_sKbJJFPhqZFJubLQb8Rs-srRtS7sh0nUOsPCPw,10338
53
53
  mcp_code_indexer/vector_mode/monitoring/file_watcher.py,sha256=AQ6YHSKXPubtprLZngeLb0othJOCNQZ7wwXUvqwphT4,15299
@@ -58,8 +58,8 @@ mcp_code_indexer/vector_mode/providers/voyage_client.py,sha256=pfm9BOx5Temf0LM-V
58
58
  mcp_code_indexer/vector_mode/security/__init__.py,sha256=itfeuysSqV-m9xuo-CMkAoucxexVfPgeOU-ieTLvdls,336
59
59
  mcp_code_indexer/vector_mode/security/patterns.py,sha256=0xaiMnZm7YXswq3hVe_DJYePE9MhWuvizApLnmXus9M,11572
60
60
  mcp_code_indexer/vector_mode/security/redactor.py,sha256=tsFzhCJ99bp4EFqQVjZ-4f8Uf3ux9X4ODVR09oJG01U,13380
61
- mcp_code_indexer-4.2.5.dist-info/LICENSE,sha256=JN9dyPPgYwH9C-UjYM7FLNZjQ6BF7kAzpF3_4PwY4rY,1086
62
- mcp_code_indexer-4.2.5.dist-info/METADATA,sha256=XsQxIOZisC9XqRt-WyNtRBvvE0CXSvTPdOvYaGBP36w,27483
63
- mcp_code_indexer-4.2.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
64
- mcp_code_indexer-4.2.5.dist-info/entry_points.txt,sha256=UABj7HZ0mC6rvF22gxaz2LLNLGQShTrFmp5u00iUtvo,67
65
- mcp_code_indexer-4.2.5.dist-info/RECORD,,
61
+ mcp_code_indexer-4.2.7.dist-info/LICENSE,sha256=JN9dyPPgYwH9C-UjYM7FLNZjQ6BF7kAzpF3_4PwY4rY,1086
62
+ mcp_code_indexer-4.2.7.dist-info/METADATA,sha256=RqloSDCd5WEtRZ5EsIrOP8KwkFah90vWsRNRDoZKrrc,27483
63
+ mcp_code_indexer-4.2.7.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
64
+ mcp_code_indexer-4.2.7.dist-info/entry_points.txt,sha256=UABj7HZ0mC6rvF22gxaz2LLNLGQShTrFmp5u00iUtvo,67
65
+ mcp_code_indexer-4.2.7.dist-info/RECORD,,