halyn 2.2.4__tar.gz → 2.2.5__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 (63) hide show
  1. {halyn-2.2.4/src/halyn.egg-info → halyn-2.2.5}/PKG-INFO +32 -23
  2. {halyn-2.2.4 → halyn-2.2.5}/README.md +29 -19
  3. {halyn-2.2.4 → halyn-2.2.5}/pyproject.toml +3 -4
  4. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/dashboard.py +23 -0
  5. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/proxy.py +0 -2
  6. {halyn-2.2.4 → halyn-2.2.5/src/halyn.egg-info}/PKG-INFO +32 -23
  7. {halyn-2.2.4 → halyn-2.2.5}/LICENSE +0 -0
  8. {halyn-2.2.4 → halyn-2.2.5}/setup.cfg +0 -0
  9. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/__init__.py +0 -0
  10. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/__main__.py +0 -0
  11. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/_nrp/__init__.py +0 -0
  12. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/_nrp/driver.py +0 -0
  13. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/_nrp/events.py +0 -0
  14. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/_nrp/identity.py +0 -0
  15. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/_nrp/manifest.py +0 -0
  16. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/audit.py +0 -0
  17. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/auth.py +0 -0
  18. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/autonomy.py +0 -0
  19. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/cli.py +0 -0
  20. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/config.py +0 -0
  21. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/consent.py +0 -0
  22. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/control_plane.py +0 -0
  23. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/discovery.py +0 -0
  24. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/__init__.py +0 -0
  25. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/browser.py +0 -0
  26. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/dds.py +0 -0
  27. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/docker.py +0 -0
  28. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/http_auto.py +0 -0
  29. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/mqtt.py +0 -0
  30. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/opcua.py +0 -0
  31. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/ros2.py +0 -0
  32. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/serial.py +0 -0
  33. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/socket_raw.py +0 -0
  34. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/ssh.py +0 -0
  35. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/unitree.py +0 -0
  36. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/drivers/websocket.py +0 -0
  37. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/engine.py +0 -0
  38. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/integrations/__init__.py +0 -0
  39. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/intent.py +0 -0
  40. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/llm.py +0 -0
  41. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/mcp.py +0 -0
  42. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/mcp_serve.py +0 -0
  43. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/memory/__init__.py +0 -0
  44. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/memory/store.py +0 -0
  45. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/nrp_bridge.py +0 -0
  46. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/py.typed +0 -0
  47. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/redteam.py +0 -0
  48. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/sanitizer.py +0 -0
  49. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/__init__.py +0 -0
  50. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/audit_guard.py +0 -0
  51. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/ebpf_monitor.py +0 -0
  52. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/fs_watch.py +0 -0
  53. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/security/process_guard.py +0 -0
  54. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/server.py +0 -0
  55. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/shield.py +0 -0
  56. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/types.py +0 -0
  57. {halyn-2.2.4 → halyn-2.2.5}/src/halyn/watchdog.py +0 -0
  58. {halyn-2.2.4 → halyn-2.2.5}/src/halyn.egg-info/SOURCES.txt +0 -0
  59. {halyn-2.2.4 → halyn-2.2.5}/src/halyn.egg-info/dependency_links.txt +0 -0
  60. {halyn-2.2.4 → halyn-2.2.5}/src/halyn.egg-info/entry_points.txt +0 -0
  61. {halyn-2.2.4 → halyn-2.2.5}/src/halyn.egg-info/requires.txt +0 -0
  62. {halyn-2.2.4 → halyn-2.2.5}/src/halyn.egg-info/top_level.txt +0 -0
  63. {halyn-2.2.4 → halyn-2.2.5}/tests/test_halyn.py +0 -0
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: halyn
3
- Version: 2.2.4
3
+ Version: 2.2.5
4
4
  Summary: Halyn — The governance layer for AI agents. Every action intercepted. Every decision auditable.
5
5
  Author-email: Elmadani SALKA <contact@halyn.dev>
6
- License-Expression: BUSL-1.1
6
+ License: BUSL-1.1
7
7
  Project-URL: Homepage, https://halyn.dev
8
8
  Project-URL: Repository, https://github.com/halyndev/halyn
9
9
  Project-URL: Issues, https://github.com/halyndev/halyn/issues
@@ -29,7 +29,6 @@ Requires-Dist: pytest; extra == "dev"
29
29
  Requires-Dist: pytest-asyncio; extra == "dev"
