halyn 0.2.0__tar.gz

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.
Files changed (47) hide show
  1. halyn-0.2.0/LICENSE +15 -0
  2. halyn-0.2.0/PKG-INFO +246 -0
  3. halyn-0.2.0/README.md +210 -0
  4. halyn-0.2.0/pyproject.toml +49 -0
  5. halyn-0.2.0/setup.cfg +4 -0
  6. halyn-0.2.0/src/halyn/__init__.py +7 -0
  7. halyn-0.2.0/src/halyn/__main__.py +4 -0
  8. halyn-0.2.0/src/halyn/audit.py +278 -0
  9. halyn-0.2.0/src/halyn/auth.py +88 -0
  10. halyn-0.2.0/src/halyn/autonomy.py +262 -0
  11. halyn-0.2.0/src/halyn/cli.py +208 -0
  12. halyn-0.2.0/src/halyn/config.py +135 -0
  13. halyn-0.2.0/src/halyn/consent.py +243 -0
  14. halyn-0.2.0/src/halyn/control_plane.py +354 -0
  15. halyn-0.2.0/src/halyn/discovery.py +323 -0
  16. halyn-0.2.0/src/halyn/drivers/__init__.py +0 -0
  17. halyn-0.2.0/src/halyn/drivers/browser.py +60 -0
  18. halyn-0.2.0/src/halyn/drivers/dds.py +156 -0
  19. halyn-0.2.0/src/halyn/drivers/docker.py +62 -0
  20. halyn-0.2.0/src/halyn/drivers/http_auto.py +259 -0
  21. halyn-0.2.0/src/halyn/drivers/mqtt.py +93 -0
  22. halyn-0.2.0/src/halyn/drivers/opcua.py +77 -0
  23. halyn-0.2.0/src/halyn/drivers/ros2.py +124 -0
  24. halyn-0.2.0/src/halyn/drivers/serial.py +226 -0
  25. halyn-0.2.0/src/halyn/drivers/socket_raw.py +153 -0
  26. halyn-0.2.0/src/halyn/drivers/ssh.py +131 -0
  27. halyn-0.2.0/src/halyn/drivers/unitree.py +103 -0
  28. halyn-0.2.0/src/halyn/drivers/websocket.py +175 -0
  29. halyn-0.2.0/src/halyn/engine.py +222 -0
  30. halyn-0.2.0/src/halyn/intent.py +240 -0
  31. halyn-0.2.0/src/halyn/llm.py +178 -0
  32. halyn-0.2.0/src/halyn/mcp.py +239 -0
  33. halyn-0.2.0/src/halyn/memory/__init__.py +0 -0
  34. halyn-0.2.0/src/halyn/memory/store.py +200 -0
  35. halyn-0.2.0/src/halyn/nrp_bridge.py +213 -0
  36. halyn-0.2.0/src/halyn/py.typed +0 -0
  37. halyn-0.2.0/src/halyn/sanitizer.py +120 -0
  38. halyn-0.2.0/src/halyn/server.py +292 -0
  39. halyn-0.2.0/src/halyn/types.py +116 -0
  40. halyn-0.2.0/src/halyn/watchdog.py +252 -0
  41. halyn-0.2.0/src/halyn.egg-info/PKG-INFO +246 -0
  42. halyn-0.2.0/src/halyn.egg-info/SOURCES.txt +45 -0
  43. halyn-0.2.0/src/halyn.egg-info/dependency_links.txt +1 -0
  44. halyn-0.2.0/src/halyn.egg-info/entry_points.txt +2 -0
  45. halyn-0.2.0/src/halyn.egg-info/requires.txt +20 -0
  46. halyn-0.2.0/src/halyn.egg-info/top_level.txt +1 -0
  47. halyn-0.2.0/tests/test_halyn.py +978 -0
