admina-framework 0.9.3__tar.gz → 0.9.4__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.
- {admina_framework-0.9.3/admina_framework.egg-info → admina_framework-0.9.4}/PKG-INFO +293 -139
- {admina_framework-0.9.3 → admina_framework-0.9.4}/README.md +290 -138
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/__init__.py +1 -1
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/forensic.py +108 -4
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/engine_bridge.py +5 -60
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/governed_model.py +3 -1
- {admina_framework-0.9.3 → admina_framework-0.9.4/admina_framework.egg-info}/PKG-INFO +293 -139
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina_framework.egg-info/SOURCES.txt +2 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina_framework.egg-info/requires.txt +3 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/pyproject.toml +34 -2
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_benchmark_14us.py +9 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_domains.py +3 -26
- admina_framework-0.9.4/tests/test_firewall_parity.py +176 -0
- admina_framework-0.9.4/tests/test_forensic_blackbox.py +266 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/LICENSE +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/NOTICE +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/commands/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/main.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/admina.yaml.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/docker-compose.yml.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/env.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/main.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/plugin.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/plugin_pyproject.toml.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/plugin_readme.md.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/cli/templates/plugin_test.py.j2 +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/core/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/core/config.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/core/event_bus.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/core/secrets.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/core/types.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/dashboard/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/dashboard/static/heimdall.png +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/dashboard/static/index.html +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/dashboard/static/vendor/alpinejs.min.js +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/agent_security/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/agent_security/firewall.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/agent_security/loop_breaker.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/ai_infra/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/ai_infra/llm_engine.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/ai_infra/rag.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/ai_infra/webui.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/cross_regulation.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/gdpr.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/nis2.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/oisg.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/compliance/otel.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/data_sovereignty/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/data_sovereignty/classification.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/data_sovereignty/pii.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/domains/data_sovereignty/residency.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/_engines.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/cheshirecat/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/cheshirecat/admina-plugin/admina_governance.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/crewai/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/crewai/callbacks.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/langchain/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/langchain/callbacks.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/n8n/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/integrations/openclaw/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/base.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/ollama.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/openai.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/log.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/webhook.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/auth/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/auth/apikey.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/eu_ai_act.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/chromadb.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/filesystem.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/filesystem.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/minio.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/guards/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/guards/guardrailsai_guard.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/pii/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/pii/spacy_regex.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/transports/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/transports/http_rest.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/builtin/transports/mcp.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/plugins/registry.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/api/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/api/dashboard.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/api/integration.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/config.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/governance.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/main.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/multi_upstream.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/proxy/state.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/py.typed +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/__init__.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/_compat.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/compliance_kit.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/governed_agent.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina/sdk/governed_data.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina_framework.egg-info/dependency_links.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina_framework.egg-info/entry_points.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/admina_framework.egg-info/top_level.txt +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/setup.cfg +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_core_config.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_governance_pipeline.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_mcp_transport.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_proxy_security.py +0 -0
- {admina_framework-0.9.3 → admina_framework-0.9.4}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: admina-framework
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.4
|
|
4
4
|
Summary: Admina — governed AI development framework
|
|
5
5
|
Author-email: Stefano Noferi <info@admina.org>
|
|
6
6
|
Maintainer-email: Stefano Noferi <info@admina.org>
|
|
@@ -52,43 +52,109 @@ Requires-Dist: opentelemetry-api<2,>=1.20; extra == "telemetry"
|
|
|
52
52
|
Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "telemetry"
|
|
53
53
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.20; extra == "telemetry"
|
|
54
54
|
Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.40b0; extra == "telemetry"
|
|
55
|
+
Provides-Extra: rust
|
|
56
|
+
Requires-Dist: admina-core<0.10,>=0.9.3; extra == "rust"
|
|
55
57
|
Provides-Extra: full
|
|
56
58
|
Requires-Dist: admina-framework[nlp,proxy,telemetry]; extra == "full"
|
|
57
59
|
Dynamic: license-file
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
<!--
|
|
62
|
+
<p align="center">
|
|
63
|
+
<img src="resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
|
|
64
|
+
</p>
|
|
65
|
+
-->
|
|
60
66
|
|
|
61
|
-
|
|
67
|
+
<p align="center">
|
|
68
|
+
<strong>Install once, get governed AI.</strong><br>
|
|
69
|
+
<em>PII redacted · Injections blocked · Loops broken · Actions audited · EU AI Act tracked</em>
|
|
70
|
+
</p>
|
|
62
71
|
|
|
63
|
-
|
|
72
|
+
<p align="center">
|
|
73
|
+
<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/v/admina-framework?style=flat-square&color=32CD32" alt="PyPI version"></a>
|
|
74
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
|
|
75
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-32CD32?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
76
|
+
<img src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS-6C757D?style=flat-square" alt="Platform">
|
|
77
|
+
</p>
|
|
64
78
|
|
|
65
|
-
>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
>
|
|
71
|
-
|
|
72
|
-
>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
>
|
|
77
|
-
|
|
78
|
-
>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
<p align="center">
|
|
80
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/ci.yml?style=flat-square&label=CI&logo=githubactions&logoColor=white" alt="CI"></a>
|
|
81
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/release.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/release.yml?style=flat-square&label=release" alt="Release"></a>
|
|
82
|
+
<a href="https://github.com/admina-org/admina/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/security.yml?style=flat-square&label=security%20scan&logo=shield&logoColor=white" alt="Security scan"></a>
|
|
83
|
+
<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/dm/admina-framework?style=flat-square&label=downloads" alt="PyPI downloads"></a>
|
|
84
|
+
</p>
|
|
85
|
+
|
|
86
|
+
<p align="center">
|
|
87
|
+
<a href="https://deepwiki.com/admina-org/admina"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
|
|
88
|
+
<a href="https://github.com/admina-org/admina/discussions"><img src="https://img.shields.io/github/discussions/admina-org/admina?style=flat-square&logo=github" alt="Discussions"></a>
|
|
89
|
+
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
|
|
90
|
+
</p>
|
|
91
|
+
|
|
92
|
+
<p align="center">
|
|
93
|
+
<a href="#quick-start"><img src="https://img.shields.io/badge/⚡%20Quick%20Start-2%20min-32CD32?style=for-the-badge" alt="Quick Start" height="40"></a>
|
|
94
|
+
<a href="#see-it-in-action"><img src="https://img.shields.io/badge/▶%20Live%20Demo-Dashboard-3B82F6?style=for-the-badge" alt="Live Demo" height="40"></a>
|
|
95
|
+
<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/📖%20Read%20the%20Docs-admina.org-6C757D?style=for-the-badge" alt="Docs" height="40"></a>
|
|
96
|
+
<a href="https://deepwiki.com/admina-org/admina"><img src="https://img.shields.io/badge/🤖%20Ask%20DeepWiki-AI%20wiki-7C3AED?style=for-the-badge" alt="DeepWiki" height="40"></a>
|
|
97
|
+
</p>
|
|
98
|
+
|
|
99
|
+
<p align="center">
|
|
100
|
+
<a href="https://github.com/admina-org/admina/stargazers"><img src="https://img.shields.io/github/stars/admina-org/admina?style=social" alt="Stars"></a>
|
|
101
|
+
<a href="https://github.com/admina-org/admina/network/members"><img src="https://img.shields.io/github/forks/admina-org/admina?style=social" alt="Forks"></a>
|
|
102
|
+
<a href="https://github.com/admina-org/admina/graphs/contributors"><img src="https://img.shields.io/github/contributors/admina-org/admina?style=flat-square&label=contributors" alt="Contributors"></a>
|
|
103
|
+
<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
|
|
104
|
+
</p>
|
|
105
|
+
|
|
106
|
+
---
|
|
82
107
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
108
|
+
## See it in action
|
|
109
|
+
|
|
110
|
+
**Scaffold a project and boot the governed proxy + dashboard — no Docker:**
|
|
111
|
+
|
|
112
|
+
<p align="center">
|
|
113
|
+
<img src="resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
|
|
114
|
+
</p>
|
|
115
|
+
|
|
116
|
+
**Wrap any model in a few lines — PII is stripped before the model ever sees it:**
|
|
117
|
+
|
|
118
|
+
<p align="center">
|
|
119
|
+
<img src="resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
|
|
120
|
+
</p>
|
|
121
|
+
|
|
122
|
+
**The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
|
|
123
|
+
|
|
124
|
+
<table>
|
|
125
|
+
<tr>
|
|
126
|
+
<td align="center" width="50%">
|
|
127
|
+
<img src="resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
|
|
128
|
+
<em>First boot — Admina Score <strong>40/100</strong></em>
|
|
129
|
+
</td>
|
|
130
|
+
<td align="center" width="50%">
|
|
131
|
+
<img src="resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
|
|
132
|
+
<em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
|
|
133
|
+
</td>
|
|
134
|
+
</tr>
|
|
135
|
+
</table>
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Why Admina?
|
|
140
|
+
|
|
141
|
+
| | Plain LLM / RAG app | **With Admina** |
|
|
142
|
+
| :----------------------------- | :----------------------------------- | :----------------------------------------------------------------------- |
|
|
143
|
+
| PII in prompts/responses | leaks unless you build redaction | **Redacted by default** — email, SSN, IBAN, phone, IP, names |
|
|
144
|
+
| Prompt injections | reach the model | **Blocked at the proxy** — 15 regex + Rust heuristic scoring |
|
|
145
|
+
| Agent tool calls | unaudited | **Validated pre-action + logged post-action** (forensic chain) |
|
|
146
|
+
| Loop / runaway agents | burn tokens / budget | **Broken** — TF-IDF cosine similarity over the action stream |
|
|
147
|
+
| EU AI Act readiness | manual | **Gap analysis + risk classification** built-in |
|
|
148
|
+
| Audit trail | logs you hope nobody deletes | **SHA-256 hash chain** — tamper-evident by design |
|
|
149
|
+
| Adding governance to existing code | rewrite the call sites | **Zero code changes** via proxy, or 3 lines via SDK |
|
|
150
|
+
| Performance overhead | unknown | **~6 µs per pipeline** (Rust engine), in-process or networked |
|
|
151
|
+
| License | varies | **Apache 2.0**, open core |
|
|
152
|
+
|
|
153
|
+
> Admina is **decision-support and defense-in-depth**, not legal advice. See [Compliance scope](#compliance-scope) for the full disclaimer and limitations.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 30-second example
|
|
92
158
|
|
|
93
159
|
```python
|
|
94
160
|
from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
|
|
@@ -130,7 +196,8 @@ pip install "admina-framework[full]"
|
|
|
130
196
|
python -m spacy download en_core_web_sm # for [full] only
|
|
131
197
|
|
|
132
198
|
# Optional: Rust-accelerated engine (auto-detected at runtime).
|
|
133
|
-
|
|
199
|
+
# Opt-in extra — pulls in the admina-core wheel from PyPI.
|
|
200
|
+
pip install "admina-framework[rust]"
|
|
134
201
|
|
|
135
202
|
# Advanced: SDK only (no proxy, no dashboard, no `admina dev`).
|
|
136
203
|
# Use this when embedding the SDK into another service and you don't
|
|
@@ -142,10 +209,17 @@ pip install admina-framework
|
|
|
142
209
|
> name is `admina` (e.g. `from admina import GovernedModel`). This is
|
|
143
210
|
> a normal Python pattern — same as `python-dateutil` → `import dateutil`.
|
|
144
211
|
|
|
145
|
-
> The Rust engine is an optional accelerator.
|
|
146
|
-
> ships only the pure-Python implementation;
|
|
147
|
-
>
|
|
148
|
-
> if it's
|
|
212
|
+
> The Rust engine is an **optional, opt-in** accelerator. The default
|
|
213
|
+
> `pip install admina-framework` ships only the pure-Python implementation;
|
|
214
|
+
> `admina-framework[rust]` adds the `admina-core` wheel, which Admina
|
|
215
|
+
> auto-detects at runtime (falling back to pure Python if it's absent).
|
|
216
|
+
>
|
|
217
|
+
> The default is pure Python on purpose: the Python injection firewall
|
|
218
|
+
> currently has **broader detection coverage** than the Rust one (it adds
|
|
219
|
+
> obfuscation-normalisation — homoglyph, leetspeak, base64, ROT13 — and a
|
|
220
|
+
> wider multilingual pattern set). Enable `[rust]` when per-request latency
|
|
221
|
+
> matters more than that extra coverage. See
|
|
222
|
+
> [Performance](#performance--hybrid-python--rust-engine) for the trade-off.
|
|
149
223
|
|
|
150
224
|
### Or install from source
|
|
151
225
|
|
|
@@ -180,28 +254,21 @@ Dashboard: [http://localhost:3000](http://localhost:3000) | API docs: [http://lo
|
|
|
180
254
|
|
|
181
255
|
## Architecture
|
|
182
256
|
|
|
183
|
-
Admina
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
```
|
|
195
|
-
SDK Mode: Proxy Mode:
|
|
196
|
-
your code AI Agent
|
|
197
|
-
| |
|
|
198
|
-
GovernedModel.ask() POST /mcp
|
|
199
|
-
| |
|
|
200
|
-
[governance pipeline] [governance pipeline]
|
|
201
|
-
| |
|
|
202
|
-
Ollama / OpenAI MCP Server / LLM
|
|
257
|
+
Admina runs in **dual mode** — in-process via SDK or networked via proxy — but both modes feed the **same governance pipeline**.
|
|
258
|
+
|
|
259
|
+
```mermaid
|
|
260
|
+
flowchart LR
|
|
261
|
+
A1["your code → GovernedModel.ask()"] --> P
|
|
262
|
+
A2["AI agent → POST /mcp"] --> P
|
|
263
|
+
P["governance pipeline"]
|
|
264
|
+
P --> U1["Ollama / OpenAI"]
|
|
265
|
+
P --> U2["MCP server / LLM"]
|
|
266
|
+
classDef pipe fill:#0ea5e9,stroke:#0369a1,color:#fff;
|
|
267
|
+
class P pipe;
|
|
203
268
|
```
|
|
204
269
|
|
|
270
|
+
Pipeline (identical in both modes): `PII redaction → firewall → loop-breaker → audit → forensic chain (SHA-256) → OTEL`
|
|
271
|
+
|
|
205
272
|
## The 4 Governance Domains
|
|
206
273
|
|
|
207
274
|
| Domain | Capabilities | Engine |
|
|
@@ -267,49 +334,6 @@ dependency: one uvicorn serves the proxy API and the dashboard SPA on the
|
|
|
267
334
|
same port. Use `--stack` for the production-like Docker compose, or
|
|
268
335
|
`--with-llm` to also boot local LLM services.
|
|
269
336
|
|
|
270
|
-
## Forensic backend — choose deliberately
|
|
271
|
-
|
|
272
|
-
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
273
|
-
tamper-evident) supports four backends. Read this before picking one for
|
|
274
|
-
production.
|
|
275
|
-
|
|
276
|
-
| Backend | License | When to use | Caveats |
|
|
277
|
-
|---------|---------|-------------|---------|
|
|
278
|
-
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
279
|
-
| **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
|
|
280
|
-
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Recommended new default. |
|
|
281
|
-
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
282
|
-
|
|
283
|
-
> ⚠️ **MinIO disclaimer — what users of Admina need to know.**
|
|
284
|
-
>
|
|
285
|
-
> MinIO has two separate licensing/maintenance issues that can affect
|
|
286
|
-
> downstream users of Admina, even though Admina itself is Apache 2.0:
|
|
287
|
-
>
|
|
288
|
-
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
289
|
-
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
290
|
-
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
291
|
-
> can be read to require you to publish the source code of the
|
|
292
|
-
> *combined* application that interacts with MinIO over the network.
|
|
293
|
-
> The MinIO commercial license removes this obligation, but is paid.
|
|
294
|
-
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
295
|
-
> but it is an obligation MinIO Server itself imposes on whoever
|
|
296
|
-
> runs it.
|
|
297
|
-
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
298
|
-
> patches, no support for new Python releases. Continuing to depend
|
|
299
|
-
> on it is a supply-chain risk.
|
|
300
|
-
>
|
|
301
|
-
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
302
|
-
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
303
|
-
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
304
|
-
> AGPL network clause for typical Admina deployments:
|
|
305
|
-
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
306
|
-
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
307
|
-
> Garage itself, not to applications that connect to it via S3 API)
|
|
308
|
-
>
|
|
309
|
-
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
310
|
-
> but plan a migration. The `minio` backend will be removed in a future
|
|
311
|
-
> release.
|
|
312
|
-
|
|
313
337
|
## Dashboard
|
|
314
338
|
|
|
315
339
|
Real-time governance dashboard on port 3000:
|
|
@@ -331,19 +355,38 @@ cp admina.yaml.example admina.yaml # Copy and customize
|
|
|
331
355
|
|
|
332
356
|
See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
|
|
333
357
|
|
|
334
|
-
|
|
358
|
+
<a id="compliance-scope"></a>
|
|
335
359
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
360
|
+
<details open>
|
|
361
|
+
<summary><strong>⚖️ Compliance scope & legal disclaimer</strong> — what Admina does and does not do legally</summary>
|
|
362
|
+
|
|
363
|
+
<br>
|
|
364
|
+
|
|
365
|
+
> Admina is a self-assessment and defense-in-depth tool. The EU AI Act
|
|
366
|
+
> gap-analysis and risk classification features are **decision-support
|
|
367
|
+
> aids, not legal advice**. They do not replace the conformity assessment
|
|
368
|
+
> required under EU AI Act Art. 43 for high-risk systems, nor the
|
|
369
|
+
> involvement of a notified body where the regulation requires one.
|
|
370
|
+
>
|
|
371
|
+
> **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
|
|
372
|
+
> Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
|
|
373
|
+
> in force since 2 August 2025; Art. 50 transparency for synthetic
|
|
374
|
+
> content and the new NCII / synthetic-CSAM prohibition apply from
|
|
375
|
+
> 2 December 2026; **Annex III high-risk obligations from 2 December
|
|
376
|
+
> 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
|
|
377
|
+
> 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
|
|
378
|
+
> ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
|
|
379
|
+
> See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
|
|
380
|
+
> and known failure modes of every Admina component.
|
|
381
|
+
|
|
382
|
+
</details>
|
|
343
383
|
|
|
344
384
|
## Integrations
|
|
345
385
|
|
|
346
|
-
|
|
386
|
+
<details>
|
|
387
|
+
<summary><strong>GuardrailsAI</strong> — ML-based content validation as a governance plugin</summary>
|
|
388
|
+
|
|
389
|
+
<br>
|
|
347
390
|
|
|
348
391
|
ML-based content validation (toxic language, jailbreak, bias, PII via Presidio) as a governance domain plugin:
|
|
349
392
|
|
|
@@ -357,7 +400,12 @@ pip install <your-guardrails-ai-wheel>
|
|
|
357
400
|
|
|
358
401
|
Enable in `admina.yaml` under `agent_security.domains.guardrailsai`. All inference runs locally by default — no data leaves the deployment perimeter.
|
|
359
402
|
|
|
360
|
-
|
|
403
|
+
</details>
|
|
404
|
+
|
|
405
|
+
<details>
|
|
406
|
+
<summary><strong>OpenClaw</strong> — govern OpenClaw agent actions via pre/post-action hooks</summary>
|
|
407
|
+
|
|
408
|
+
<br>
|
|
361
409
|
|
|
362
410
|
Govern OpenClaw agent actions through the Admina proxy. Every tool call, shell command, and API request is validated before execution:
|
|
363
411
|
|
|
@@ -368,9 +416,12 @@ chmod +x setup.sh && ./setup.sh
|
|
|
368
416
|
|
|
369
417
|
The skill uses `POST /api/v1/validate` (pre-action) and `POST /api/v1/audit` (post-action) endpoints.
|
|
370
418
|
|
|
371
|
-
|
|
419
|
+
</details>
|
|
372
420
|
|
|
373
|
-
|
|
421
|
+
<details>
|
|
422
|
+
<summary><strong>n8n</strong> — community nodes for n8n workflow automation</summary>
|
|
423
|
+
|
|
424
|
+
<br>
|
|
374
425
|
|
|
375
426
|
| Node | Purpose |
|
|
376
427
|
|------|---------|
|
|
@@ -380,9 +431,14 @@ Community nodes for n8n workflow automation:
|
|
|
380
431
|
|
|
381
432
|
Install: `npm install n8n-nodes-admina` in your n8n instance.
|
|
382
433
|
|
|
383
|
-
|
|
434
|
+
</details>
|
|
435
|
+
|
|
436
|
+
<details>
|
|
437
|
+
<summary><strong>Cheshire Cat AI</strong> — govern all Cheshire Cat interactions via Python hooks</summary>
|
|
384
438
|
|
|
385
|
-
|
|
439
|
+
<br>
|
|
440
|
+
|
|
441
|
+
Three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
|
|
386
442
|
|
|
387
443
|
```bash
|
|
388
444
|
cd integrations/cheshirecat/admina-plugin
|
|
@@ -390,9 +446,14 @@ cd integrations/cheshirecat/admina-plugin
|
|
|
390
446
|
# Copy plugin into Cheshire Cat plugins/ directory
|
|
391
447
|
```
|
|
392
448
|
|
|
393
|
-
|
|
449
|
+
</details>
|
|
394
450
|
|
|
395
|
-
|
|
451
|
+
<details>
|
|
452
|
+
<summary><strong>LangChain</strong> — drop-in callback handler</summary>
|
|
453
|
+
|
|
454
|
+
<br>
|
|
455
|
+
|
|
456
|
+
Governs every LLM call and tool invocation in-process:
|
|
396
457
|
|
|
397
458
|
```python
|
|
398
459
|
from admina.integrations.langchain.callbacks import AdminaCallbackHandler
|
|
@@ -401,9 +462,12 @@ handler = AdminaCallbackHandler()
|
|
|
401
462
|
llm = ChatOpenAI(callbacks=[handler])
|
|
402
463
|
```
|
|
403
464
|
|
|
404
|
-
|
|
465
|
+
</details>
|
|
405
466
|
|
|
406
|
-
|
|
467
|
+
<details>
|
|
468
|
+
<summary><strong>CrewAI</strong> — step and task callbacks for multi-agent governance</summary>
|
|
469
|
+
|
|
470
|
+
<br>
|
|
407
471
|
|
|
408
472
|
```python
|
|
409
473
|
from admina.integrations.crewai.callbacks import admina_step_callback, admina_task_callback
|
|
@@ -412,16 +476,32 @@ agent = Agent(role="Researcher", step_callback=admina_step_callback)
|
|
|
412
476
|
crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
|
|
413
477
|
```
|
|
414
478
|
|
|
415
|
-
|
|
479
|
+
</details>
|
|
416
480
|
|
|
417
|
-
|
|
481
|
+
See [full integration docs](docs/guides/integrations.md) for details.
|
|
418
482
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
483
|
+
## Performance — Hybrid Python + Rust engine
|
|
484
|
+
|
|
485
|
+
The Rust core engine is an optional accelerator. The default
|
|
486
|
+
`pip install admina-framework` ships only the pure-Python implementation;
|
|
487
|
+
enable the Rust engine with the opt-in extra `pip install
|
|
488
|
+
"admina-framework[rust]"` (or build from source for local development —
|
|
489
|
+
`maturin develop --release --manifest-path core-rust/Cargo.toml`, see
|
|
490
|
+
[CONTRIBUTING.md](CONTRIBUTING.md)). At runtime Admina auto-detects
|
|
491
|
+
whichever is available and falls back transparently to Python if the Rust
|
|
492
|
+
extension is not installed.
|
|
493
|
+
|
|
494
|
+
> **Detection trade-off (why Rust is opt-in, not the default).** The Rust
|
|
495
|
+
> firewall is faster but currently detects a narrower set of attacks than
|
|
496
|
+
> the pure-Python firewall. The Python engine normalises common evasions
|
|
497
|
+
> before matching (homoglyph, leetspeak, char-by-char hyphenation, base64,
|
|
498
|
+
> ROT13) and carries a wider multilingual pattern set; the Rust engine does
|
|
499
|
+
> not yet. On an internal 14-attack evasion corpus the Python firewall
|
|
500
|
+
> blocks all 14 while the Rust firewall blocks 7 (the plain-text and
|
|
501
|
+
> multilingual-keyword attacks), with no false positives on either side.
|
|
502
|
+
> Full Rust↔Python detection parity is tracked for 0.10. Until then, keep
|
|
503
|
+
> the default (pure Python) when detection breadth matters; opt into
|
|
504
|
+
> `[rust]` when latency dominates.
|
|
425
505
|
|
|
426
506
|
Measured numbers below assume the Rust engine is loaded:
|
|
427
507
|
|
|
@@ -469,7 +549,87 @@ python scripts/simulate.py --duration 300 --rate 10
|
|
|
469
549
|
|
|
470
550
|
Generates a weighted mix of: clean MCP requests, injection attempts, PII content, loop triggers, REST validate/audit calls, EU AI Act classifications, and dashboard reads. Colored terminal output with per-event action and summary counters.
|
|
471
551
|
|
|
472
|
-
##
|
|
552
|
+
## Infrastructure & Services
|
|
553
|
+
|
|
554
|
+
The full stack (`docker compose up`) runs 9 containers:
|
|
555
|
+
|
|
556
|
+
| Port | Service | Description |
|
|
557
|
+
|------|---------|-------------|
|
|
558
|
+
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
559
|
+
| `3000` | Dashboard | Real-time governance web UI |
|
|
560
|
+
| `3001` | Grafana | Metrics dashboards |
|
|
561
|
+
| `9090` | MinIO Console | Forensic storage browser |
|
|
562
|
+
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
563
|
+
|
|
564
|
+
ClickHouse and Redis are internal only (not exposed to host).
|
|
565
|
+
|
|
566
|
+
<details>
|
|
567
|
+
<summary><strong>🗄️ Forensic backends (4 options) — choose deliberately</strong></summary>
|
|
568
|
+
|
|
569
|
+
<br>
|
|
570
|
+
|
|
571
|
+
The forensic blackbox (the SHA-256 hash chain that makes the audit trail
|
|
572
|
+
tamper-evident) supports four backends. Read this before picking one for
|
|
573
|
+
production.
|
|
574
|
+
|
|
575
|
+
| Backend | License | When to use | Caveats |
|
|
576
|
+
|---------|---------|-------------|---------|
|
|
577
|
+
| **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
|
|
578
|
+
| **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
|
|
579
|
+
| **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Recommended new default. |
|
|
580
|
+
| **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
|
|
581
|
+
|
|
582
|
+
> ⚠️ **MinIO disclaimer — what users of Admina need to know.**
|
|
583
|
+
>
|
|
584
|
+
> MinIO has two separate licensing/maintenance issues that can affect
|
|
585
|
+
> downstream users of Admina, even though Admina itself is Apache 2.0:
|
|
586
|
+
>
|
|
587
|
+
> 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
|
|
588
|
+
> network-accessible service (e.g. a SaaS that exposes Admina's
|
|
589
|
+
> dashboard or API to the public Internet), AGPLv3's network clause
|
|
590
|
+
> can be read to require you to publish the source code of the
|
|
591
|
+
> *combined* application that interacts with MinIO over the network.
|
|
592
|
+
> The MinIO commercial license removes this obligation, but is paid.
|
|
593
|
+
> This is **not** an Admina obligation — Apache 2.0 is permissive —
|
|
594
|
+
> but it is an obligation MinIO Server itself imposes on whoever
|
|
595
|
+
> runs it.
|
|
596
|
+
> 2. **The MinIO Python SDK has been archived.** No more security
|
|
597
|
+
> patches, no support for new Python releases. Continuing to depend
|
|
598
|
+
> on it is a supply-chain risk.
|
|
599
|
+
>
|
|
600
|
+
> **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
|
|
601
|
+
> The `boto3` client is Apache 2.0 and works against any S3-compatible
|
|
602
|
+
> service. Two open-source FOSS-friendly options that don't trigger the
|
|
603
|
+
> AGPL network clause for typical Admina deployments:
|
|
604
|
+
> - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
|
|
605
|
+
> - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
|
|
606
|
+
> Garage itself, not to applications that connect to it via S3 API)
|
|
607
|
+
>
|
|
608
|
+
> Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
|
|
609
|
+
> but plan a migration. The `minio` backend will be removed in a future
|
|
610
|
+
> release.
|
|
611
|
+
|
|
612
|
+
</details>
|
|
613
|
+
|
|
614
|
+
<details>
|
|
615
|
+
<summary><strong>⚙️ Environment variables (Docker / .env)</strong></summary>
|
|
616
|
+
|
|
617
|
+
<br>
|
|
618
|
+
|
|
619
|
+
| Variable | Default | Description |
|
|
620
|
+
|----------|---------|-------------|
|
|
621
|
+
| `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
|
|
622
|
+
| `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
|
|
623
|
+
| `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
|
|
624
|
+
| `MINIO_SECRET_KEY` | *(required)* | MinIO secret key for forensic storage |
|
|
625
|
+
| `LOG_LEVEL` | `INFO` | Logging verbosity |
|
|
626
|
+
|
|
627
|
+
</details>
|
|
628
|
+
|
|
629
|
+
<details>
|
|
630
|
+
<summary><strong>📁 Full project structure</strong></summary>
|
|
631
|
+
|
|
632
|
+
<br>
|
|
473
633
|
|
|
474
634
|
```
|
|
475
635
|
admina/
|
|
@@ -503,7 +663,12 @@ admina/
|
|
|
503
663
|
+-- docker-compose.yml Full stack deployment (9 containers)
|
|
504
664
|
```
|
|
505
665
|
|
|
506
|
-
|
|
666
|
+
</details>
|
|
667
|
+
|
|
668
|
+
<details>
|
|
669
|
+
<summary><strong>🔌 API examples (curl)</strong></summary>
|
|
670
|
+
|
|
671
|
+
<br>
|
|
507
672
|
|
|
508
673
|
```bash
|
|
509
674
|
# Health check (always public)
|
|
@@ -536,19 +701,7 @@ curl -X POST http://localhost:8080/api/compliance/classify \
|
|
|
536
701
|
curl http://localhost:8080/api/dashboard/score
|
|
537
702
|
```
|
|
538
703
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
The full stack (`docker compose up`) runs 9 containers:
|
|
542
|
-
|
|
543
|
-
| Port | Service | Description |
|
|
544
|
-
|------|---------|-------------|
|
|
545
|
-
| `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
|
|
546
|
-
| `3000` | Dashboard | Real-time governance web UI |
|
|
547
|
-
| `3001` | Grafana | Metrics dashboards |
|
|
548
|
-
| `9090` | MinIO Console | Forensic storage browser |
|
|
549
|
-
| `4317` | OTEL Collector | OTLP gRPC ingestion |
|
|
550
|
-
|
|
551
|
-
ClickHouse and Redis are internal only (not exposed to host).
|
|
704
|
+
</details>
|
|
552
705
|
|
|
553
706
|
## Project documents
|
|
554
707
|
|
|
@@ -558,6 +711,7 @@ ClickHouse and Redis are internal only (not exposed to host).
|
|
|
558
711
|
- [CHANGELOG.md](CHANGELOG.md) — release notes
|
|
559
712
|
- [SECURITY.md](SECURITY.md) — coordinated disclosure policy
|
|
560
713
|
- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
|
|
714
|
+
- **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
|
|
561
715
|
|
|
562
716
|
Admina is Apache 2.0. Contributions are welcome.
|
|
563
717
|
|