hanzo 0.2.2__py3-none-any.whl → 0.2.5__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/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/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
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.4
2
+ Name: hanzo
3
+ Version: 0.2.5
4
+ Summary: Hanzo AI - Complete AI Infrastructure Platform with CLI, Router, MCP, and Agent Runtime
5
+ Project-URL: Homepage, https://hanzo.ai
6
+ Project-URL: Repository, https://github.com/hanzoai/python-sdk
7
+ Project-URL: Documentation, https://docs.hanzo.ai/cli
8
+ Project-URL: Bug Tracker, https://github.com/hanzoai/python-sdk/issues
9
+ Author-email: Hanzo AI <dev@hanzo.ai>
10
+ Keywords: agents,ai,cli,hanzo,llm,local-ai,mcp,private-ai
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Requires-Python: >=3.8
25
+ Requires-Dist: click>=8.1.0
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
30
+ Requires-Dist: rich>=13.0.0
31
+ Requires-Dist: typer>=0.9.0
32
+ Provides-Extra: agents
33
+ Requires-Dist: hanzo-agents>=0.1.0; extra == 'agents'
34
+ Requires-Dist: hanzo-network>=0.1.0; extra == 'agents'
35
+ Provides-Extra: ai
36
+ Requires-Dist: hanzoai>=1.0.0; extra == 'ai'
37
+ Provides-Extra: all
38
+ Requires-Dist: hanzo-aci>=0.2.8; extra == 'all'
39
+ Requires-Dist: hanzo-agents>=0.1.0; extra == 'all'
40
+ Requires-Dist: hanzo-mcp>=0.7.0; extra == 'all'
41
+ Requires-Dist: hanzo-memory>=1.0.0; extra == 'all'
42
+ Requires-Dist: hanzo-network>=0.1.0; extra == 'all'
43
+ Requires-Dist: hanzo-repl>=0.1.0; extra == 'all'
44
+ Requires-Dist: hanzoai>=1.0.0; extra == 'all'
45
+ Provides-Extra: dev
46
+ Requires-Dist: hanzo-aci>=0.2.8; extra == 'dev'
47
+ Provides-Extra: mcp
48
+ Requires-Dist: hanzo-mcp>=0.7.0; extra == 'mcp'
49
+ Provides-Extra: repl
50
+ Requires-Dist: hanzo-repl>=0.1.0; extra == 'repl'
51
+ Provides-Extra: router
52
+ Description-Content-Type: text/markdown
53
+
54
+ # Hanzo AI - Complete AI Infrastructure Platform
55
+
56
+ The main SDK for the Hanzo AI ecosystem, providing unified access to all Hanzo tools and services.
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ # Install base package with CLI
62
+ pip install hanzo
63
+
64
+ # Install with all components
65
+ pip install hanzo[all]
66
+
67
+ # Install specific components
68
+ pip install hanzo[ai] # AI SDK (same as standalone hanzoai package)
69
+ pip install hanzo[router] # LLM gateway router (replaces litellm)
70
+ pip install hanzo[mcp] # Model Context Protocol server
71
+ pip install hanzo[agents] # Agent runtime and orchestration
72
+ pip install hanzo[repl] # Interactive REPL with AI chat
73
+ ```
74
+
75
+ ## Features
76
+
77
+ - **Unified LLM Gateway**: Use `hanzo.router` instead of litellm for 100+ LLM providers
78
+ - **MCP Integration**: Full Model Context Protocol support for AI tools
79
+ - **Agent Runtime**: Build and deploy AI agents with the agent framework
80
+ - **Interactive REPL**: Chat with AI models directly from the command line
81
+ - **Complete SDK**: Import all Hanzo components from a single package
82
+
83
+ ## Quick Start
84
+
85
+ ### Command Line
86
+ ```bash
87
+ # Main CLI
88
+ hanzo --help
89
+
90
+ # Start MCP server
91
+ hanzo-mcp
92
+
93
+ # Interactive AI chat
94
+ hanzo-ai
95
+ hanzo-chat
96
+
97
+ # REPL interface
98
+ hanzo-repl
99
+ ```
100
+
101
+ ### Python SDK
102
+ ```python
103
+ import hanzo
104
+
105
+ # Use router for LLM calls (replaces litellm)
106
+ from hanzo import router
107
+ response = router.completion(
108
+ model="gpt-4",
109
+ messages=[{"role": "user", "content": "Hello!"}]
110
+ )
111
+
112
+ # Use agents
113
+ from hanzo import Agent, Network
114
+ agent = Agent(name="assistant")
115
+
116
+ # Use MCP tools
117
+ from hanzo import Tool, MCPServer
118
+
119
+ # Access AI SDK
120
+ from hanzo import Client
121
+ client = Client(api_key="...")
122
+ ```
123
+
124
+ ## Components
125
+
126
+ - **hanzo.router**: Unified LLM gateway (replaces litellm)
127
+ - **hanzo.mcp**: Model Context Protocol server and tools
128
+ - **hanzo.agents**: Agent runtime and orchestration
129
+ - **hanzo.memory**: Memory systems for agents
130
+ - **hanzo.Client**: Main AI SDK client
131
+
132
+ ## Documentation
133
+
134
+ - [Hanzo AI Docs](https://docs.hanzo.ai)
135
+ - [Router Documentation](https://docs.hanzo.ai/router)
136
+ - [MCP Documentation](https://docs.hanzo.ai/mcp)
137
+ - [Agent Documentation](https://docs.hanzo.ai/agents)
@@ -0,0 +1,27 @@
1
+ hanzo/__init__.py,sha256=_nqVYfS2Zw03KZbODuZL7wT7vGjTTEMCQJ6T97eQj48,168
2
+ hanzo/__main__.py,sha256=qRjwG8-7MHPOy3czoyDP9VK1GhEaJJsVeZcz2AG9NV0,104
3
+ hanzo/cli.py,sha256=rsVF_KJo8CIAGk27ivoE3aIMqJWoR8hsvP8cDb_X3Fw,9754
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/output.py,sha256=lROF8RDOkck7ySt1kiTlVlHZqx1E0B-PqcJc78ZHYOs,2694
24
+ hanzo-0.2.5.dist-info/METADATA,sha256=od4EnWzBDiPqBoAlmhLlnLR8wsImVU_J-ZCpZdpQuqc,4315
25
+ hanzo-0.2.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
26
+ hanzo-0.2.5.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
27
+ hanzo-0.2.5.dist-info/RECORD,,
@@ -1,74 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: hanzo
3
- Version: 0.2.2
4
- Summary: Hanzo AI - Complete AI Infrastructure Platform with CLI, Router, MCP, and Agent Runtime
5
- Project-URL: Homepage, https://hanzo.ai
6
- Project-URL: Repository, https://github.com/hanzoai/python-sdk
7
- Project-URL: Documentation, https://docs.hanzo.ai/cli
8
- Project-URL: Bug Tracker, https://github.com/hanzoai/python-sdk/issues
9
- Author-email: Hanzo AI <dev@hanzo.ai>
10
- Keywords: agents,ai,cli,hanzo,llm,local-ai,mcp,private-ai
11
- Classifier: Development Status :: 4 - Beta
12
- Classifier: Environment :: Console
13
- Classifier: Intended Audience :: Developers
14
- Classifier: License :: OSI Approved :: Apache Software License
15
- Classifier: Operating System :: OS Independent
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.8
18
- Classifier: Programming Language :: Python :: 3.9
19
- Classifier: Programming Language :: Python :: 3.10
20
- Classifier: Programming Language :: Python :: 3.11
21
- Classifier: Programming Language :: Python :: 3.12
22
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
23
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
- Requires-Python: >=3.8
25
- Requires-Dist: click>=8.1.0
26
- Requires-Dist: hanzo-cli>=0.1.0
27
- Requires-Dist: rich>=13.0.0
28
- Provides-Extra: agents
29
- Requires-Dist: hanzo-agents>=0.1.0; extra == 'agents'
30
- Requires-Dist: hanzo-network>=0.1.0; extra == 'agents'
31
- Provides-Extra: ai
32
- Requires-Dist: hanzoai>=1.0.0; extra == 'ai'
33
- Provides-Extra: all
34
- Requires-Dist: hanzo-aci>=0.2.8; extra == 'all'
35
- Requires-Dist: hanzo-agents>=0.1.0; extra == 'all'
36
- Requires-Dist: hanzo-mcp-client>=0.1.0; extra == 'all'
37
- Requires-Dist: hanzo-mcp>=0.7.0; extra == 'all'
38
- Requires-Dist: hanzo-memory>=1.0.0; extra == 'all'
39
- Requires-Dist: hanzo-network>=0.1.0; extra == 'all'
40
- Requires-Dist: hanzo-repl>=0.1.0; extra == 'all'
41
- Requires-Dist: hanzo-router>=1.74.3; extra == 'all'
42
- Requires-Dist: hanzoai>=1.0.0; extra == 'all'
43
- Provides-Extra: dev
44
- Requires-Dist: hanzo-aci>=0.2.8; extra == 'dev'
45
- Provides-Extra: mcp
46
- Requires-Dist: hanzo-mcp>=0.7.0; extra == 'mcp'
47
- Provides-Extra: repl
48
- Requires-Dist: hanzo-repl>=0.1.0; extra == 'repl'
49
- Requires-Dist: hanzo-router>=1.74.3; extra == 'repl'
50
- Provides-Extra: router
51
- Requires-Dist: hanzo-router>=1.74.3; extra == 'router'
52
- Description-Content-Type: text/markdown
53
-
54
- # Hanzo AI CLI
55
-
56
- This is the main `hanzo` package that provides the Hanzo AI CLI tool.
57
-
58
- ## Installation
59
-
60
- ```bash
61
- pip install hanzo
62
- ```
63
-
64
- ## Usage
65
-
66
- ```bash
67
- hanzo --help
68
- ```
69
-
70
- For more information, see the [hanzo-cli](https://pypi.org/project/hanzo-cli/) package.
71
-
72
- ## Note
73
-
74
- This package is a convenience wrapper around `hanzo-cli`. Both packages provide the same `hanzo` command-line tool.
@@ -1,9 +0,0 @@
1
- hanzo/__init__.py,sha256=0k__FKhxePI7TwN29mKW5kjP1uWxXF0bR8YFzv69HAY,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.2.dist-info/METADATA,sha256=101ZA4VYkZi_JOUq8xPGVKiVlxzdn4z1_A_gfmjpaOI,2689
7
- hanzo-0.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8
- hanzo-0.2.2.dist-info/entry_points.txt,sha256=pQLPMdqOXU_2BfTcMDhkqTCDNk_H6ApvYuSaWcuQOOw,171
9
- hanzo-0.2.2.dist-info/RECORD,,
File without changes