hanzo-mcp 0.8.6__py3-none-any.whl → 0.8.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.
Potentially problematic release.
This version of hanzo-mcp might be problematic. Click here for more details.
- hanzo_mcp/analytics/posthog_analytics.py +8 -1
- hanzo_mcp/config/tool_config.py +1 -1
- hanzo_mcp/tools/__init__.py +13 -1
- hanzo_mcp/tools/agent/agent_tool.py +2 -1
- hanzo_mcp/tools/agent/agent_tool_v1_deprecated.py +1 -1
- hanzo_mcp/tools/agent/swarm_tool.py +12 -7
- hanzo_mcp/tools/common/stats.py +1 -1
- hanzo_mcp/tools/mcp/mcp_add.py +2 -2
- hanzo_mcp/tools/mcp/mcp_remove.py +1 -1
- hanzo_mcp/tools/search/unified_search.py +3 -3
- hanzo_mcp/tools/vector/infinity_store.py +3 -4
- {hanzo_mcp-0.8.6.dist-info → hanzo_mcp-0.8.8.dist-info}/METADATA +1 -1
- {hanzo_mcp-0.8.6.dist-info → hanzo_mcp-0.8.8.dist-info}/RECORD +16 -17
- hanzo_mcp/tools/vector/mock_infinity.py +0 -161
- {hanzo_mcp-0.8.6.dist-info → hanzo_mcp-0.8.8.dist-info}/WHEEL +0 -0
- {hanzo_mcp-0.8.6.dist-info → hanzo_mcp-0.8.8.dist-info}/entry_points.txt +0 -0
- {hanzo_mcp-0.8.6.dist-info → hanzo_mcp-0.8.8.dist-info}/top_level.txt +0 -0
|
@@ -16,6 +16,7 @@ import traceback
|
|
|
16
16
|
from typing import Any, Dict, TypeVar, Callable, Optional
|
|
17
17
|
from datetime import datetime
|
|
18
18
|
from dataclasses import dataclass
|
|
19
|
+
from importlib.metadata import version, PackageNotFoundError
|
|
19
20
|
|
|
20
21
|
# Try to import PostHog, but make it optional
|
|
21
22
|
try:
|
|
@@ -26,6 +27,12 @@ except ImportError:
|
|
|
26
27
|
POSTHOG_AVAILABLE = False
|
|
27
28
|
Posthog = None
|
|
28
29
|
|
|
30
|
+
# Get package version
|
|
31
|
+
try:
|
|
32
|
+
MCP_VERSION = version("hanzo-mcp")
|
|
33
|
+
except PackageNotFoundError:
|
|
34
|
+
MCP_VERSION = "0.8.7" # Fallback version
|
|
35
|
+
|
|
29
36
|
|
|
30
37
|
F = TypeVar("F", bound=Callable[..., Any])
|
|
31
38
|
|
|
@@ -98,7 +105,7 @@ class Analytics:
|
|
|
98
105
|
"timestamp": datetime.utcnow().isoformat(),
|
|
99
106
|
"platform": platform.system(),
|
|
100
107
|
"python_version": platform.python_version(),
|
|
101
|
-
"mcp_version":
|
|
108
|
+
"mcp_version": MCP_VERSION,
|
|
102
109
|
**(properties or {}),
|
|
103
110
|
}
|
|
104
111
|
|
hanzo_mcp/config/tool_config.py
CHANGED
|
@@ -105,7 +105,7 @@ TOOL_REGISTRY: Dict[str, ToolConfig] = {
|
|
|
105
105
|
description="Edit Jupyter notebook cells (replace, insert, delete)",
|
|
106
106
|
cli_flag="--disable-notebook-edit",
|
|
107
107
|
),
|
|
108
|
-
#
|
|
108
|
+
# Task Management Tools (2)
|
|
109
109
|
"todo_read": ToolConfig(
|
|
110
110
|
name="todo_read",
|
|
111
111
|
category=ToolCategory.TODO,
|
hanzo_mcp/tools/__init__.py
CHANGED
|
@@ -64,7 +64,19 @@ try: # pragma: no cover
|
|
|
64
64
|
register_memory_tools = None # type: ignore
|
|
65
65
|
except Exception:
|
|
66
66
|
# Minimal surface to allow submodule imports elsewhere
|
|
67
|
-
|
|
67
|
+
# Define fallback functions for required imports
|
|
68
|
+
def activate_mode_from_env():
|
|
69
|
+
"""Fallback: No mode activation when imports fail."""
|
|
70
|
+
return None
|
|
71
|
+
class ModeLoader:
|
|
72
|
+
@staticmethod
|
|
73
|
+
def get_enabled_tools_from_mode(base_enabled_tools=None, force_mode=None):
|
|
74
|
+
"""Fallback: Return base tools when imports fail."""
|
|
75
|
+
return base_enabled_tools or {}
|
|
76
|
+
@staticmethod
|
|
77
|
+
def apply_environment_from_mode():
|
|
78
|
+
"""Fallback: No environment changes when imports fail."""
|
|
79
|
+
return None
|
|
68
80
|
|
|
69
81
|
# Try to import LSP tool
|
|
70
82
|
try:
|
|
@@ -96,7 +96,7 @@ class AgentTool(AgentClarificationMixin, BaseTool):
|
|
|
96
96
|
Returns:
|
|
97
97
|
Tool description
|
|
98
98
|
"""
|
|
99
|
-
#
|
|
99
|
+
# Glob is now implemented via find_files tool
|
|
100
100
|
at = [t.name for t in self.available_tools]
|
|
101
101
|
|
|
102
102
|
return f"""Launch a new agent that has access to the following tools: {at}. When you are searching for a keyword or file and are not confident that you will find the right match in the first few tries, use the Agent tool to perform the search for you.
|
|
@@ -96,12 +96,14 @@ except ImportError:
|
|
|
96
96
|
# Try core module import
|
|
97
97
|
from hanzo_agents.core.memory import create_memory_kv, create_memory_vector
|
|
98
98
|
except ImportError:
|
|
99
|
-
# Define
|
|
99
|
+
# Define fallback functions if not available
|
|
100
100
|
def create_memory_kv(*args, **kwargs):
|
|
101
|
-
|
|
101
|
+
"""Fallback: Key-value memory not available."""
|
|
102
|
+
return {}
|
|
102
103
|
|
|
103
104
|
def create_memory_vector(*args, **kwargs):
|
|
104
|
-
|
|
105
|
+
"""Fallback: Vector memory not available."""
|
|
106
|
+
return {}
|
|
105
107
|
|
|
106
108
|
|
|
107
109
|
try:
|
|
@@ -115,15 +117,18 @@ except ImportError:
|
|
|
115
117
|
state_based_router,
|
|
116
118
|
)
|
|
117
119
|
except ImportError:
|
|
118
|
-
# Define
|
|
120
|
+
# Define fallback functions if not available
|
|
119
121
|
def sequential_router(*args, **kwargs):
|
|
120
|
-
|
|
122
|
+
"""Fallback: Sequential router not available."""
|
|
123
|
+
return lambda agents, task: None
|
|
121
124
|
|
|
122
125
|
def conditional_router(*args, **kwargs):
|
|
123
|
-
|
|
126
|
+
"""Fallback: Conditional router not available."""
|
|
127
|
+
return lambda agents, task: None
|
|
124
128
|
|
|
125
129
|
def state_based_router(*args, **kwargs):
|
|
126
|
-
|
|
130
|
+
"""Fallback: State-based router not available."""
|
|
131
|
+
return lambda agents, task: None
|
|
127
132
|
|
|
128
133
|
|
|
129
134
|
try:
|
hanzo_mcp/tools/common/stats.py
CHANGED
|
@@ -236,7 +236,7 @@ Example:
|
|
|
236
236
|
output.append(f"Config Files: {config_count}")
|
|
237
237
|
|
|
238
238
|
# Tool status (if available)
|
|
239
|
-
#
|
|
239
|
+
# Tool usage statistics can be tracked via analytics
|
|
240
240
|
output.append("\nTool Categories:")
|
|
241
241
|
output.append(" - File Operations: grep, find_files, read, write, edit")
|
|
242
242
|
output.append(" - Shell: bash, run_background, processes, pkill")
|
hanzo_mcp/tools/mcp/mcp_add.py
CHANGED
|
@@ -221,8 +221,8 @@ Use 'mcp_stats' to see all added servers and their status.
|
|
|
221
221
|
if not shutil.which("uvx"):
|
|
222
222
|
return "Error: uvx not found. Install uv first."
|
|
223
223
|
|
|
224
|
-
#
|
|
225
|
-
#
|
|
224
|
+
# MCP server connection handled by runtime
|
|
225
|
+
# Store configuration for runtime to use
|
|
226
226
|
server_config["status"] = "ready"
|
|
227
227
|
|
|
228
228
|
except Exception as e:
|
|
@@ -103,7 +103,7 @@ Use 'mcp_stats' to see all servers before removing.
|
|
|
103
103
|
if not force:
|
|
104
104
|
return f"Error: Server '{name}' is currently running. Use --force to remove anyway."
|
|
105
105
|
else:
|
|
106
|
-
#
|
|
106
|
+
# Server process stopping handled by MCP runtime
|
|
107
107
|
await tool_ctx.info(f"Stopping running server '{name}'")
|
|
108
108
|
|
|
109
109
|
# Remove from registry
|
|
@@ -93,7 +93,7 @@ class UnifiedSearch(BaseTool):
|
|
|
93
93
|
|
|
94
94
|
1. Find code patterns:
|
|
95
95
|
search("error handling") # Finds all error handling code
|
|
96
|
-
search("
|
|
96
|
+
search("TASK|FIX") # Regex search for task markers
|
|
97
97
|
search("async function") # Find async functions
|
|
98
98
|
|
|
99
99
|
2. Find symbols/definitions:
|
|
@@ -963,8 +963,8 @@ class CodeIndexer:
|
|
|
963
963
|
self, content: str, file_path: Path
|
|
964
964
|
) -> List[Dict[str, Any]]:
|
|
965
965
|
"""Split code into meaningful chunks."""
|
|
966
|
-
#
|
|
967
|
-
#
|
|
966
|
+
# Using line-based splitting for compatibility with all file types
|
|
967
|
+
# AST parsing would only work for specific languages
|
|
968
968
|
chunks = []
|
|
969
969
|
lines = content.split("\n")
|
|
970
970
|
|
|
@@ -11,10 +11,9 @@ try:
|
|
|
11
11
|
|
|
12
12
|
INFINITY_AVAILABLE = True
|
|
13
13
|
except ImportError:
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
INFINITY_AVAILABLE = True # Mock is always available
|
|
14
|
+
# infinity_embedded not available, functionality will be limited
|
|
15
|
+
INFINITY_AVAILABLE = False
|
|
16
|
+
infinity_embedded = None # type: ignore
|
|
18
17
|
|
|
19
18
|
from .ast_analyzer import Symbol, FileAST, ASTAnalyzer, create_symbol_embedding_text
|
|
20
19
|
|
|
@@ -10,10 +10,10 @@ hanzo_mcp/server.py,sha256=Ad3S5s48FQpmqNS_3Ql_pAXxt2ST0omLEauoHy7AURs,10408
|
|
|
10
10
|
hanzo_mcp/server_enhanced.py,sha256=bBrObdysyda6Ggf-E3aL7UwktUNzYO_HG1V45Av5r-E,2003
|
|
11
11
|
hanzo_mcp/types.py,sha256=4YjIJmM7byrsY4eN10pbhIUpFMQ-fZrpK6scgt-U9dU,648
|
|
12
12
|
hanzo_mcp/analytics/__init__.py,sha256=ANyntTooBrpa_uvwE6KbYxB9uda610UT10pt2rrLiUU,213
|
|
13
|
-
hanzo_mcp/analytics/posthog_analytics.py,sha256=
|
|
13
|
+
hanzo_mcp/analytics/posthog_analytics.py,sha256=y6H2adjhL9nDQY7k1dnkEplb6M7-C3149QrH8rOJwjM,10870
|
|
14
14
|
hanzo_mcp/config/__init__.py,sha256=1ifMucAN-htFEGdRpiC1T809Q03Bd7YUE5ATOHNi6Po,505
|
|
15
15
|
hanzo_mcp/config/settings.py,sha256=5JLqC_wdwQdIzGmwmyZh8aKWpYfxM8m8F268-K4Mr2A,18985
|
|
16
|
-
hanzo_mcp/config/tool_config.py,sha256=
|
|
16
|
+
hanzo_mcp/config/tool_config.py,sha256=jW9m02PEvSHF23jaIDxiIjvuaT1r5o_fec3aXogbte0,6853
|
|
17
17
|
hanzo_mcp/core/base_agent.py,sha256=KgYzgU9ChPGdvtjKl1lhV5kqwGDduJdqGvczKicRHI8,15496
|
|
18
18
|
hanzo_mcp/core/model_registry.py,sha256=vMluoWgVwhYxZP2DnNzkccvNx1Pn7QXV2V4Bgd-jt8E,13342
|
|
19
19
|
hanzo_mcp/prompts/__init__.py,sha256=h3AXLEsI5uZNr_DiGzJesytp1u_YSoGc3BZYIbU_yNU,7676
|
|
@@ -25,11 +25,11 @@ hanzo_mcp/prompts/project_system.py,sha256=FgWxRaX7rPQwDZT3n69yBwLkQv4uJ4jcUZjKz
|
|
|
25
25
|
hanzo_mcp/prompts/project_todo_reminder.py,sha256=oN1EG0FR4XnxvFOXX_E5EFvX6L-8uYlX0hxFEiDRERc,3644
|
|
26
26
|
hanzo_mcp/prompts/tool_explorer.py,sha256=6mI35V_EH8AA4pWIMAeG96qP1VPrU1HgnxwVyB0bg5A,16411
|
|
27
27
|
hanzo_mcp/prompts/utils.py,sha256=IwxIhzZfYJ2anToPulbrpcc07u4Dozo9ok6VE3BC_4A,9963
|
|
28
|
-
hanzo_mcp/tools/__init__.py,sha256=
|
|
28
|
+
hanzo_mcp/tools/__init__.py,sha256=TMPTOowB00EcyV2MeOXVyZ3WHqTDmYpWyHFA3ItZS1k,19369
|
|
29
29
|
hanzo_mcp/tools/agent/__init__.py,sha256=UGDZ0Ehi8sVoE-Utq7jMI5SPkmHqsV6-RH55iMql4wg,4784
|
|
30
30
|
hanzo_mcp/tools/agent/agent.py,sha256=bgVbLmeXHVlO2TDLmjDeKw0IzXy73mFisSLylj39XaM,13151
|
|
31
|
-
hanzo_mcp/tools/agent/agent_tool.py,sha256
|
|
32
|
-
hanzo_mcp/tools/agent/agent_tool_v1_deprecated.py,sha256=
|
|
31
|
+
hanzo_mcp/tools/agent/agent_tool.py,sha256=-p3uvoeV82dgyptR9GMTYZQWhFl-BQ4KJ_TDlXd2PFA,16866
|
|
32
|
+
hanzo_mcp/tools/agent/agent_tool_v1_deprecated.py,sha256=PXG6qUzHiarpMUWacttp2LitMX2sYAOiqs01YdPtqyA,26584
|
|
33
33
|
hanzo_mcp/tools/agent/clarification_protocol.py,sha256=QYJTmDSJVRDyZMow80TxWmnJurxuLo1MaIFge8t_Yvk,8041
|
|
34
34
|
hanzo_mcp/tools/agent/clarification_tool.py,sha256=up40UJLY5JrS6D3yBD1lW1vSrh79JNa3LoKrrNmAmwg,2449
|
|
35
35
|
hanzo_mcp/tools/agent/claude_cli_tool.py,sha256=55Wc0LKgYCtDKQ02NXOYPMhx-sW7fL_NSCx0upsvvb4,3812
|
|
@@ -47,7 +47,7 @@ hanzo_mcp/tools/agent/network_tool.py,sha256=diDemnua7QZZfAmAWN2yWXAUYAdycRoWqi1
|
|
|
47
47
|
hanzo_mcp/tools/agent/prompt.py,sha256=Z-kQrbg8Uivm-ki468s-jjdydzx8XrPPZuwSg_r6S6c,6814
|
|
48
48
|
hanzo_mcp/tools/agent/review_tool.py,sha256=npwHTsJqojuuT_nLWqOtCdgaX3FKXfe9uSIlqIco_Tw,16828
|
|
49
49
|
hanzo_mcp/tools/agent/swarm_alias.py,sha256=7LwyAV2enw9KGzGS1lhPU9ty4btXuEbMkeUYoLEWE1Y,2992
|
|
50
|
-
hanzo_mcp/tools/agent/swarm_tool.py,sha256=
|
|
50
|
+
hanzo_mcp/tools/agent/swarm_tool.py,sha256=KQTZsv0RNelTZUy8tOsDUcCk5umtaJ3zyXdftSOPbOA,22774
|
|
51
51
|
hanzo_mcp/tools/agent/swarm_tool_v1_deprecated.py,sha256=Bbmz9TUhyaiqhekJPuOmfM9ZmRkG7e1f8aCCcX9jw0I,20792
|
|
52
52
|
hanzo_mcp/tools/agent/tool_adapter.py,sha256=rLItgdKvvfzJL4chNIrNK_I5kSCm6ocmi83RQm93NgA,3191
|
|
53
53
|
hanzo_mcp/tools/agent/unified_cli_tools.py,sha256=a6a77eIHnX04umQ4Qj3ZNy3liobjvCOY4KrVNLuikPI,8398
|
|
@@ -70,7 +70,7 @@ hanzo_mcp/tools/common/pagination.py,sha256=PgCfM6CmUquBGY0XFhl_WaY_4V9vIsohH39W
|
|
|
70
70
|
hanzo_mcp/tools/common/permissions.py,sha256=IgLMNt5YDTTA_Yb4MocFlSnIbP0TmXyEBP0g_W8tsGM,7850
|
|
71
71
|
hanzo_mcp/tools/common/personality.py,sha256=RgBloQaqi5bxhz-voMY1mkV-JU08dTuNzji2zGdS7Dw,37515
|
|
72
72
|
hanzo_mcp/tools/common/plugin_loader.py,sha256=XpQbO4y-3_V8xh3Yl6YrkVgB_oJLzgiGwHuX5rE_9CQ,8955
|
|
73
|
-
hanzo_mcp/tools/common/stats.py,sha256=
|
|
73
|
+
hanzo_mcp/tools/common/stats.py,sha256=32lmZcH8e9y7POXyVCby_tsOrH3XrTEw9Jbj86cYNgo,9762
|
|
74
74
|
hanzo_mcp/tools/common/test_helpers.py,sha256=rrepQmWvqRc3gyNkqBARjGBOFtFolUTQAU4vIfP1If8,1076
|
|
75
75
|
hanzo_mcp/tools/common/thinking_tool.py,sha256=AWhjfouLVe2YuxOnGFxGUOEZwKwFwOqgGyL6_v2QVLk,5036
|
|
76
76
|
hanzo_mcp/tools/common/tool_disable.py,sha256=nmdHUtirk-P-6FevlGVY3C4f6lxnR_SRp1aH2O3m2N0,4290
|
|
@@ -135,8 +135,8 @@ hanzo_mcp/tools/llm/provider_tools.py,sha256=wAQvkWZ8-HlUVwRYhy9RhbhR-JGDKi0bUZj
|
|
|
135
135
|
hanzo_mcp/tools/lsp/__init__.py,sha256=2Z1edOMrLV6gi1dyGgUyN3lN4HOWynf73Eye_eBk2Xo,150
|
|
136
136
|
hanzo_mcp/tools/lsp/lsp_tool.py,sha256=kSfXe0G9vHLmfFEgPA99p9JPSAAM0SUrIriNwuh8NeY,19409
|
|
137
137
|
hanzo_mcp/tools/mcp/__init__.py,sha256=Rml2im2dg4wNra4nsDH09q73G-yoifQrXL9iYhPmfTg,347
|
|
138
|
-
hanzo_mcp/tools/mcp/mcp_add.py,sha256=
|
|
139
|
-
hanzo_mcp/tools/mcp/mcp_remove.py,sha256=
|
|
138
|
+
hanzo_mcp/tools/mcp/mcp_add.py,sha256=KIpNau8rtpDiXTWMmjKNu8LfYxz1VqBdtnwoOs8nrOA,7835
|
|
139
|
+
hanzo_mcp/tools/mcp/mcp_remove.py,sha256=LU1PErKhHzUwbWmkGOEI_uVDxO51PD2gLi-mpDFBQkQ,3250
|
|
140
140
|
hanzo_mcp/tools/mcp/mcp_stats.py,sha256=n_lZo6mazjd4asFbO2ZAksVQ3eMTbvOfzYFOPT_T70g,5305
|
|
141
141
|
hanzo_mcp/tools/mcp/mcp_tool.py,sha256=7H7B5d1D00VEWKOFhUjbtc5TBTRNeMTGFl904AA0hio,16765
|
|
142
142
|
hanzo_mcp/tools/memory/__init__.py,sha256=Ku3TprzANCk78sH44KS8NYwW9lMfDE9l1f3EKQXW9Mw,2970
|
|
@@ -144,7 +144,7 @@ hanzo_mcp/tools/memory/knowledge_tools.py,sha256=T9nh5Y7GLuFeNRPRgtanU3zNdcUz9wU
|
|
|
144
144
|
hanzo_mcp/tools/memory/memory_tools.py,sha256=5LtzxgRww_BXmXY0YxZZ_UQ9AXffWiFmx8FOtOnE62A,13692
|
|
145
145
|
hanzo_mcp/tools/search/__init__.py,sha256=7z0GUOmKrJyI7MCbLIvO5zbWHknaNf6kCowi2CtoNNw,292
|
|
146
146
|
hanzo_mcp/tools/search/find_tool.py,sha256=Kv4rFyZetNjf9yutsy34jC7UTHWV8Z4BAdge7p3a3sA,23607
|
|
147
|
-
hanzo_mcp/tools/search/unified_search.py,sha256=
|
|
147
|
+
hanzo_mcp/tools/search/unified_search.py,sha256=TmIJgsPa-D2ByAA5ZSeskhDpbVnj-2LnDEo78thxPpM,36010
|
|
148
148
|
hanzo_mcp/tools/shell/__init__.py,sha256=l1gdigiyhwB5AzUSVcejObwtaS3cPY65KeBuHMoVIVA,2346
|
|
149
149
|
hanzo_mcp/tools/shell/auto_background.py,sha256=6-ggSvZlTwG_IedSipI-vE3tFyLPqD5wcgx88qz0IqY,8263
|
|
150
150
|
hanzo_mcp/tools/shell/base.py,sha256=g6xPSoOsGfdDJeJtclbgkwbP3bwumlqXKxJT0s-QSi0,5826
|
|
@@ -180,14 +180,13 @@ hanzo_mcp/tools/vector/__init__.py,sha256=DXQLyaNf3T_zWz7cGP9UZo08vVyDSSZZteBIaB
|
|
|
180
180
|
hanzo_mcp/tools/vector/ast_analyzer.py,sha256=Gh9j_EO_6eXozjOkRjmiB68r9Rs8ri7CZ7dUNbJNoNo,15957
|
|
181
181
|
hanzo_mcp/tools/vector/git_ingester.py,sha256=X_C8mQeaMz7Jfdd2VbJT77aIUShmh8B0NLl32xGpurk,15817
|
|
182
182
|
hanzo_mcp/tools/vector/index_tool.py,sha256=ZQQCal8AashRKrflrtpfZ0oHpsze-Sy4bX5XFpdLYVw,13604
|
|
183
|
-
hanzo_mcp/tools/vector/infinity_store.py,sha256=
|
|
184
|
-
hanzo_mcp/tools/vector/mock_infinity.py,sha256=3YoNl4muaGYkWaSUje6lhPwT7jvyLP3ylxv78zcm_8s,4844
|
|
183
|
+
hanzo_mcp/tools/vector/infinity_store.py,sha256=sqoipKYYmBV6U8PCkJde1Glgs4yAZrfj0hX704DcYdM,28696
|
|
185
184
|
hanzo_mcp/tools/vector/project_manager.py,sha256=b69kr84qoteFkx7feeC_XHsNteTyVEfj-BqwLIYgX9w,13209
|
|
186
185
|
hanzo_mcp/tools/vector/vector.py,sha256=IzJJlWAuhXNmm41NyXEyQsknLNugoRRciDTypYfof9w,9947
|
|
187
186
|
hanzo_mcp/tools/vector/vector_index.py,sha256=EgxOveWt0R60WYcO-CLmEh8HbGXGmX4_xpqQXTtgQJQ,4188
|
|
188
187
|
hanzo_mcp/tools/vector/vector_search.py,sha256=anavkfz_pPtfgVZUW4trj5q5GT6Naxw5ItjK9hUY9wU,9677
|
|
189
|
-
hanzo_mcp-0.8.
|
|
190
|
-
hanzo_mcp-0.8.
|
|
191
|
-
hanzo_mcp-0.8.
|
|
192
|
-
hanzo_mcp-0.8.
|
|
193
|
-
hanzo_mcp-0.8.
|
|
188
|
+
hanzo_mcp-0.8.8.dist-info/METADATA,sha256=46I3yLdp7fh9qKMhCPii6R063lu_A9WJY87v7qXLABA,8973
|
|
189
|
+
hanzo_mcp-0.8.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
190
|
+
hanzo_mcp-0.8.8.dist-info/entry_points.txt,sha256=ML30pedHV5wjthfztzMMz3uYhNdR_6inzYY5pSqNME4,142
|
|
191
|
+
hanzo_mcp-0.8.8.dist-info/top_level.txt,sha256=eGFANatA0MHWiVlpS56fTYRIShtibrSom1uXI6XU0GU,10
|
|
192
|
+
hanzo_mcp-0.8.8.dist-info/RECORD,,
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"""Mock implementation of infinity_embedded for testing on unsupported platforms."""
|
|
2
|
-
|
|
3
|
-
import random
|
|
4
|
-
from typing import Any, Dict, List
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class MockTable:
|
|
9
|
-
"""Mock implementation of an Infinity table."""
|
|
10
|
-
|
|
11
|
-
def __init__(self, name: str, schema: Dict[str, Any]):
|
|
12
|
-
self.name = name
|
|
13
|
-
self.schema = schema
|
|
14
|
-
self.data = []
|
|
15
|
-
self._id_counter = 0
|
|
16
|
-
|
|
17
|
-
def insert(self, records: List[Dict[str, Any]]):
|
|
18
|
-
"""Insert records into the table."""
|
|
19
|
-
for record in records:
|
|
20
|
-
# Add an internal ID if not present
|
|
21
|
-
if "id" not in record:
|
|
22
|
-
record["_internal_id"] = self._id_counter
|
|
23
|
-
self._id_counter += 1
|
|
24
|
-
self.data.append(record)
|
|
25
|
-
|
|
26
|
-
def delete(self, condition: str):
|
|
27
|
-
"""Delete records matching condition."""
|
|
28
|
-
# Simple implementation - just clear for now
|
|
29
|
-
self.data = [r for r in self.data if not self._eval_condition(r, condition)]
|
|
30
|
-
|
|
31
|
-
def output(self, columns: List[str]):
|
|
32
|
-
"""Start a query chain."""
|
|
33
|
-
return MockQuery(self, columns)
|
|
34
|
-
|
|
35
|
-
def _eval_condition(self, record: Dict[str, Any], condition: str) -> bool:
|
|
36
|
-
"""Evaluate a simple condition."""
|
|
37
|
-
# Very basic implementation
|
|
38
|
-
if "=" in condition:
|
|
39
|
-
field, value = condition.split("=", 1)
|
|
40
|
-
field = field.strip()
|
|
41
|
-
value = value.strip().strip("'\"")
|
|
42
|
-
return str(record.get(field, "")) == value
|
|
43
|
-
return False
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class MockQuery:
|
|
47
|
-
"""Mock query builder."""
|
|
48
|
-
|
|
49
|
-
def __init__(self, table: MockTable, columns: List[str]):
|
|
50
|
-
self.table = table
|
|
51
|
-
self.columns = columns
|
|
52
|
-
self.filters = []
|
|
53
|
-
self.vector_search = None
|
|
54
|
-
self.limit_value = None
|
|
55
|
-
|
|
56
|
-
def filter(self, condition: str):
|
|
57
|
-
"""Add a filter condition."""
|
|
58
|
-
self.filters.append(condition)
|
|
59
|
-
return self
|
|
60
|
-
|
|
61
|
-
def match_dense(
|
|
62
|
-
self, column: str, vector: List[float], dtype: str, metric: str, limit: int
|
|
63
|
-
):
|
|
64
|
-
"""Add vector search."""
|
|
65
|
-
self.vector_search = {
|
|
66
|
-
"column": column,
|
|
67
|
-
"vector": vector,
|
|
68
|
-
"dtype": dtype,
|
|
69
|
-
"metric": metric,
|
|
70
|
-
"limit": limit,
|
|
71
|
-
}
|
|
72
|
-
self.limit_value = limit
|
|
73
|
-
return self
|
|
74
|
-
|
|
75
|
-
def to_pl(self):
|
|
76
|
-
"""Execute query and return polars-like result."""
|
|
77
|
-
results = self.table.data.copy()
|
|
78
|
-
|
|
79
|
-
# Apply filters
|
|
80
|
-
for condition in self.filters:
|
|
81
|
-
results = [r for r in results if self.table._eval_condition(r, condition)]
|
|
82
|
-
|
|
83
|
-
# Apply vector search (mock similarity)
|
|
84
|
-
if self.vector_search:
|
|
85
|
-
# Add mock scores
|
|
86
|
-
for r in results:
|
|
87
|
-
r["score"] = random.uniform(0.5, 1.0)
|
|
88
|
-
# Sort by score
|
|
89
|
-
results.sort(key=lambda x: x.get("score", 0), reverse=True)
|
|
90
|
-
# Limit results
|
|
91
|
-
if self.limit_value:
|
|
92
|
-
results = results[: self.limit_value]
|
|
93
|
-
|
|
94
|
-
# Return mock polars DataFrame
|
|
95
|
-
return MockDataFrame(results)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
class MockDataFrame:
|
|
99
|
-
"""Mock polars DataFrame."""
|
|
100
|
-
|
|
101
|
-
def __init__(self, data: List[Dict[str, Any]]):
|
|
102
|
-
self.data = data
|
|
103
|
-
|
|
104
|
-
def __len__(self):
|
|
105
|
-
return len(self.data)
|
|
106
|
-
|
|
107
|
-
def iter_rows(self, named: bool = False):
|
|
108
|
-
"""Iterate over rows."""
|
|
109
|
-
if named:
|
|
110
|
-
return iter(self.data)
|
|
111
|
-
else:
|
|
112
|
-
# Return tuples
|
|
113
|
-
if not self.data:
|
|
114
|
-
return iter([])
|
|
115
|
-
keys = list(self.data[0].keys())
|
|
116
|
-
return iter([tuple(row.get(k) for k in keys) for row in self.data])
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
class MockDatabase:
|
|
120
|
-
"""Mock implementation of an Infinity database."""
|
|
121
|
-
|
|
122
|
-
def __init__(self, name: str):
|
|
123
|
-
self.name = name
|
|
124
|
-
self.tables = {}
|
|
125
|
-
|
|
126
|
-
def create_table(self, name: str, schema: Dict[str, Any]) -> MockTable:
|
|
127
|
-
"""Create a new table."""
|
|
128
|
-
table = MockTable(name, schema)
|
|
129
|
-
self.tables[name] = table
|
|
130
|
-
return table
|
|
131
|
-
|
|
132
|
-
def get_table(self, name: str) -> MockTable:
|
|
133
|
-
"""Get an existing table."""
|
|
134
|
-
if name not in self.tables:
|
|
135
|
-
raise KeyError(f"Table {name} not found")
|
|
136
|
-
return self.tables[name]
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
class MockInfinity:
|
|
140
|
-
"""Mock implementation of Infinity connection."""
|
|
141
|
-
|
|
142
|
-
def __init__(self, path: str):
|
|
143
|
-
self.path = Path(path)
|
|
144
|
-
self.databases = {}
|
|
145
|
-
# Ensure directory exists
|
|
146
|
-
self.path.mkdir(parents=True, exist_ok=True)
|
|
147
|
-
|
|
148
|
-
def get_database(self, name: str) -> MockDatabase:
|
|
149
|
-
"""Get or create a database."""
|
|
150
|
-
if name not in self.databases:
|
|
151
|
-
self.databases[name] = MockDatabase(name)
|
|
152
|
-
return self.databases[name]
|
|
153
|
-
|
|
154
|
-
def disconnect(self):
|
|
155
|
-
"""Disconnect from Infinity."""
|
|
156
|
-
pass
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def connect(path: str) -> MockInfinity:
|
|
160
|
-
"""Connect to Infinity (mock implementation)."""
|
|
161
|
-
return MockInfinity(path)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|