appecosystem 0.3.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 (62) hide show
  1. appecosystem-0.3.0/LICENSE +21 -0
  2. appecosystem-0.3.0/PKG-INFO +103 -0
  3. appecosystem-0.3.0/README.md +66 -0
  4. appecosystem-0.3.0/appecosystem.egg-info/PKG-INFO +103 -0
  5. appecosystem-0.3.0/appecosystem.egg-info/SOURCES.txt +60 -0
  6. appecosystem-0.3.0/appecosystem.egg-info/dependency_links.txt +1 -0
  7. appecosystem-0.3.0/appecosystem.egg-info/entry_points.txt +2 -0
  8. appecosystem-0.3.0/appecosystem.egg-info/requires.txt +13 -0
  9. appecosystem-0.3.0/appecosystem.egg-info/top_level.txt +4 -0
  10. appecosystem-0.3.0/cli/__init__.py +1 -0
  11. appecosystem-0.3.0/cli/__main__.py +4 -0
  12. appecosystem-0.3.0/cli/commands.py +635 -0
  13. appecosystem-0.3.0/cli/main.py +99 -0
  14. appecosystem-0.3.0/events/__init__.py +6 -0
  15. appecosystem-0.3.0/events/event_bus.py +137 -0
  16. appecosystem-0.3.0/events/event_types.py +48 -0
  17. appecosystem-0.3.0/events/schemas.py +40 -0
  18. appecosystem-0.3.0/llm/__init__.py +1 -0
  19. appecosystem-0.3.0/llm/command_router.py +188 -0
  20. appecosystem-0.3.0/llm/discovery_agent.py +107 -0
  21. appecosystem-0.3.0/llm/project_manifest.py +135 -0
  22. appecosystem-0.3.0/pyproject.toml +69 -0
  23. appecosystem-0.3.0/registry/__init__.py +1 -0
  24. appecosystem-0.3.0/registry/app.py +556 -0
  25. appecosystem-0.3.0/registry/app_store.py +153 -0
  26. appecosystem-0.3.0/registry/credential_store.py +160 -0
  27. appecosystem-0.3.0/registry/discovery.py +112 -0
  28. appecosystem-0.3.0/registry/health_monitor.py +182 -0
  29. appecosystem-0.3.0/registry/logging_config.py +49 -0
  30. appecosystem-0.3.0/registry/metrics.py +86 -0
  31. appecosystem-0.3.0/registry/models.py +73 -0
  32. appecosystem-0.3.0/registry/placement.py +54 -0
  33. appecosystem-0.3.0/registry/profile_store.py +109 -0
  34. appecosystem-0.3.0/registry/registry.py +153 -0
  35. appecosystem-0.3.0/setup.cfg +4 -0
  36. appecosystem-0.3.0/tests/test_app_store.py +86 -0
  37. appecosystem-0.3.0/tests/test_auth.py +376 -0
  38. appecosystem-0.3.0/tests/test_cli.py +243 -0
  39. appecosystem-0.3.0/tests/test_client.py +173 -0
  40. appecosystem-0.3.0/tests/test_client_auth_dependency.py +51 -0
  41. appecosystem-0.3.0/tests/test_command_router.py +189 -0
  42. appecosystem-0.3.0/tests/test_config.py +56 -0
  43. appecosystem-0.3.0/tests/test_credential_store.py +136 -0
  44. appecosystem-0.3.0/tests/test_discovery.py +118 -0
  45. appecosystem-0.3.0/tests/test_event_publisher.py +83 -0
  46. appecosystem-0.3.0/tests/test_event_subscriber.py +101 -0
  47. appecosystem-0.3.0/tests/test_events.py +62 -0
  48. appecosystem-0.3.0/tests/test_health.py +100 -0
  49. appecosystem-0.3.0/tests/test_metrics.py +42 -0
  50. appecosystem-0.3.0/tests/test_middleware_keyid.py +92 -0
  51. appecosystem-0.3.0/tests/test_packaging.py +94 -0
  52. appecosystem-0.3.0/tests/test_peer.py +58 -0
  53. appecosystem-0.3.0/tests/test_placement.py +59 -0
  54. appecosystem-0.3.0/tests/test_profile_store.py +53 -0
  55. appecosystem-0.3.0/tests/test_provider_cli.py +34 -0
  56. appecosystem-0.3.0/tests/test_provider_key_endpoints.py +108 -0
  57. appecosystem-0.3.0/tests/test_registry.py +132 -0
  58. appecosystem-0.3.0/tests/test_registry_app.py +238 -0
  59. appecosystem-0.3.0/tests/test_registry_partner_auth.py +88 -0
  60. appecosystem-0.3.0/tests/test_registry_security.py +44 -0
  61. appecosystem-0.3.0/tests/test_secret_setup.py +83 -0
  62. appecosystem-0.3.0/tests/test_topology.py +86 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Mikel Smart
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.4
2
+ Name: appecosystem
3
+ Version: 0.3.0
4
+ Summary: Service registry, event bus and coordination layer for the appEcosystem service mesh
5
+ Author: Mikel Smart
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/M1K31/appEcosystem
8
+ Project-URL: Source, https://github.com/M1K31/appEcosystem
9
+ Project-URL: Issues, https://github.com/M1K31/appEcosystem/issues
10
+ Keywords: service-registry,event-bus,microservices,home-automation,appecosystem
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Framework :: FastAPI
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Classifier: Topic :: System :: Distributed Computing
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: fastapi>=0.100.0
25
+ Requires-Dist: uvicorn>=0.23.0
26
+ Requires-Dist: pydantic>=2.0
27
+ Requires-Dist: pyyaml>=6.0
28
+ Requires-Dist: httpx>=0.24.0
29
+ Requires-Dist: zeroconf>=0.80.0
30
+ Requires-Dist: appecosystem-client>=0.3.1
31
+ Requires-Dist: appecosystem-auth>=0.4.0
32
+ Provides-Extra: dev
33
+ Requires-Dist: pytest>=7.0; extra == "dev"
34
+ Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
35
+ Requires-Dist: httpx>=0.24; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # Unified Security & AI Ecosystem (appEcosystem)
39
+
40
+ A robust, **offline-first** ecosystem combining AI, surveillance, intrusion
41
+ detection, and smart displays into a single cohesive home network. `appEcosystem`
42
+ is the **control plane**: a service registry, event bus, shared-secret/auth layer,
43
+ and shared AI profile that ties the apps together — while every app still runs
44
+ **standalone** when the registry is absent.
45
+
46
+ ## Architecture
47
+
48
+ **Standalone-first:** if the central coordination layer goes offline, every
49
+ connected app degrades gracefully and keeps working as an independent system.
50
+ When the registry *is* present, apps discover each other, share events, and sync
51
+ their LLM selection.
52
+
53
+ | Component | Role |
54
+ |-----------|------|
55
+ | **appEcosystem** (this repo) | Service registry + event bus + shared AI profile + shared auth |
56
+ | **AI-for-Survival** | Offline LLM assistant (Ollama + RAG) + cyber triage |
57
+ | **AegisSIEM** (LogAnalysis) | Router syslog SIEM + honeypot + active threat mitigation |
58
+ | **OpenEye** | OpenCV surveillance (face/object recognition, recording, alerts) |
59
+ | **MagicMirror³** | Visual hub / dashboards for the ecosystem |
60
+
61
+ ### Shared packages (path-installed into each app)
62
+ - **`ecosystem_auth`** (`auth/python`) — HMAC-SHA256 replay-resistant request signing
63
+ (timestamp + nonce + body digest), fail-closed shared-secret resolution, and the
64
+ in-app "Ecosystem Setup" secret helpers.
65
+ - **`ecosystem_client`** (`ecosystem_client/`) — discovery cascade (registry → mDNS →
66
+ static → standalone), self-registration heartbeat, event pub/sub, topology
67
+ (`local`|`lan`) resolution.
68
+ - **`ecosystem-ai`** (`packages/ecosystem-ai`) — provider abstraction (Ollama default
69
+ + Anthropic/OpenAI/Gemini), hardware capability tiers, syncable AI profile.
70
+
71
+ ### Deployment modes (`ECOSYSTEM_MODE`)
72
+ - **`local`** (default) — everything on one machine; services bind + advertise on
73
+ loopback. Nothing is exposed on the network.
74
+ - **`lan`** — services may live on different devices; they bind on all interfaces and
75
+ advertise their real LAN IP via self-registration. Set `ECOSYSTEM_MODE=lan` per device.
76
+
77
+ ## Quickstart
78
+
79
+ ```bash
80
+ # 1. Install the registry as a service + provision the shared secret (internal disk)
81
+ ./scripts/install.sh # macOS launchd / Linux systemd
82
+
83
+ # 2. Provision / share the HMAC secret (same machine is automatic; joining devices import it)
84
+ ecosystem secret generate # primary device
85
+ ecosystem secret import <value> # additional devices (value from `ecosystem secret show`)
86
+
87
+ # 3. Check the ecosystem
88
+ ecosystem status # registry + registered services health
89
+ ecosystem apps # which apps are installed on THIS device
90
+ ```
91
+
92
+ The `ecosystem` CLI (or `python -m cli.main`) controls the registry:
93
+ `start` · `stop` · `restart` · `start-all` · `stop-all` · `status` · `monitor` ·
94
+ `logs <app>` · `secret <generate|show|import|path>` · `apps [--json]` ·
95
+ `install` · `uninstall`.
96
+
97
+ See [usage.md](usage.md) for the registry API, HMAC signing, and per-app integration.
98
+
99
+ ## Requirements
100
+ - Python 3.10–3.12 (the registry); the shared `ecosystem_auth` supports 3.9+ for apps
101
+ on older runtimes (e.g. OpenEye).
102
+ - macOS (launchd) or Linux (systemd) for the installed service.
103
+ - Ollama (default LLM provider) — optional but recommended.
@@ -0,0 +1,66 @@
1
+ # Unified Security & AI Ecosystem (appEcosystem)
2
+
3
+ A robust, **offline-first** ecosystem combining AI, surveillance, intrusion
4
+ detection, and smart displays into a single cohesive home network. `appEcosystem`
5
+ is the **control plane**: a service registry, event bus, shared-secret/auth layer,
6
+ and shared AI profile that ties the apps together — while every app still runs
7
+ **standalone** when the registry is absent.
8
+
9
+ ## Architecture
10
+
11
+ **Standalone-first:** if the central coordination layer goes offline, every
12
+ connected app degrades gracefully and keeps working as an independent system.
13
+ When the registry *is* present, apps discover each other, share events, and sync
14
+ their LLM selection.
15
+
16
+ | Component | Role |
17
+ |-----------|------|
18
+ | **appEcosystem** (this repo) | Service registry + event bus + shared AI profile + shared auth |
19
+ | **AI-for-Survival** | Offline LLM assistant (Ollama + RAG) + cyber triage |
20
+ | **AegisSIEM** (LogAnalysis) | Router syslog SIEM + honeypot + active threat mitigation |
21
+ | **OpenEye** | OpenCV surveillance (face/object recognition, recording, alerts) |
22
+ | **MagicMirror³** | Visual hub / dashboards for the ecosystem |
23
+
24
+ ### Shared packages (path-installed into each app)
25
+ - **`ecosystem_auth`** (`auth/python`) — HMAC-SHA256 replay-resistant request signing
26
+ (timestamp + nonce + body digest), fail-closed shared-secret resolution, and the
27
+ in-app "Ecosystem Setup" secret helpers.
28
+ - **`ecosystem_client`** (`ecosystem_client/`) — discovery cascade (registry → mDNS →
29
+ static → standalone), self-registration heartbeat, event pub/sub, topology
30
+ (`local`|`lan`) resolution.
31
+ - **`ecosystem-ai`** (`packages/ecosystem-ai`) — provider abstraction (Ollama default
32
+ + Anthropic/OpenAI/Gemini), hardware capability tiers, syncable AI profile.
33
+
34
+ ### Deployment modes (`ECOSYSTEM_MODE`)
35
+ - **`local`** (default) — everything on one machine; services bind + advertise on
36
+ loopback. Nothing is exposed on the network.
37
+ - **`lan`** — services may live on different devices; they bind on all interfaces and
38
+ advertise their real LAN IP via self-registration. Set `ECOSYSTEM_MODE=lan` per device.
39
+
40
+ ## Quickstart
41
+
42
+ ```bash
43
+ # 1. Install the registry as a service + provision the shared secret (internal disk)
44
+ ./scripts/install.sh # macOS launchd / Linux systemd
45
+
46
+ # 2. Provision / share the HMAC secret (same machine is automatic; joining devices import it)
47
+ ecosystem secret generate # primary device
48
+ ecosystem secret import <value> # additional devices (value from `ecosystem secret show`)
49
+
50
+ # 3. Check the ecosystem
51
+ ecosystem status # registry + registered services health
52
+ ecosystem apps # which apps are installed on THIS device
53
+ ```
54
+
55
+ The `ecosystem` CLI (or `python -m cli.main`) controls the registry:
56
+ `start` · `stop` · `restart` · `start-all` · `stop-all` · `status` · `monitor` ·
57
+ `logs <app>` · `secret <generate|show|import|path>` · `apps [--json]` ·
58
+ `install` · `uninstall`.
59
+
60
+ See [usage.md](usage.md) for the registry API, HMAC signing, and per-app integration.
61
+
62
+ ## Requirements
63
+ - Python 3.10–3.12 (the registry); the shared `ecosystem_auth` supports 3.9+ for apps
64
+ on older runtimes (e.g. OpenEye).
65
+ - macOS (launchd) or Linux (systemd) for the installed service.
66
+ - Ollama (default LLM provider) — optional but recommended.
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.4
2
+ Name: appecosystem
3
+ Version: 0.3.0
4
+ Summary: Service registry, event bus and coordination layer for the appEcosystem service mesh
5
+ Author: Mikel Smart
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/M1K31/appEcosystem
8
+ Project-URL: Source, https://github.com/M1K31/appEcosystem
9
+ Project-URL: Issues, https://github.com/M1K31/appEcosystem/issues
10
+ Keywords: service-registry,event-bus,microservices,home-automation,appecosystem
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Framework :: FastAPI
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Classifier: Topic :: System :: Distributed Computing
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: fastapi>=0.100.0
25
+ Requires-Dist: uvicorn>=0.23.0
26
+ Requires-Dist: pydantic>=2.0
27
+ Requires-Dist: pyyaml>=6.0
28
+ Requires-Dist: httpx>=0.24.0
29
+ Requires-Dist: zeroconf>=0.80.0
30
+ Requires-Dist: appecosystem-client>=0.3.1
31
+ Requires-Dist: appecosystem-auth>=0.4.0
32
+ Provides-Extra: dev
33
+ Requires-Dist: pytest>=7.0; extra == "dev"
34
+ Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
35
+ Requires-Dist: httpx>=0.24; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # Unified Security & AI Ecosystem (appEcosystem)
39
+
40
+ A robust, **offline-first** ecosystem combining AI, surveillance, intrusion
41
+ detection, and smart displays into a single cohesive home network. `appEcosystem`
42
+ is the **control plane**: a service registry, event bus, shared-secret/auth layer,
43
+ and shared AI profile that ties the apps together — while every app still runs
44
+ **standalone** when the registry is absent.
45
+
46
+ ## Architecture
47
+
48
+ **Standalone-first:** if the central coordination layer goes offline, every
49
+ connected app degrades gracefully and keeps working as an independent system.
50
+ When the registry *is* present, apps discover each other, share events, and sync
51
+ their LLM selection.
52
+
53
+ | Component | Role |
54
+ |-----------|------|
55
+ | **appEcosystem** (this repo) | Service registry + event bus + shared AI profile + shared auth |
56
+ | **AI-for-Survival** | Offline LLM assistant (Ollama + RAG) + cyber triage |
57
+ | **AegisSIEM** (LogAnalysis) | Router syslog SIEM + honeypot + active threat mitigation |
58
+ | **OpenEye** | OpenCV surveillance (face/object recognition, recording, alerts) |
59
+ | **MagicMirror³** | Visual hub / dashboards for the ecosystem |
60
+
61
+ ### Shared packages (path-installed into each app)
62
+ - **`ecosystem_auth`** (`auth/python`) — HMAC-SHA256 replay-resistant request signing
63
+ (timestamp + nonce + body digest), fail-closed shared-secret resolution, and the
64
+ in-app "Ecosystem Setup" secret helpers.
65
+ - **`ecosystem_client`** (`ecosystem_client/`) — discovery cascade (registry → mDNS →
66
+ static → standalone), self-registration heartbeat, event pub/sub, topology
67
+ (`local`|`lan`) resolution.
68
+ - **`ecosystem-ai`** (`packages/ecosystem-ai`) — provider abstraction (Ollama default
69
+ + Anthropic/OpenAI/Gemini), hardware capability tiers, syncable AI profile.
70
+
71
+ ### Deployment modes (`ECOSYSTEM_MODE`)
72
+ - **`local`** (default) — everything on one machine; services bind + advertise on
73
+ loopback. Nothing is exposed on the network.
74
+ - **`lan`** — services may live on different devices; they bind on all interfaces and
75
+ advertise their real LAN IP via self-registration. Set `ECOSYSTEM_MODE=lan` per device.
76
+
77
+ ## Quickstart
78
+
79
+ ```bash
80
+ # 1. Install the registry as a service + provision the shared secret (internal disk)
81
+ ./scripts/install.sh # macOS launchd / Linux systemd
82
+
83
+ # 2. Provision / share the HMAC secret (same machine is automatic; joining devices import it)
84
+ ecosystem secret generate # primary device
85
+ ecosystem secret import <value> # additional devices (value from `ecosystem secret show`)
86
+
87
+ # 3. Check the ecosystem
88
+ ecosystem status # registry + registered services health
89
+ ecosystem apps # which apps are installed on THIS device
90
+ ```
91
+
92
+ The `ecosystem` CLI (or `python -m cli.main`) controls the registry:
93
+ `start` · `stop` · `restart` · `start-all` · `stop-all` · `status` · `monitor` ·
94
+ `logs <app>` · `secret <generate|show|import|path>` · `apps [--json]` ·
95
+ `install` · `uninstall`.
96
+
97
+ See [usage.md](usage.md) for the registry API, HMAC signing, and per-app integration.
98
+
99
+ ## Requirements
100
+ - Python 3.10–3.12 (the registry); the shared `ecosystem_auth` supports 3.9+ for apps
101
+ on older runtimes (e.g. OpenEye).
102
+ - macOS (launchd) or Linux (systemd) for the installed service.
103
+ - Ollama (default LLM provider) — optional but recommended.
@@ -0,0 +1,60 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ appecosystem.egg-info/PKG-INFO
5
+ appecosystem.egg-info/SOURCES.txt
6
+ appecosystem.egg-info/dependency_links.txt
7
+ appecosystem.egg-info/entry_points.txt
8
+ appecosystem.egg-info/requires.txt
9
+ appecosystem.egg-info/top_level.txt
10
+ cli/__init__.py
11
+ cli/__main__.py
12
+ cli/commands.py
13
+ cli/main.py
14
+ events/__init__.py
15
+ events/event_bus.py
16
+ events/event_types.py
17
+ events/schemas.py
18
+ llm/__init__.py
19
+ llm/command_router.py
20
+ llm/discovery_agent.py
21
+ llm/project_manifest.py
22
+ registry/__init__.py
23
+ registry/app.py
24
+ registry/app_store.py
25
+ registry/credential_store.py
26
+ registry/discovery.py
27
+ registry/health_monitor.py
28
+ registry/logging_config.py
29
+ registry/metrics.py
30
+ registry/models.py
31
+ registry/placement.py
32
+ registry/profile_store.py
33
+ registry/registry.py
34
+ tests/test_app_store.py
35
+ tests/test_auth.py
36
+ tests/test_cli.py
37
+ tests/test_client.py
38
+ tests/test_client_auth_dependency.py
39
+ tests/test_command_router.py
40
+ tests/test_config.py
41
+ tests/test_credential_store.py
42
+ tests/test_discovery.py
43
+ tests/test_event_publisher.py
44
+ tests/test_event_subscriber.py
45
+ tests/test_events.py
46
+ tests/test_health.py
47
+ tests/test_metrics.py
48
+ tests/test_middleware_keyid.py
49
+ tests/test_packaging.py
50
+ tests/test_peer.py
51
+ tests/test_placement.py
52
+ tests/test_profile_store.py
53
+ tests/test_provider_cli.py
54
+ tests/test_provider_key_endpoints.py
55
+ tests/test_registry.py
56
+ tests/test_registry_app.py
57
+ tests/test_registry_partner_auth.py
58
+ tests/test_registry_security.py
59
+ tests/test_secret_setup.py
60
+ tests/test_topology.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ecosystem = cli.main:main
@@ -0,0 +1,13 @@
1
+ fastapi>=0.100.0
2
+ uvicorn>=0.23.0
3
+ pydantic>=2.0
4
+ pyyaml>=6.0
5
+ httpx>=0.24.0
6
+ zeroconf>=0.80.0
7
+ appecosystem-client>=0.3.1
8
+ appecosystem-auth>=0.4.0
9
+
10
+ [dev]
11
+ pytest>=7.0
12
+ pytest-asyncio>=0.21
13
+ httpx>=0.24
@@ -0,0 +1,4 @@
1
+ cli
2
+ events
3
+ llm
4
+ registry
@@ -0,0 +1 @@
1
+ """Ecosystem CLI entry point."""
@@ -0,0 +1,4 @@
1
+ """Allow running as: python -m cli"""
2
+ from .main import main
3
+
4
+ main()