30
30
  Requires-Dist: mypy; extra == "dev"
31
31
  Requires-Dist: ruff; extra == "dev"
32
- Dynamic: license-file
33
32
 
34
33
  <div align="center">
35
34
 
@@ -83,7 +82,7 @@ Every action produces a cryptographic proof stored locally. Not in the cloud. No
83
82
  **Option 1 — pip** (Python 3.10+):
84
83
 
85
84
  ```bash
86
- pip install halyn==2.1.3
85
+ pip install halyn==2.2.4
87
86
  halyn serve
88
87
  ```
89
88
 
@@ -101,23 +100,33 @@ The curl script verifies your Python version and asks permission before doing an
101
100
  ## Quick Start
102
101
 
103
102
  ```python
104
- from halyn import ControlPlane
105
-
106
- # Start the governance layer
107
- gov = ControlPlane()
108
- gov.serve() # dashboard at localhost:7420
109
-
110
- # Register an agent
111
- agent = gov.register_agent(
112
- name="claude-cowork",
113
- provider="anthropic",
114
- autonomy_level=2, # executor — reversible actions only
115
- )
116
-
117
- # Every agent action is intercepted and recorded
118
- result = agent.act("read_file", "/docs/contract.pdf")
119
- print(result.proof) # sha256:a3f2e1...
120
- print(result.allowed) # True
103
+ from halyn.control_plane import ControlPlane
104
+ from halyn.config import HalynConfig
105
+
106
+ # Start the control plane (or run `halyn serve` from CLI)
107
+ cp = ControlPlane(HalynConfig())
108
+
109
+ # Every node action passes through the pipeline:
110
+ # Consent → Shield → Execute → Audit
111
+ import asyncio
112
+ async def main():
113
+ await cp.start()
114
+ result = await cp.execute(
115
+ "myserver.observe",
116
+ {"channels": "cpu,ram"},
117
+ user_id="me",
118
+ intent_text="Check server load",
119
+ )
120
+ print(result.ok) # True
121
+ print(result.data) # {"cpu": 42.1, "ram": 67.3}
122
+
123
+ # Audit chain — cryptographic proof of every action
124
+ entries = cp.audit.query(limit=5)
125
+ valid, count, msg = cp.audit.verify_chain()
126
+ print(msg) # "Chain valid (N entries)"
127
+ await cp.stop()
128
+
129
+ asyncio.run(main())
121
130
  ```
122
131
 
123
132
  ---
@@ -228,7 +237,7 @@ Halyn intercepts any agentic system. The agent framework doesn't matter.
228
237
  | **AutoGen** | API calls intercepted automatically |
229
238
  | **CrewAI** | API calls intercepted automatically |
230
239
  | **Semantic Kernel** | API calls intercepted automatically |
231
- | **BeeQ** | Native AAP integration |
240
+ | **Any AAP client** | Native AAP integration |
232
241
  | **Any MCP agent** | MCP server passthrough |
233
242
  | **Any A2A agent** | Network-level interception |
234
243
  | **Any OpenAI-compatible API** | Universal proxy compatibility |
@@ -50,7 +50,7 @@ Every action produces a cryptographic proof stored locally. Not in the cloud. No
50
50
  **Option 1 — pip** (Python 3.10+):
51
51
 
52
52
  ```bash
53
- pip install halyn==2.1.3
53
+ pip install halyn==2.2.4
54
54
  halyn serve
55
55
  ```
56
56
 
@@ -68,23 +68,33 @@ The curl script verifies your Python version and asks permission before doing an
68
68
  ## Quick Start
69
69
 
