hanzo 0.2.3__py3-none-any.whl → 0.2.6__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 might be problematic. Click here for more details.
- hanzo/__init__.py +4 -93
- hanzo/__main__.py +6 -0
- hanzo/cli.py +221 -8
- hanzo/commands/__init__.py +3 -0
- hanzo/commands/agent.py +112 -0
- hanzo/commands/auth.py +324 -0
- hanzo/commands/chat.py +183 -0
- hanzo/commands/cluster.py +428 -0
- hanzo/commands/config.py +240 -0
- hanzo/commands/mcp.py +235 -0
- hanzo/commands/miner.py +323 -0
- hanzo/commands/network.py +333 -0
- hanzo/commands/repl.py +186 -0
- hanzo/commands/tools.py +335 -0
- hanzo/interactive/__init__.py +3 -0
- hanzo/interactive/dashboard.py +125 -0
- hanzo/interactive/repl.py +184 -0
- hanzo/router/__init__.py +13 -7
- hanzo/utils/__init__.py +3 -0
- hanzo/utils/config.py +170 -0
- hanzo/utils/net_check.py +107 -0
- hanzo/utils/output.py +103 -0
- {hanzo-0.2.3.dist-info → hanzo-0.2.6.dist-info}/METADATA +6 -3
- hanzo-0.2.6.dist-info/RECORD +28 -0
- hanzo-0.2.3.dist-info/RECORD +0 -9
- {hanzo-0.2.3.dist-info → hanzo-0.2.6.dist-info}/WHEEL +0 -0
- {hanzo-0.2.3.dist-info → hanzo-0.2.6.dist-info}/entry_points.txt +0 -0
hanzo/utils/config.py
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""Configuration utilities for Hanzo CLI."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Dict, Optional
|
|
7
|
+
|
|
8
|
+
import yaml
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_config_paths() -> Dict[str, Path]:
|
|
12
|
+
"""Get configuration file paths."""
|
|
13
|
+
paths = {}
|
|
14
|
+
|
|
15
|
+
# System config
|
|
16
|
+
if os.name == "nt": # Windows
|
|
17
|
+
paths["system"] = Path(os.environ.get("PROGRAMDATA", "C:\\ProgramData")) / "hanzo" / "config.yaml"
|
|
18
|
+
else: # Unix-like
|
|
19
|
+
paths["system"] = Path("/etc/hanzo/config.yaml")
|
|
20
|
+
|
|
21
|
+
# Global config (user)
|
|
22
|
+
config_home = Path(os.environ.get("XDG_CONFIG_HOME", Path.home() / ".config"))
|
|
23
|
+
paths["global"] = config_home / "hanzo" / "config.yaml"
|
|
24
|
+
|
|
25
|
+
# Local config (project)
|
|
26
|
+
cwd = Path.cwd()
|
|
27
|
+
for parent in [cwd] + list(cwd.parents):
|
|
28
|
+
config_file = parent / ".hanzo" / "config.yaml"
|
|
29
|
+
if config_file.exists():
|
|
30
|
+
paths["local"] = config_file
|
|
31
|
+
break
|
|
32
|
+
else:
|
|
33
|
+
# Default local path even if it doesn't exist
|
|
34
|
+
paths["local"] = cwd / ".hanzo" / "config.yaml"
|
|
35
|
+
|
|
36
|
+
return paths
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def load_config(path: Path) -> Dict[str, Any]:
|
|
40
|
+
"""Load configuration from file."""
|
|
41
|
+
if not path.exists():
|
|
42
|
+
return {}
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
with open(path, "r") as f:
|
|
46
|
+
if path.suffix == ".json":
|
|
47
|
+
return json.load(f)
|
|
48
|
+
else:
|
|
49
|
+
return yaml.safe_load(f) or {}
|
|
50
|
+
except Exception:
|
|
51
|
+
return {}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def save_config(path: Path, config: Dict[str, Any]):
|
|
55
|
+
"""Save configuration to file."""
|
|
56
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
|
|
58
|
+
with open(path, "w") as f:
|
|
59
|
+
if path.suffix == ".json":
|
|
60
|
+
json.dump(config, f, indent=2)
|
|
61
|
+
else:
|
|
62
|
+
yaml.dump(config, f, default_flow_style=False)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def get_config_value(key: str, default: Any = None, scope: Optional[str] = None) -> Any:
|
|
66
|
+
"""Get configuration value from merged configs."""
|
|
67
|
+
paths = get_config_paths()
|
|
68
|
+
|
|
69
|
+
# Load configs in priority order (local > global > system)
|
|
70
|
+
configs = []
|
|
71
|
+
|
|
72
|
+
if scope == "system" or scope is None:
|
|
73
|
+
if paths["system"].exists():
|
|
74
|
+
configs.append(load_config(paths["system"]))
|
|
75
|
+
|
|
76
|
+
if scope == "global" or scope is None:
|
|
77
|
+
if paths["global"].exists():
|
|
78
|
+
configs.append(load_config(paths["global"]))
|
|
79
|
+
|
|
80
|
+
if scope == "local" or scope is None:
|
|
81
|
+
if paths.get("local") and paths["local"].exists():
|
|
82
|
+
configs.append(load_config(paths["local"]))
|
|
83
|
+
|
|
84
|
+
# Merge configs (later ones override earlier)
|
|
85
|
+
merged = {}
|
|
86
|
+
for config in configs:
|
|
87
|
+
merged.update(config)
|
|
88
|
+
|
|
89
|
+
# Get nested key
|
|
90
|
+
keys = key.split(".")
|
|
91
|
+
current = merged
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
for k in keys:
|
|
95
|
+
current = current[k]
|
|
96
|
+
return current
|
|
97
|
+
except (KeyError, TypeError):
|
|
98
|
+
return default
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def set_config_value(key: str, value: Any, scope: str = "global"):
|
|
102
|
+
"""Set configuration value."""
|
|
103
|
+
paths = get_config_paths()
|
|
104
|
+
path = paths.get(scope, paths["global"])
|
|
105
|
+
|
|
106
|
+
config = load_config(path) if path.exists() else {}
|
|
107
|
+
|
|
108
|
+
# Set nested key
|
|
109
|
+
keys = key.split(".")
|
|
110
|
+
current = config
|
|
111
|
+
|
|
112
|
+
for k in keys[:-1]:
|
|
113
|
+
if k not in current:
|
|
114
|
+
current[k] = {}
|
|
115
|
+
current = current[k]
|
|
116
|
+
|
|
117
|
+
current[keys[-1]] = value
|
|
118
|
+
|
|
119
|
+
save_config(path, config)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def init_config() -> Dict[str, Path]:
|
|
123
|
+
"""Initialize configuration structure."""
|
|
124
|
+
paths = get_config_paths()
|
|
125
|
+
|
|
126
|
+
# Create global config if it doesn't exist
|
|
127
|
+
if not paths["global"].exists():
|
|
128
|
+
default_config = {
|
|
129
|
+
"default_model": "llama-3.2-3b",
|
|
130
|
+
"default_provider": "local",
|
|
131
|
+
"mcp": {
|
|
132
|
+
"allowed_paths": [str(Path.home())],
|
|
133
|
+
"enable_all_tools": True
|
|
134
|
+
},
|
|
135
|
+
"cluster": {
|
|
136
|
+
"default_name": "hanzo-local",
|
|
137
|
+
"default_port": 8000
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
save_config(paths["global"], default_config)
|
|
141
|
+
|
|
142
|
+
return paths
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def get_default_model() -> str:
|
|
146
|
+
"""Get default model from config or environment."""
|
|
147
|
+
return os.environ.get("HANZO_DEFAULT_MODEL") or get_config_value("default_model", "llama-3.2-3b")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def get_api_key(provider: str) -> Optional[str]:
|
|
151
|
+
"""Get API key for provider."""
|
|
152
|
+
# Check environment first
|
|
153
|
+
env_map = {
|
|
154
|
+
"openai": "OPENAI_API_KEY",
|
|
155
|
+
"anthropic": "ANTHROPIC_API_KEY",
|
|
156
|
+
"hanzo": "HANZO_API_KEY",
|
|
157
|
+
"groq": "GROQ_API_KEY",
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if env_key := env_map.get(provider.lower()):
|
|
161
|
+
if key := os.environ.get(env_key):
|
|
162
|
+
return key
|
|
163
|
+
|
|
164
|
+
# Check config
|
|
165
|
+
return get_config_value(f"api_keys.{provider}")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def is_local_preferred() -> bool:
|
|
169
|
+
"""Check if local execution is preferred."""
|
|
170
|
+
return os.environ.get("HANZO_USE_LOCAL", "").lower() == "true" or get_config_value("prefer_local", False)
|
hanzo/utils/net_check.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Utilities for checking hanzo/net availability and dependencies."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
from typing import Optional, Tuple
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def check_net_installation() -> Tuple[bool, Optional[str], Optional[str]]:
|
|
11
|
+
"""Check if hanzo/net is available and properly configured.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
Tuple of (is_available, net_path, python_exe)
|
|
15
|
+
"""
|
|
16
|
+
# Check for hanzo/net in standard location
|
|
17
|
+
net_path = Path.home() / "work" / "hanzo" / "net"
|
|
18
|
+
if not net_path.exists():
|
|
19
|
+
net_path = Path("/Users/z/work/hanzo/net")
|
|
20
|
+
|
|
21
|
+
if not net_path.exists():
|
|
22
|
+
# Try to import as package
|
|
23
|
+
try:
|
|
24
|
+
import net
|
|
25
|
+
return True, None, sys.executable
|
|
26
|
+
except ImportError:
|
|
27
|
+
return False, None, None
|
|
28
|
+
|
|
29
|
+
# Check for venv
|
|
30
|
+
venv_python = net_path / ".venv" / "bin" / "python"
|
|
31
|
+
if venv_python.exists():
|
|
32
|
+
# Check if venv has required packages
|
|
33
|
+
result = subprocess.run(
|
|
34
|
+
[str(venv_python), "-c", "import net, scapy, mlx, transformers"],
|
|
35
|
+
capture_output=True,
|
|
36
|
+
text=True
|
|
37
|
+
)
|
|
38
|
+
if result.returncode == 0:
|
|
39
|
+
return True, str(net_path), str(venv_python)
|
|
40
|
+
else:
|
|
41
|
+
# Venv exists but missing dependencies
|
|
42
|
+
return False, str(net_path), str(venv_python)
|
|
43
|
+
|
|
44
|
+
# No venv, check system Python
|
|
45
|
+
result = subprocess.run(
|
|
46
|
+
[sys.executable, "-c", "import scapy"],
|
|
47
|
+
capture_output=True,
|
|
48
|
+
text=True
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if result.returncode == 0:
|
|
52
|
+
return True, str(net_path), sys.executable
|
|
53
|
+
else:
|
|
54
|
+
return False, str(net_path), None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def install_net_dependencies(net_path: str, python_exe: str = None) -> bool:
|
|
58
|
+
"""Install hanzo/net dependencies.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
net_path: Path to hanzo/net directory
|
|
62
|
+
python_exe: Python executable to use (optional)
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
True if installation successful
|
|
66
|
+
"""
|
|
67
|
+
if python_exe is None:
|
|
68
|
+
python_exe = sys.executable
|
|
69
|
+
|
|
70
|
+
# Install dependencies
|
|
71
|
+
result = subprocess.run(
|
|
72
|
+
[python_exe, "-m", "pip", "install", "-e", net_path],
|
|
73
|
+
capture_output=True,
|
|
74
|
+
text=True
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return result.returncode == 0
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_missing_dependencies(python_exe: str = None) -> list:
|
|
81
|
+
"""Check which dependencies are missing for hanzo/net.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
python_exe: Python executable to check (default: sys.executable)
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
List of missing package names
|
|
88
|
+
"""
|
|
89
|
+
if python_exe is None:
|
|
90
|
+
python_exe = sys.executable
|
|
91
|
+
|
|
92
|
+
required_packages = [
|
|
93
|
+
"scapy", "mlx", "mlx_lm", "transformers", "tinygrad",
|
|
94
|
+
"aiohttp", "grpcio", "pydantic", "rich", "tqdm"
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
missing = []
|
|
98
|
+
for package in required_packages:
|
|
99
|
+
result = subprocess.run(
|
|
100
|
+
[python_exe, "-c", f"import {package}"],
|
|
101
|
+
capture_output=True,
|
|
102
|
+
text=True
|
|
103
|
+
)
|
|
104
|
+
if result.returncode != 0:
|
|
105
|
+
missing.append(package)
|
|
106
|
+
|
|
107
|
+
return missing
|
hanzo/utils/output.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Output utilities for Hanzo CLI."""
|
|
2
|
+
|
|
3
|
+
from functools import wraps
|
|
4
|
+
from typing import Any, Callable
|
|
5
|
+
|
|
6
|
+
from rich.console import Console
|
|
7
|
+
from rich.theme import Theme
|
|
8
|
+
|
|
9
|
+
# Custom theme
|
|
10
|
+
hanzo_theme = Theme({
|
|
11
|
+
"info": "cyan",
|
|
12
|
+
"warning": "yellow",
|
|
13
|
+
"error": "red",
|
|
14
|
+
"success": "green",
|
|
15
|
+
"dim": "dim white",
|
|
16
|
+
"highlight": "bold cyan",
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
# Global console instance
|
|
20
|
+
console = Console(theme=hanzo_theme)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def handle_errors(func: Callable) -> Callable:
|
|
24
|
+
"""Decorator to handle errors in CLI commands."""
|
|
25
|
+
@wraps(func)
|
|
26
|
+
async def async_wrapper(*args, **kwargs):
|
|
27
|
+
try:
|
|
28
|
+
return await func(*args, **kwargs)
|
|
29
|
+
except KeyboardInterrupt:
|
|
30
|
+
console.print("\n[yellow]Interrupted[/yellow]")
|
|
31
|
+
except Exception as e:
|
|
32
|
+
console.print(f"[error]Error: {e}[/error]")
|
|
33
|
+
if console.is_debug:
|
|
34
|
+
console.print_exception()
|
|
35
|
+
|
|
36
|
+
@wraps(func)
|
|
37
|
+
def sync_wrapper(*args, **kwargs):
|
|
38
|
+
try:
|
|
39
|
+
return func(*args, **kwargs)
|
|
40
|
+
except KeyboardInterrupt:
|
|
41
|
+
console.print("\n[yellow]Interrupted[/yellow]")
|
|
42
|
+
except Exception as e:
|
|
43
|
+
console.print(f"[error]Error: {e}[/error]")
|
|
44
|
+
if console.is_debug:
|
|
45
|
+
console.print_exception()
|
|
46
|
+
|
|
47
|
+
if asyncio.iscoroutinefunction(func):
|
|
48
|
+
return async_wrapper
|
|
49
|
+
return sync_wrapper
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def print_json(data: Any, indent: int = 2):
|
|
53
|
+
"""Print JSON data with syntax highlighting."""
|
|
54
|
+
console.print_json(data=data, indent=indent)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def print_table(data: list[dict], title: str = None):
|
|
58
|
+
"""Print data as a table."""
|
|
59
|
+
if not data:
|
|
60
|
+
console.print("[dim]No data[/dim]")
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
from rich.table import Table
|
|
64
|
+
|
|
65
|
+
table = Table(title=title)
|
|
66
|
+
|
|
67
|
+
# Add columns from first row
|
|
68
|
+
for key in data[0].keys():
|
|
69
|
+
table.add_column(key.replace("_", " ").title())
|
|
70
|
+
|
|
71
|
+
# Add rows
|
|
72
|
+
for row in data:
|
|
73
|
+
table.add_row(*[str(v) for v in row.values()])
|
|
74
|
+
|
|
75
|
+
console.print(table)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def confirm(message: str, default: bool = False) -> bool:
|
|
79
|
+
"""Ask for confirmation."""
|
|
80
|
+
from rich.prompt import Confirm
|
|
81
|
+
return Confirm.ask(message, default=default)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def prompt(message: str, default: str = None, password: bool = False) -> str:
|
|
85
|
+
"""Prompt for input."""
|
|
86
|
+
from rich.prompt import Prompt
|
|
87
|
+
return Prompt.ask(message, default=default, password=password)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def progress(description: str):
|
|
91
|
+
"""Context manager for progress indicator."""
|
|
92
|
+
return console.status(description)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# Export common methods
|
|
96
|
+
print = console.print
|
|
97
|
+
print_exception = console.print_exception
|
|
98
|
+
rule = console.rule
|
|
99
|
+
clear = console.clear
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Import asyncio for the decorator
|
|
103
|
+
import asyncio
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hanzo
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Hanzo AI - Complete AI Infrastructure Platform with CLI, Router, MCP, and Agent Runtime
|
|
5
5
|
Project-URL: Homepage, https://hanzo.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/hanzoai/python-sdk
|
|
@@ -23,8 +23,12 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
|
23
23
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
24
|
Requires-Python: >=3.8
|
|
25
25
|
Requires-Dist: click>=8.1.0
|
|
26
|
-
Requires-Dist:
|
|
26
|
+
Requires-Dist: httpx>=0.23.0
|
|
27
|
+
Requires-Dist: prompt-toolkit>=3.0.0
|
|
28
|
+
Requires-Dist: pydantic>=2.0.0
|
|
29
|
+
Requires-Dist: pyyaml>=6.0
|
|
27
30
|
Requires-Dist: rich>=13.0.0
|
|
31
|
+
Requires-Dist: typer>=0.9.0
|
|
28
32
|
Provides-Extra: agents
|
|
29
33
|
Requires-Dist: hanzo-agents>=0.1.0; extra == 'agents'
|
|
30
34
|
Requires-Dist: hanzo-network>=0.1.0; extra == 'agents'
|
|
@@ -33,7 +37,6 @@ Requires-Dist: hanzoai>=1.0.0; extra == 'ai'
|
|
|
33
37
|
Provides-Extra: all
|
|
34
38
|
Requires-Dist: hanzo-aci>=0.2.8; extra == 'all'
|
|
35
39
|
Requires-Dist: hanzo-agents>=0.1.0; extra == 'all'
|
|
36
|
-
Requires-Dist: hanzo-mcp-client>=0.1.0; extra == 'all'
|
|
37
40
|
Requires-Dist: hanzo-mcp>=0.7.0; extra == 'all'
|
|
38
41
|
Requires-Dist: hanzo-memory>=1.0.0; extra == 'all'
|
|
39
42
|
Requires-Dist: hanzo-network>=0.1.0; extra == 'all'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
hanzo/__init__.py,sha256=O8RZSC5Ib4DEBkXnYSP82LXK7VlKN08JKWtgFrrEVmU,168
|
|
2
|
+
hanzo/__main__.py,sha256=qRjwG8-7MHPOy3czoyDP9VK1GhEaJJsVeZcz2AG9NV0,104
|
|
3
|
+
hanzo/cli.py,sha256=jcoEVVPpa1vKlYh4PkJ8zbWBgQoH-vDUSabrXMYcQyw,9187
|
|
4
|
+
hanzo/mcp_server.py,sha256=FBqcXhaJgV8_9O83H3fUy_pv4cV1707XCYm7FXaJeWY,422
|
|
5
|
+
hanzo/repl.py,sha256=sC7EXbIBn7Oxnmzqey6neAg5-116gfpmrF0YFDYrhAQ,1014
|
|
6
|
+
hanzo/commands/__init__.py,sha256=vXfIgioA6eakIYEN5ff5k_5BqOYQCJggD_MW40gb56w,138
|
|
7
|
+
hanzo/commands/agent.py,sha256=YNemAPH-s1UqtkbZAvAHxCnxVF98iKOeC8PDFifDc74,3561
|
|
8
|
+
hanzo/commands/auth.py,sha256=-2WTKAaOXEzFhyCWdFJv07SNqgBDl3CQvNUsOCD4bkY,11550
|
|
9
|
+
hanzo/commands/chat.py,sha256=tegi0mU8UT3USrSso_bDroHF3GO5xajFkaAlS9mZDUY,6876
|
|
10
|
+
hanzo/commands/cluster.py,sha256=GD0SrhdLe8u3kcYxsOImyFafPpe_CnyjNCf7uxesLJY,15603
|
|
11
|
+
hanzo/commands/config.py,sha256=Nz_W8c6-tSGwh7B2TJ31E0Ge8XHS0LJj7ayehrk8HC0,7682
|
|
12
|
+
hanzo/commands/mcp.py,sha256=jomUJdUj5guPLzBbRmEQ9KOo38RZhsDtLVRe3EcGicw,7555
|
|
13
|
+
hanzo/commands/miner.py,sha256=KzJfGkoBrVsy0FwFefRgg-SyQ1diO_NENrhf5btyoko,11799
|
|
14
|
+
hanzo/commands/network.py,sha256=qnb6mgbRM_3xjscZvr-wWPiW1biGFJ25zTglnWNrRPg,11671
|
|
15
|
+
hanzo/commands/repl.py,sha256=JakB2yQVCRdthIundDGsvhVbFwQwKUqzcKLmgMlUzoY,6135
|
|
16
|
+
hanzo/commands/tools.py,sha256=HD2CHcjrBE-Sqxt6B7mmM9J-9w9NgV2_CmXFeZW_Y7M,10929
|
|
17
|
+
hanzo/interactive/__init__.py,sha256=izefD45Ztws902J5ZLjrbbJX4ONqfxleJylzEau60hY,73
|
|
18
|
+
hanzo/interactive/dashboard.py,sha256=5JkJz9PX7KlT-54rACncHY80x_aWxV85atjuGJbaTD4,4066
|
|
19
|
+
hanzo/interactive/repl.py,sha256=-SwCSxwIHLiZBJOEShvqa4tgg2c7YYMf00zYRHazyIY,5781
|
|
20
|
+
hanzo/router/__init__.py,sha256=7Ulou75xQF8KKVzxOd4xXrmn3_Ti52M0NsAf6jXgGhk,913
|
|
21
|
+
hanzo/utils/__init__.py,sha256=zmCH4YxefrpWmR-netV99UeECqrXjkKbi3ZjbcD79dw,68
|
|
22
|
+
hanzo/utils/config.py,sha256=RU27eiSxGWAT9fI5-CjRdEJZEeT_xjMxjlMVeKC1gMg,4830
|
|
23
|
+
hanzo/utils/net_check.py,sha256=tuIMpy44p5nkSTEco52y-Bhp58FVFMvx1S4oQn9BsKI,3032
|
|
24
|
+
hanzo/utils/output.py,sha256=lROF8RDOkck7ySt1kiTlVlHZqx1E0B-PqcJc78ZHYOs,2694
|
|
25
|
+
hanzo-0.2.6.dist-info/METADATA,sha256=vPZKal3vrQDQYr8LoNnBymZJOqz_UvUPyGD2TRWMO78,4315
|
|
26
|
+
hanzo-0.2.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
27
|
+
hanzo-0.2.6.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
|
|
28
|
+
hanzo-0.2.6.dist-info/RECORD,,
|
hanzo-0.2.3.dist-info/RECORD
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
hanzo/__init__.py,sha256=1IEB7hlct652dQuQBka-Ric-R8sOBeCBHPKjuyqSALc,1951
|
|
2
|
-
hanzo/cli.py,sha256=uLfrVV5FqW7D75N9rlYtHS5JwlXPiW6Wax9TVku6FRI,486
|
|
3
|
-
hanzo/mcp_server.py,sha256=FBqcXhaJgV8_9O83H3fUy_pv4cV1707XCYm7FXaJeWY,422
|
|
4
|
-
hanzo/repl.py,sha256=sC7EXbIBn7Oxnmzqey6neAg5-116gfpmrF0YFDYrhAQ,1014
|
|
5
|
-
hanzo/router/__init__.py,sha256=OkhSdzExF0KBEfkDiGpGp6_schsPDG0mSw-arq98OHc,822
|
|
6
|
-
hanzo-0.2.3.dist-info/METADATA,sha256=tBqDC48iL6Bcg1wsjMi9MA4b0VKXt4WCgEAMWuYZITw,4250
|
|
7
|
-
hanzo-0.2.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
8
|
-
hanzo-0.2.3.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
|
|
9
|
-
hanzo-0.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|