halyn-0.2.0/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Elmadani SALKA
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files, to deal in the Software
7
+ without restriction, including without limitation the rights to use, copy,
8
+ modify, merge, publish, distribute, sublicense, and/or sell copies of the
9
+ Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
halyn-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,246 @@
1
+ Metadata-Version: 2.4
2
+ Name: halyn
3
+ Version: 0.2.0
4
+ Summary: Halyn — NRP control plane with domain-scoped authorization.
5
+ Author-email: Elmadani SALKA <Elmadani.SALKA@proton.me>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/ElmadaniS/halyn
8
+ Project-URL: Repository, https://github.com/ElmadaniS/halyn
9
+ Project-URL: Issues, https://github.com/ElmadaniS/halyn/issues
10
+ Keywords: ai,browser,robotics,iot,mcp,nrp,llm,infrastructure,devops
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
+ Classifier: Topic :: System :: Systems Administration
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: nrp>=0.1.0
20
+ Requires-Dist: aiohttp>=3.9
21
+ Provides-Extra: enterprise
22
+ Requires-Dist: grpcio>=1.60; extra == "enterprise"
23
+ Requires-Dist: psycopg2-binary; extra == "enterprise"
24
+ Requires-Dist: redis; extra == "enterprise"
25
+ Provides-Extra: robotics
26
+ Requires-Dist: rclpy; extra == "robotics"
27
+ Requires-Dist: unitree-sdk2py; extra == "robotics"
28
+ Provides-Extra: iot
29
+ Requires-Dist: paho-mqtt; extra == "iot"
30
+ Provides-Extra: dev
31
+ Requires-Dist: pytest; extra == "dev"
32
+ Requires-Dist: pytest-asyncio; extra == "dev"
33
+ Requires-Dist: mypy; extra == "dev"
34
+ Requires-Dist: ruff; extra == "dev"
35
+ Dynamic: license-file
36
+
37
+ <div align="center">
38
+
39
+ <img src="logo.svg" width="80" alt="Halyn">
40
+
41
+ # Halyn
42
+
43
+ ### NRP Control Plane
44
+
45
+ **Connect any device to any LLM through NRP.**
46
+
47
+ NRP control plane with domain-scoped authorization.
48
+
49
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
50
+ [![Python 3.10+](https://img.shields.io/badge/Python-3.10+-green.svg)](https://python.org)
51
+ [![Tests](https://img.shields.io/badge/Tests-48%20passed-brightgreen.svg)]()
52
+ [![NRP](https://img.shields.io/badge/Protocol-NRP-orange.svg)](https://github.com/ElmadaniS/nrp)
53
+
54
+ </div>
55
+
56
+ ---
57
+
58
+ ```
59
+ you: "How's the factory?"
60
+
61
+ halyn: All 12 arms running. Arm-7 joint 3 is 12°C above normal.
62
+ Soil moisture in the north field dropped to 18%.
63
+ 3 urgent emails. Hetzner invoice due tomorrow.
64
+ Want me to handle any of these?
65
+ ```
66
+
67
+ ## What It Does
68
+
69
+ Halyn connects AI to:
70
+
71
+ | Domain | Examples |
72
+ |--------|----------|
73
+ | **Servers** | Deploy, monitor, fix, scale |
74
+ | **Robots** | Move, pick, navigate, patrol |
75
+ | **Sensors** | Temperature, humidity, soil, air |
76
+ | **APIs** | Stripe, GitHub, Slack — any REST/GraphQL |
77
+ | **Factories** | PLCs, SCADA, OPC-UA, Modbus |
78
+ | **Smart Home** | Lights, climate, security |
79
+ | **Vehicles** | Navigate, charge, maintain |
80
+ | **Drones** | Survey, photograph, deliver |
81
+
82
+ One protocol. One conversation. Everything.
83
+
84
+ ## Quick Start
85
+
86
+ ```bash
87
+ pip install halyn
88
+
89
+ halyn scan # discover your world
90
+ halyn connect # plug your LLM
91
+ halyn serve # start running
92
+ ```
93
+
94
+ ## Any LLM
95
+
96
+ ```yaml
97
+ # halyn.yml
98
+ llm:
99
+ provider: claude # or: openai, ollama, huggingface, vllm
100
+ model: claude-sonnet-4-20250514
101
+ ```
102
+
103
+ Halyn doesn't lock you in. Claude today. Local Ollama tomorrow. Same nodes. Same drivers. Same safety.
104
+
105
+ ## Human Always in Control
106
+
107
+ 5 autonomy levels. Per domain. Per node. Per hour.
108
+
109
+ | Level | Name | Behavior |
110
+ |-------|------|----------|
111
+ | 0 | **Manual** | AI proposes. You approve every action. |
112
+ | 1 | **Supervised** | AI reads alone. Asks before acting. |
113
+ | 2 | **Guided** | Safe actions alone. Dangerous = confirm. |
114
+ | 3 | **Autonomous** | Does everything. You can interrupt anytime. |
115
+ | 4 | **Full Auto** | Handles routine. Reports daily. |
116
+
117
+ ```yaml
118
+ # halyn.yml
119
+ domains:
120
+ physical:
121
+ level: 1 # supervised
122
+ nodes: [robot/*, drone/*]
123
+ confirm: [move, pick, deploy]
124
+
125
+ financial:
126
+ level: 0 # manual — confirm everything
127
+ nodes: [finance/*, bank/*]
128
+ blocked: [delete]
129
+
130
+ monitoring:
131
+ level: 4 # full auto
132
+ nodes: [sensor/*, monitor/*]
133
+
134
+ infrastructure:
135
+ level: 2 # guided
136
+ nodes: [server/*, cloud/*]
137
+ confirm: [restart, deploy, delete]
138
+ ```
139
+
140
+ Your banking requires approval for every action. Your sensors run on autopilot. Your servers auto-handle safe ops but confirm deploys. You set the rails once. The AI rides them.
141
+
142
+ ## Security
143
+
144
+ Not optional. Not a feature. The foundation.
145
+
146
+ | Layer | What It Does |
147
+ |-------|-------------|
148
+ | **Auth** | API key with timing-safe HMAC |
149
+ | **Autonomy** | 5 levels per domain, rate limiting |
150
+ | **Shield** | Per-node safety rules from NRP |
151
+ | **Sanitizer** | Injection, traversal, overflow protection |
152
+ | **Audit** | SHA-256 hash-chain on disk, tamper-detectable |
153
+ | **Watchdog** | Health monitoring, failsafe on crash |
154
+ | **Redaction** | No internal paths or secrets in errors |
155
+
156
+ If Halyn crashes, nodes enter safe state automatically.
157
+
158
+ The audit trail is a hash chain. Tamper with one entry and the chain breaks. Every action records: who asked, which AI decided, what reasoning, what result, which domain policy authorized it.
159
+
160
+ ## Architecture
161
+
162
+ ```
163
+ Any LLM
164
+ │ MCP
165
+
166
+ Halyn Control Plane
167
+ │ ┌─ Autonomy (5 levels)
168
+ │ ├─ Audit (SHA-256 chain)
169
+ │ ├─ Watchdog (failsafe)
170
+ │ ├─ Auth + Sanitizer
171
+ │ └─ Memory (SQLite + FTS5)
172
+
173
+ │ NRP (Node Reach Protocol)
174
+
175
+ ├──→ SSH (servers)
176
+ ├──→ Docker (containers)
177
+ ├──→ Chrome CDP (browsers)
178
+ ├──→ ROS2 (robots)
179
+ ├──→ Unitree (humanoids)
180
+ ├──→ MQTT (IoT sensors)
181
+ ├──→ OPC-UA (industrial PLCs)
182
+ ├──→ HTTP Auto (any API — auto-introspected)
183
+ └──→ Your driver (~100 lines)
184
+ ```
185
+
186
+ ## HTTP Auto-Introspection
187
+
188
+ Point Halyn at any API. It reads the OpenAPI/GraphQL spec. Generates the manifest. Creates the tools. Automatically.
189
+
190
+ ```yaml
191
+ nodes:
192
+ - id: nrp://cloud/api/stripe
193
+ driver: http_auto
194
+ base_url: https://api.stripe.com/v1
195
+ auth_token: Bearer ${STRIPE_API_KEY}
196
+
197
+ - id: nrp://cloud/api/github
198
+ driver: http_auto
199
+ base_url: https://api.github.com
200
+ auth_token: Bearer ${GITHUB_TOKEN}
201
+ ```
202
+
203
+ Any API in the world becomes an NRP node. Zero custom code.
204
+
205
+ ## Docker
206
+
207
+ ```bash
208
+ docker compose up -d
209
+ ```
210
+
211
+ ```yaml
212
+ # docker-compose.yml included — non-root, healthcheck, resource limits
213
+ ```
214
+
215
+ ## Stats
216
+
217
+ | Metric | Value |
218
+ |--------|-------|
219
+ | Source lines | ~5,200 |
220
+ | Drivers | 9 |
221
+ | LLM connectors | 5 (Claude, GPT, Ollama, HF, vLLM) |
222
+ | Tests | 48 passed, 0 failed |
223
+ | Dependencies | 1 (aiohttp) |
224
+ | Docker image | ~150MB |
225
+ | MCP native | Yes (Claude.ai direct) |
226
+ | Tested on | Real hardware across 3 countries |
227
+
228
+ ## Built on NRP
229
+
230
+ Halyn implements the [Node Reach Protocol](https://github.com/ElmadaniS/nrp) — the universal standard for AI-to-world control. Any NRP-compatible device works with Halyn automatically.
231
+
232
+ ## Contributing
233
+
234
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
235
+
236
+ ## Security
237
+
238
+ See [SECURITY.md](SECURITY.md). Report vulnerabilities to Elmadani.SALKA@proton.me.
239
+
240
+ ## License
241
+
242
+ MIT
243
+
244
+ ## Author
245
+
246
+ **Elmadani SALKA**
halyn-0.2.0/README.md ADDED
@@ -0,0 +1,210 @@
1
+ <div align="center">
2
+
3
+ <img src="logo.svg" width="80" alt="Halyn">
4
+
5
+ # Halyn
6
+
7
+ ### NRP Control Plane
8
+
9
+ **Connect any device to any LLM through NRP.**
10
+
11
+ NRP control plane with domain-scoped authorization.
12
+
13
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
14
+ [![Python 3.10+](https://img.shields.io/badge/Python-3.10+-green.svg)](https://python.org)
15
+ [![Tests](https://img.shields.io/badge/Tests-48%20passed-brightgreen.svg)]()
16
+ [![NRP](https://img.shields.io/badge/Protocol-NRP-orange.svg)](https://github.com/ElmadaniS/nrp)
17
+
18
+ </div>
19
+
20
+ ---
21
+
22
+ ```
23
+ you: "How's the factory?"
24
+
25
+ halyn: All 12 arms running. Arm-7 joint 3 is 12°C above normal.
26
+ Soil moisture in the north field dropped to 18%.
27
+ 3 urgent emails. Hetzner invoice due tomorrow.
28
+ Want me to handle any of these?
29
+ ```
30
+
31
+ ## What It Does
32
+
33
+ Halyn connects AI to:
34
+
35
+ | Domain | Examples |
36
+ |--------|----------|
37
+ | **Servers** | Deploy, monitor, fix, scale |
38
+ | **Robots** | Move, pick, navigate, patrol |
39
+ | **Sensors** | Temperature, humidity, soil, air |
40
+ | **APIs** | Stripe, GitHub, Slack — any REST/GraphQL |
41
+ | **Factories** | PLCs, SCADA, OPC-UA, Modbus |
42
+ | **Smart Home** | Lights, climate, security |
43
+ | **Vehicles** | Navigate, charge, maintain |
44
+ | **Drones** | Survey, photograph, deliver |
45
+
46
+ One protocol. One conversation. Everything.
47
+
48
+ ## Quick Start
49
+
50
+ ```bash
51
+ pip install halyn
52
+
53
+ halyn scan # discover your world
54
+ halyn connect # plug your LLM
55
+ halyn serve # start running
56
+ ```
57
+
58
+ ## Any LLM
59
+
60
+ ```yaml
61
+ # halyn.yml
62
+ llm:
63
+ provider: claude # or: openai, ollama, huggingface, vllm
64
+ model: claude-sonnet-4-20250514
65
+ ```
66
+
67
+ Halyn doesn't lock you in. Claude today. Local Ollama tomorrow. Same nodes. Same drivers. Same safety.
68
+
69
+ ## Human Always in Control
70
+
71
+ 5 autonomy levels. Per domain. Per node. Per hour.
72
+
73
+ | Level | Name | Behavior |
74
+ |-------|------|----------|
75
+ | 0 | **Manual** | AI proposes. You approve every action. |
76
+ | 1 | **Supervised** | AI reads alone. Asks before acting. |
77
+ | 2 | **Guided** | Safe actions alone. Dangerous = confirm. |
78
+ | 3 | **Autonomous** | Does everything. You can interrupt anytime. |
79
+ | 4 | **Full Auto** | Handles routine. Reports daily. |
80
+
81
+ ```yaml
82
+ # halyn.yml
83
+ domains:
84
+ physical:
85
+ level: 1 # supervised
86
+ nodes: [robot/*, drone/*]
87
+ confirm: [move, pick, deploy]
88
+
89
+ financial:
90
+ level: 0 # manual — confirm everything
91
+ nodes: [finance/*, bank/*]
92
+ blocked: [delete]
93
+
94
+ monitoring:
95
+ level: 4 # full auto
96
+ nodes: [sensor/*, monitor/*]
97
+
98
+ infrastructure:
99
+ level: 2 # guided
100
+ nodes: [server/*, cloud/*]
101
+ confirm: [restart, deploy, delete]
102
+ ```
103
+
104
+ Your banking requires approval for every action. Your sensors run on autopilot. Your servers auto-handle safe ops but confirm deploys. You set the rails once. The AI rides them.
105
+
106
+ ## Security
107
+
108
+ Not optional. Not a feature. The foundation.
109
+
110
+ | Layer | What It Does |
111
+ |-------|-------------|
112
+ | **Auth** | API key with timing-safe HMAC |
113
+ | **Autonomy** | 5 levels per domain, rate limiting |
114
+ | **Shield** | Per-node safety rules from NRP |
115
+ | **Sanitizer** | Injection, traversal, overflow protection |
116
+ | **Audit** | SHA-256 hash-chain on disk, tamper-detectable |
117
+ | **Watchdog** | Health monitoring, failsafe on crash |
118
+ | **Redaction** | No internal paths or secrets in errors |
119
+
120
+ If Halyn crashes, nodes enter safe state automatically.
121
+
122
+ The audit trail is a hash chain. Tamper with one entry and the chain breaks. Every action records: who asked, which AI decided, what reasoning, what result, which domain policy authorized it.
123
+
124
+ ## Architecture
125
+
126
+ ```
127
+ Any LLM
128
+ │ MCP
129
+
130
+ Halyn Control Plane
131
+ │ ┌─ Autonomy (5 levels)
132
+ │ ├─ Audit (SHA-256 chain)
133
+ │ ├─ Watchdog (failsafe)
134
+ │ ├─ Auth + Sanitizer
135
+ │ └─ Memory (SQLite + FTS5)
136
+
137
+ │ NRP (Node Reach Protocol)
138
+
139
+ ├──→ SSH (servers)
140
+ ├──→ Docker (containers)
141
+ ├──→ Chrome CDP (browsers)
142
+ ├──→ ROS2 (robots)
143
+ ├──→ Unitree (humanoids)
144
+ ├──→ MQTT (IoT sensors)
145
+ ├──→ OPC-UA (industrial PLCs)
146
+ ├──→ HTTP Auto (any API — auto-introspected)
147
+ └──→ Your driver (~100 lines)
148
+ ```
149
+
150
+ ## HTTP Auto-Introspection
151
+
152
+ Point Halyn at any API. It reads the OpenAPI/GraphQL spec. Generates the manifest. Creates the tools. Automatically.
153
+
154
+ ```yaml
155
+ nodes:
156
+ - id: nrp://cloud/api/stripe
157
+ driver: http_auto
158
+ base_url: https://api.stripe.com/v1
159
+ auth_token: Bearer ${STRIPE_API_KEY}
160
+
161
+ - id: nrp://cloud/api/github
162
+ driver: http_auto
163
+ base_url: https://api.github.com
164
+ auth_token: Bearer ${GITHUB_TOKEN}
165
+ ```
166
+
167
+ Any API in the world becomes an NRP node. Zero custom code.
168
+
169
+ ## Docker
170
+
171
+ ```bash
172
+ docker compose up -d
173
+ ```
174
+
175
+ ```yaml
176
+ # docker-compose.yml included — non-root, healthcheck, resource limits
177
+ ```
178
+
179
+ ## Stats
180
+
181
+ | Metric | Value |
182
+ |--------|-------|
183
+ | Source lines | ~5,200 |
184
+ | Drivers | 9 |
185
+ | LLM connectors | 5 (Claude, GPT, Ollama, HF, vLLM) |
186
+ | Tests | 48 passed, 0 failed |
187
+ | Dependencies | 1 (aiohttp) |
188
+ | Docker image | ~150MB |
189
+ | MCP native | Yes (Claude.ai direct) |
190
+ | Tested on | Real hardware across 3 countries |
191
+
192
+ ## Built on NRP
193
+
194
+ Halyn implements the [Node Reach Protocol](https://github.com/ElmadaniS/nrp) — the universal standard for AI-to-world control. Any NRP-compatible device works with Halyn automatically.
195
+
196
+ ## Contributing
197
+
198
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
199
+
200
+ ## Security
201
+
202
+ See [SECURITY.md](SECURITY.md). Report vulnerabilities to Elmadani.SALKA@proton.me.
203
+
204
+ ## License
205
+
206
+ MIT
207
+
208
+ ## Author
209
+
210
+ **Elmadani SALKA**
@@ -0,0 +1,49 @@
1
+ [project]
2
+ name = "halyn"
3
+ version = "0.2.0"
4
+ description = "Halyn — NRP control plane with domain-scoped authorization."
5
+ requires-python = ">=3.10"
6
+ license = {text = "MIT"}
7
+ authors = [{name = "Elmadani SALKA", email = "Elmadani.SALKA@proton.me"}]
8
+ readme = "README.md"
9
+ keywords = ["ai", "browser", "robotics", "iot", "mcp", "nrp", "llm", "infrastructure", "devops"]
10
+ classifiers = [
11
+ "Development Status :: 3 - Alpha",
12
+ "License :: OSI Approved :: MIT License",
13
+ "Programming Language :: Python :: 3",
14
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
15
+ "Topic :: System :: Systems Administration",
16
+ ]
17
+
18
+ dependencies = [
19
+ "nrp>=0.1.0",
20
+ "aiohttp>=3.9",
21
+ ]
22
+
23
+ [project.optional-dependencies]
24
+ enterprise = ["grpcio>=1.60", "psycopg2-binary", "redis"]
25
+ robotics = ["rclpy", "unitree-sdk2py"]
26
+ iot = ["paho-mqtt"]
27
+ dev = ["pytest", "pytest-asyncio", "mypy", "ruff"]
28
+
29
+ [project.scripts]
30
+ halyn = "halyn.cli:main"
31
+
32
+ [project.urls]
33
+ Homepage = "https://github.com/ElmadaniS/halyn"
34
+ Repository = "https://github.com/ElmadaniS/halyn"
35
+ Issues = "https://github.com/ElmadaniS/halyn/issues"
36
+
37
+ [tool.setuptools.packages.find]
38
+ where = ["src"]
39
+
40
+ [tool.ruff]
41
+ line-length = 100
42
+ target-version = "py310"
43
+
44
+ [tool.mypy]
45
+ strict = true
46
+
47
+ [build-system]
48
+ requires = ["setuptools>=68"]
49
+ build-backend = "setuptools.build_meta"
halyn-0.2.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ # Copyright (c) 2026 Elmadani SALKA. All rights reserved.
2
+ # Licensed under the MIT License. See LICENSE file.
3
+ """Halyn — NRP control plane with domain-scoped authorization."""
4
+
5
+ __version__ = "0.2.0"
6
+ __author__ = "Elmadani SALKA"
7
+ __license__ = "MIT"
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2026 Elmadani SALKA. All rights reserved.
2
+ # Licensed under the MIT License. See LICENSE file.
3
+ from .cli import main
4
+ main()