70
70
  ```python
71
- from halyn import ControlPlane
72
-
73
- # Start the governance layer
74
- gov = ControlPlane()
75
- gov.serve() # dashboard at localhost:7420
76
-
77
- # Register an agent
78
- agent = gov.register_agent(
79
- name="claude-cowork",
80
- provider="anthropic",
81
- autonomy_level=2, # executor — reversible actions only
82
- )
83
-
84
- # Every agent action is intercepted and recorded
85
- result = agent.act("read_file", "/docs/contract.pdf")
86
- print(result.proof) # sha256:a3f2e1...
87
- print(result.allowed) # True
71
+ from halyn.control_plane import ControlPlane
72
+ from halyn.config import HalynConfig
73
+
74
+ # Start the control plane (or run `halyn serve` from CLI)
75
+ cp = ControlPlane(HalynConfig())
76
+
77
+ # Every node action passes through the pipeline:
78
+ # Consent → Shield → Execute → Audit
79
+ import asyncio
80
+ async def main():
81
+ await cp.start()
82
+ result = await cp.execute(
83
+ "myserver.observe",
84
+ {"channels": "cpu,ram"},
85
+ user_id="me",
86
+ intent_text="Check server load",
87
+ )
88
+ print(result.ok) # True
89
+ print(result.data) # {"cpu": 42.1, "ram": 67.3}
90
+
91
+ # Audit chain — cryptographic proof of every action
92
+ entries = cp.audit.query(limit=5)
93
+ valid, count, msg = cp.audit.verify_chain()
94
+ print(msg) # "Chain valid (N entries)"
95
+ await cp.stop()
96
+
97
+ asyncio.run(main())
88
98
  ```
89
99
 
90
100
  ---
@@ -195,7 +205,7 @@ Halyn intercepts any agentic system. The agent framework doesn't matter.
195
205
  | **AutoGen** | API calls intercepted automatically |
196
206
  | **CrewAI** | API calls intercepted automatically |
197
207
  | **Semantic Kernel** | API calls intercepted automatically |
198
- | **BeeQ** | Native AAP integration |
208
+ | **Any AAP client** | Native AAP integration |
199
209
  | **Any MCP agent** | MCP server passthrough |
200
210
  | **Any A2A agent** | Network-level interception |
201
211
  | **Any OpenAI-compatible API** | Universal proxy compatibility |
@@ -1,10 +1,9 @@
1
1
  [project]
2
2
  name = "halyn"
3
- version = "2.2.4"
3
+ version = "2.2.5"
4
4
  description = "Halyn — The governance layer for AI agents. Every action intercepted. Every decision auditable."
5
5
  requires-python = ">=3.10"
6
- license = "BUSL-1.1"
7
- license-files = ["LICENSE"]
6
+ license = {text = "BUSL-1.1"}
8
7
  authors = [{name = "Elmadani SALKA", email = "contact@halyn.dev"}]
9
8
  readme = "README.md"
