mcp-code-indexer 4.2.8__py3-none-any.whl → 4.2.10__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 +5 -35
- mcp_code_indexer/vector_mode/daemon.py +11 -31
- {mcp_code_indexer-4.2.8.dist-info → mcp_code_indexer-4.2.10.dist-info}/METADATA +3 -3
- {mcp_code_indexer-4.2.8.dist-info → mcp_code_indexer-4.2.10.dist-info}/RECORD +7 -7
- {mcp_code_indexer-4.2.8.dist-info → mcp_code_indexer-4.2.10.dist-info}/LICENSE +0 -0
- {mcp_code_indexer-4.2.8.dist-info → mcp_code_indexer-4.2.10.dist-info}/WHEEL +0 -0
- {mcp_code_indexer-4.2.8.dist-info → mcp_code_indexer-4.2.10.dist-info}/entry_points.txt +0 -0
mcp_code_indexer/main.py
CHANGED
|
@@ -1095,40 +1095,7 @@ async def main() -> None:
|
|
|
1095
1095
|
if transport:
|
|
1096
1096
|
transport.server = server
|
|
1097
1097
|
|
|
1098
|
-
|
|
1099
|
-
shutdown_event = asyncio.Event()
|
|
1100
|
-
|
|
1101
|
-
def signal_handler(signum):
|
|
1102
|
-
logger.info(f"Received shutdown signal {signum}")
|
|
1103
|
-
shutdown_event.set()
|
|
1104
|
-
|
|
1105
|
-
# Register signal handlers
|
|
1106
|
-
loop = asyncio.get_running_loop()
|
|
1107
|
-
for sig in [signal.SIGTERM, signal.SIGINT]:
|
|
1108
|
-
loop.add_signal_handler(sig, signal_handler, sig)
|
|
1109
|
-
|
|
1110
|
-
# Run server and wait for shutdown signal
|
|
1111
|
-
server_task = asyncio.create_task(server.run())
|
|
1112
|
-
shutdown_task = asyncio.create_task(shutdown_event.wait())
|
|
1113
|
-
|
|
1114
|
-
try:
|
|
1115
|
-
# Wait for either server completion or shutdown signal
|
|
1116
|
-
done, pending = await asyncio.wait(
|
|
1117
|
-
[server_task, shutdown_task],
|
|
1118
|
-
return_when=asyncio.FIRST_COMPLETED
|
|
1119
|
-
)
|
|
1120
|
-
|
|
1121
|
-
# Cancel remaining tasks
|
|
1122
|
-
for task in pending:
|
|
1123
|
-
task.cancel()
|
|
1124
|
-
try:
|
|
1125
|
-
await task
|
|
1126
|
-
except asyncio.CancelledError:
|
|
1127
|
-
pass
|
|
1128
|
-
|
|
1129
|
-
except Exception as e:
|
|
1130
|
-
error_handler.log_error(e, context={"phase": "runtime"})
|
|
1131
|
-
raise
|
|
1098
|
+
await server.run()
|
|
1132
1099
|
|
|
1133
1100
|
except Exception as e:
|
|
1134
1101
|
error_handler.log_error(e, context={"phase": "startup"})
|
|
@@ -1138,10 +1105,13 @@ async def main() -> None:
|
|
|
1138
1105
|
if vector_daemon_task and not vector_daemon_task.done():
|
|
1139
1106
|
logger.info("Cancelling vector daemon")
|
|
1140
1107
|
vector_daemon_task.cancel()
|
|
1108
|
+
|
|
1109
|
+
# Wait for vector daemon to finish
|
|
1110
|
+
if vector_daemon_task:
|
|
1141
1111
|
try:
|
|
1142
1112
|
await vector_daemon_task
|
|
1143
1113
|
except asyncio.CancelledError:
|
|
1144
|
-
|
|
1114
|
+
logger.info("Vector daemon cancelled successfully")
|
|
1145
1115
|
|
|
1146
1116
|
|
|
1147
1117
|
def cli_main() -> None:
|
|
@@ -38,8 +38,6 @@ class VectorDaemon:
|
|
|
38
38
|
self.db_manager = db_manager
|
|
39
39
|
self.cache_dir = cache_dir
|
|
40
40
|
self.is_running = False
|
|
41
|
-
self.shutdown_requested = False
|
|
42
|
-
self.shutdown_event = asyncio.Event()
|
|
43
41
|
|
|
44
42
|
# Process tracking
|
|
45
43
|
self.monitored_projects: Set[str] = set()
|
|
@@ -56,24 +54,7 @@ class VectorDaemon:
|
|
|
56
54
|
"last_activity": time.time(),
|
|
57
55
|
}
|
|
58
56
|
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
def _setup_signal_handlers(self) -> None:
|
|
62
|
-
"""Setup signal handlers for graceful shutdown."""
|
|
63
|
-
try:
|
|
64
|
-
loop = asyncio.get_running_loop()
|
|
65
|
-
for sig in [signal.SIGTERM, signal.SIGINT]:
|
|
66
|
-
loop.add_signal_handler(sig, self._signal_handler, sig)
|
|
67
|
-
if hasattr(signal, 'SIGHUP'):
|
|
68
|
-
loop.add_signal_handler(signal.SIGHUP, self._signal_handler, signal.SIGHUP)
|
|
69
|
-
except Exception as e:
|
|
70
|
-
logger.warning(f"Could not setup signal handlers: {e}")
|
|
71
|
-
|
|
72
|
-
def _signal_handler(self, signum: int) -> None:
|
|
73
|
-
"""Handle shutdown signals."""
|
|
74
|
-
logger.info(f"Received signal {signum}, initiating graceful shutdown")
|
|
75
|
-
self.shutdown_requested = True
|
|
76
|
-
self.shutdown_event.set()
|
|
57
|
+
# Signal handling is delegated to the parent process
|
|
77
58
|
|
|
78
59
|
async def start(self) -> None:
|
|
79
60
|
"""Start the vector daemon."""
|
|
@@ -83,9 +64,6 @@ class VectorDaemon:
|
|
|
83
64
|
|
|
84
65
|
self.is_running = True
|
|
85
66
|
|
|
86
|
-
# Setup signal handlers now that we have an event loop
|
|
87
|
-
self._setup_signal_handlers()
|
|
88
|
-
|
|
89
67
|
logger.info(
|
|
90
68
|
"Starting vector daemon",
|
|
91
69
|
extra={
|
|
@@ -119,19 +97,21 @@ class VectorDaemon:
|
|
|
119
97
|
finally:
|
|
120
98
|
await self._cleanup()
|
|
121
99
|
|
|
122
|
-
async def _notify_shutdown(self) -> None:
|
|
123
|
-
"""Notify shutdown event (called from signal handler)."""
|
|
124
|
-
self.shutdown_event.set()
|
|
125
|
-
|
|
126
100
|
async def _run_until_shutdown(self) -> None:
|
|
127
101
|
"""Run daemon until shutdown is requested."""
|
|
128
|
-
|
|
102
|
+
# Wait indefinitely until task is cancelled by parent process
|
|
103
|
+
try:
|
|
104
|
+
while True:
|
|
105
|
+
await asyncio.sleep(1.0)
|
|
106
|
+
except asyncio.CancelledError:
|
|
107
|
+
logger.info("Vector daemon shutdown requested")
|
|
108
|
+
raise
|
|
129
109
|
|
|
130
110
|
async def _monitor_projects(self) -> None:
|
|
131
111
|
"""Monitor projects for vector indexing requirements."""
|
|
132
112
|
logger.info("Starting project monitoring")
|
|
133
113
|
|
|
134
|
-
while
|
|
114
|
+
while self.is_running:
|
|
135
115
|
try:
|
|
136
116
|
# Get all projects that need vector indexing
|
|
137
117
|
projects = await self.db_manager.get_all_projects()
|
|
@@ -176,7 +156,7 @@ class VectorDaemon:
|
|
|
176
156
|
"""Worker task to process queued items."""
|
|
177
157
|
logger.info(f"Starting worker: {worker_id}")
|
|
178
158
|
|
|
179
|
-
while
|
|
159
|
+
while self.is_running:
|
|
180
160
|
try:
|
|
181
161
|
# Get task from queue with timeout
|
|
182
162
|
try:
|
|
@@ -245,7 +225,7 @@ class VectorDaemon:
|
|
|
245
225
|
|
|
246
226
|
async def _stats_reporter(self) -> None:
|
|
247
227
|
"""Periodically report daemon statistics."""
|
|
248
|
-
while
|
|
228
|
+
while self.is_running:
|
|
249
229
|
try:
|
|
250
230
|
uptime = time.time() - self.stats["start_time"]
|
|
251
231
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mcp-code-indexer
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.10
|
|
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
|
-
[](https://badge.fury.io/py/mcp-code-indexer)
|
|
52
|
+
[](https://pypi.org/project/mcp-code-indexer/)
|
|
53
53
|
[](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=
|
|
22
|
+
mcp_code_indexer/main.py,sha256=KXLHfmPoAE6b5bBkNX2QFjTcw1nRTv_hGxUTp5niINE,37620
|
|
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
|
|
@@ -47,7 +47,7 @@ mcp_code_indexer/vector_mode/chunking/ast_chunker.py,sha256=GTl_6U0nSgDRRzKS07tJ
|
|
|
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=
|
|
50
|
+
mcp_code_indexer/vector_mode/daemon.py,sha256=Hzk4M5prNPWzaTjt_eaPEzyMy2PNK1QjdgQsCukfUf0,12254
|
|
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.
|
|
62
|
-
mcp_code_indexer-4.2.
|
|
63
|
-
mcp_code_indexer-4.2.
|
|
64
|
-
mcp_code_indexer-4.2.
|
|
65
|
-
mcp_code_indexer-4.2.
|
|
61
|
+
mcp_code_indexer-4.2.10.dist-info/LICENSE,sha256=JN9dyPPgYwH9C-UjYM7FLNZjQ6BF7kAzpF3_4PwY4rY,1086
|
|
62
|
+
mcp_code_indexer-4.2.10.dist-info/METADATA,sha256=S1Tv_Wy77wu-9CEpy3xS8G1VfzEhM-Y7SHqO5FY4oGc,27484
|
|
63
|
+
mcp_code_indexer-4.2.10.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
64
|
+
mcp_code_indexer-4.2.10.dist-info/entry_points.txt,sha256=UABj7HZ0mC6rvF22gxaz2LLNLGQShTrFmp5u00iUtvo,67
|
|
65
|
+
mcp_code_indexer-4.2.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|