10
9
  keywords = [
@@ -46,7 +45,7 @@ where = ["src"]
46
45
  halyn = ["py.typed"]
47
46
 
48
47
  [build-system]
49
- requires = ["setuptools>=77", "wheel"]
48
+ requires = ["setuptools>=61,<77", "wheel"]
50
49
  build-backend = "setuptools.build_meta"
51
50
 
52
51
  [tool.ruff]
@@ -181,6 +181,29 @@ body{background:var(--bg);color:var(--fg);font-family:var(--font);height:100vh;d
181
181
  ::-webkit-scrollbar{width:4px}
182
182
  ::-webkit-scrollbar-track{background:transparent}
183
183
  ::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}
184
+
185
+ /* ── MOBILE ─────────────────────────────────────────── */
186
+ @media(max-width:700px){
187
+ body{height:auto;overflow:auto}
188
+ .topbar{padding:.5rem .75rem}
189
+ .version{display:none}
190
+ #estop-btn{font-size:.65rem;padding:.2rem .5rem}
191
+ .statstrip{flex-wrap:wrap}
192
+ .stat{flex:1 1 33%;min-width:0;padding:.5rem .6rem;border-bottom:1px solid var(--border)}
193
+ .stat .v{font-size:1.1rem}
194
+ .stat .l{font-size:.6rem}
195
+ .main{grid-template-columns:1fr;overflow:visible}
196
+ .col{border-right:none;border-bottom:1px solid var(--border);overflow:visible}
197
+ .col:last-child{border-bottom:none}
198
+ .panel{overflow:visible}
199
+ .panel-body{overflow:visible;max-height:none}
200
+ .audit-row{grid-template-columns:50px 1fr 45px;font-size:.68rem}
201
+ .audit-row .hash{display:none}
202
+ .cmd-input-row{flex-direction:column;gap:.4rem}
203
+ .cmd-input{width:100%}
204
+ .cmd-send{width:100%;text-align:center}
205
+ .cmd-history{min-height:120px;max-height:200px;overflow-y:auto}
206
+ }
184
207
  </style>
185
208
  </head>
186
209
  <body>
@@ -140,8 +140,6 @@ class HalynProxy:
140
140
  """
141
141
  Apply shield rules. Returns (blocked, reason).
142
142
 
143
- Note: PHY §2 (physical world irreversibility rule) belongs to BeeQ,
144
- not Halyn. Halyn intercepts and audits. BeeQ decides based on PHY laws.
145
143
  Halyn shields are generic destructive pattern detection.
146
144
  """
147
145
  blocked_patterns = ["delete all", "rm -rf", "format disk", "drop database"]
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: halyn
3
- Version: 2.2.4
3
+ Version: 2.2.5
4
4
  Summary: Halyn — The governance layer for AI agents. Every action intercepted. Every decision auditable.
5
5
  Author-email: Elmadani SALKA <contact@halyn.dev>
6
- License-Expression: BUSL-1.1
6
+ License: BUSL-1.1
7
7
  Project-URL: Homepage, https://halyn.dev
8
8
  Project-URL: Repository, https://github.com/halyndev/halyn
9
9
  Project-URL: Issues, https://github.com/halyndev/halyn/issues
@@ -29,7 +29,6 @@ Requires-Dist: pytest; extra == "dev"
29
29
  Requires-Dist: pytest-asyncio; extra == "dev"
30
30
  Requires-Dist: mypy; extra == "dev"
31
31
  Requires-Dist: ruff; extra == "dev"
32
- Dynamic: license-file
33
32
 
34
33
  <div align="center">
35
34
 
@@ -83,7 +82,7 @@ Every action produces a cryptographic proof stored locally. Not in the cloud. No
83
82
  **Option 1 — pip** (Python 3.10+):
84
83
 
85
84
  ```bash
86
- pip install halyn==2.1.3
85
+ pip install halyn==2.2.4
87
86
  halyn serve
88
87
  ```
89
88
 
@@ -101,23 +100,33 @@ The curl script verifies your Python version and asks permission before doing an
101
100
  ## Quick Start
102
101
 
103
102
  ```python
104
- from halyn import ControlPlane
105
-
106
- # Start the governance layer
107
- gov = ControlPlane()
108
- gov.serve() # dashboard at localhost:7420
109
-
110
- # Register an agent
111
- agent = gov.register_agent(
112
- name="claude-cowork",
113
- provider="anthropic",
114
- autonomy_level=2, # executor — reversible actions only
115
- )
116
-
117
- # Every agent action is intercepted and recorded
118
- result = agent.act("read_file", "/docs/contract.pdf")
119
- print(result.proof) # sha256:a3f2e1...
120
- print(result.allowed) # True
103
+ from halyn.control_plane import ControlPlane
104
+ from halyn.config import HalynConfig
105
+
106
+ # Start the control plane (or run `halyn serve` from CLI)
107
+ cp = ControlPlane(HalynConfig())
108
+
109
+ # Every node action passes through the pipeline:
110
+ # Consent → Shield → Execute → Audit
111
+ import asyncio
112
+ async def main():
113
+ await cp.start()
114
+ result = await cp.execute(
115
+ "myserver.observe",
116
+ {"channels": "cpu,ram"},
117
+ user_id="me",
118
+ intent_text="Check server load",
119
+ )
120
+ print(result.ok) # True
121
+ print(result.data) # {"cpu": 42.1, "ram": 67.3}
122
+
123
+ # Audit chain — cryptographic proof of every action
124
+ entries = cp.audit.query(limit=5)
125
+ valid, count, msg = cp.audit.verify_chain()
126
+ print(msg) # "Chain valid (N entries)"
127
+ await cp.stop()
128
+
129
+ asyncio.run(main())
121
130
  ```
122
131
 
123
132
  ---
@@ -228,7 +237,7 @@ Halyn intercepts any agentic system. The agent framework doesn't matter.
228
237
  | **AutoGen** | API calls intercepted automatically |
229
238
  | **CrewAI** | API calls intercepted automatically |
230
239
  | **Semantic Kernel** | API calls intercepted automatically |
231
- | **BeeQ** | Native AAP integration |
240
+ | **Any AAP client** | Native AAP integration |
232
241
  | **Any MCP agent** | MCP server passthrough |
233
242
  | **Any A2A agent** | Network-level interception |
234
243
  | **Any OpenAI-compatible API** | Universal proxy compatibility |
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes