agenticops-control-tower 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agenticops_control_tower/__init__.py +5 -0
- agenticops_control_tower/adapters/__init__.py +5 -0
- agenticops_control_tower/adapters/catalog.py +8 -0
- agenticops_control_tower/api/__init__.py +5 -0
- agenticops_control_tower/api/surface.py +28 -0
- agenticops_control_tower/cli/__init__.py +1 -0
- agenticops_control_tower/cli/main.py +11 -0
- agenticops_control_tower/config/__init__.py +5 -0
- agenticops_control_tower/config/models.py +19 -0
- agenticops_control_tower/console/__init__.py +1 -0
- agenticops_control_tower/console/app.py +7 -0
- agenticops_control_tower/discovery/__init__.py +5 -0
- agenticops_control_tower/discovery/service.py +17 -0
- agenticops_control_tower/models/__init__.py +5 -0
- agenticops_control_tower/models/agent.py +38 -0
- agenticops_control_tower/registry/__init__.py +5 -0
- agenticops_control_tower/registry/service.py +29 -0
- agenticops_control_tower-0.0.1.dist-info/METADATA +299 -0
- agenticops_control_tower-0.0.1.dist-info/RECORD +21 -0
- agenticops_control_tower-0.0.1.dist-info/WHEEL +4 -0
- agenticops_control_tower-0.0.1.dist-info/licenses/LICENSE +22 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Read-only scaffold API over the registry."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from agenticops_control_tower.discovery import CapabilityDiscoveryService
|
|
6
|
+
from agenticops_control_tower.models import AgentRecord
|
|
7
|
+
from agenticops_control_tower.registry import AgentRegistry
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ControlTowerAPI:
|
|
11
|
+
"""Small facade that mirrors the v0.1 roadmap surface."""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
registry: AgentRegistry,
|
|
16
|
+
discovery: CapabilityDiscoveryService,
|
|
17
|
+
) -> None:
|
|
18
|
+
self._registry = registry
|
|
19
|
+
self._discovery = discovery
|
|
20
|
+
|
|
21
|
+
def list_agents(self) -> list[AgentRecord]:
|
|
22
|
+
return self._registry.list_agents()
|
|
23
|
+
|
|
24
|
+
def get_agent(self, agent_id: str) -> AgentRecord:
|
|
25
|
+
return self._registry.get(agent_id)
|
|
26
|
+
|
|
27
|
+
def list_capabilities(self, agent_id: str) -> dict[str, str]:
|
|
28
|
+
return self._discovery.list_capabilities(self._registry.get(agent_id))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""CLI placeholders."""
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Placeholder CLI entry module.
|
|
2
|
+
|
|
3
|
+
No console script is published yet. This module exists so the scaffold already
|
|
4
|
+
has a stable home for future commands.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def main() -> str:
|
|
9
|
+
"""Return a short scaffold message for direct import-based smoke tests."""
|
|
10
|
+
|
|
11
|
+
return "agenticops-control-tower CLI scaffold"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Future-facing configuration models kept intentionally small."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ConfigScope(BaseModel):
|
|
9
|
+
"""Target scope for a future centralized config operation."""
|
|
10
|
+
|
|
11
|
+
agent_id: str | None = None
|
|
12
|
+
environment: str | None = None
|
|
13
|
+
capability: str | None = None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ConfigPatch(BaseModel):
|
|
17
|
+
"""Opaque patch payload for the scaffold stage."""
|
|
18
|
+
|
|
19
|
+
values: dict[str, object] = Field(default_factory=dict)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Web console placeholders."""
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Capability discovery scaffold.
|
|
2
|
+
|
|
3
|
+
The real implementation will likely combine explicit agent-reported metadata
|
|
4
|
+
with adapter-assisted discovery. For now this module only exposes a normalized
|
|
5
|
+
view over an agent's reported capabilities.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from agenticops_control_tower.models import AgentRecord
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CapabilityDiscoveryService:
|
|
14
|
+
"""Scaffold normalization for capability inventory."""
|
|
15
|
+
|
|
16
|
+
def list_capabilities(self, agent: AgentRecord) -> dict[str, str]:
|
|
17
|
+
return dict(sorted(agent.capabilities.items()))
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Minimal agent inventory models for the scaffold stage."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AgentStatus(str, Enum):
|
|
12
|
+
"""High-level health states for the initial registry model."""
|
|
13
|
+
|
|
14
|
+
HEALTHY = "healthy"
|
|
15
|
+
DEGRADED = "degraded"
|
|
16
|
+
UNHEALTHY = "unhealthy"
|
|
17
|
+
UNKNOWN = "unknown"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class HeartbeatPayload(BaseModel):
|
|
21
|
+
"""Runtime-reported status snapshot for a registered agent."""
|
|
22
|
+
|
|
23
|
+
status: AgentStatus = AgentStatus.UNKNOWN
|
|
24
|
+
last_seen: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
25
|
+
capabilities: dict[str, str] = Field(default_factory=dict)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class AgentRecord(BaseModel):
|
|
29
|
+
"""Inventory record for one known agent."""
|
|
30
|
+
|
|
31
|
+
agent_id: str
|
|
32
|
+
name: str
|
|
33
|
+
environment: str
|
|
34
|
+
runtime: str
|
|
35
|
+
framework: str
|
|
36
|
+
status: AgentStatus = AgentStatus.UNKNOWN
|
|
37
|
+
capabilities: dict[str, str] = Field(default_factory=dict)
|
|
38
|
+
last_seen: datetime | None = None
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""In-memory scaffold for registration and heartbeat flows."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from agenticops_control_tower.models import AgentRecord, HeartbeatPayload
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AgentRegistry:
|
|
9
|
+
"""Very small in-memory registry to anchor the scaffold tests."""
|
|
10
|
+
|
|
11
|
+
def __init__(self) -> None:
|
|
12
|
+
self._agents: dict[str, AgentRecord] = {}
|
|
13
|
+
|
|
14
|
+
def register(self, agent: AgentRecord) -> AgentRecord:
|
|
15
|
+
self._agents[agent.agent_id] = agent
|
|
16
|
+
return agent
|
|
17
|
+
|
|
18
|
+
def heartbeat(self, agent_id: str, heartbeat: HeartbeatPayload) -> AgentRecord:
|
|
19
|
+
agent = self._agents[agent_id]
|
|
20
|
+
agent.status = heartbeat.status
|
|
21
|
+
agent.last_seen = heartbeat.last_seen
|
|
22
|
+
agent.capabilities = heartbeat.capabilities
|
|
23
|
+
return agent
|
|
24
|
+
|
|
25
|
+
def list_agents(self) -> list[AgentRecord]:
|
|
26
|
+
return list(self._agents.values())
|
|
27
|
+
|
|
28
|
+
def get(self, agent_id: str) -> AgentRecord:
|
|
29
|
+
return self._agents[agent_id]
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: agenticops-control-tower
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Unified control plane and operations console for the DeepAgentLabs ecosystem.
|
|
5
|
+
Project-URL: Homepage, https://github.com/DeepAgentLabs/agenticops-control-tower
|
|
6
|
+
Project-URL: Repository, https://github.com/DeepAgentLabs/agenticops-control-tower
|
|
7
|
+
Project-URL: Issues, https://github.com/DeepAgentLabs/agenticops-control-tower/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/DeepAgentLabs/agenticops-control-tower/blob/main/CHANGELOG.md
|
|
9
|
+
Author: agenticops-control-tower Contributors
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 agenticops-control-tower Contributors
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Keywords: agents,chaos,control-plane,governance,observability,operations
|
|
34
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
35
|
+
Classifier: Intended Audience :: Developers
|
|
36
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
41
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
42
|
+
Requires-Python: >=3.10
|
|
43
|
+
Requires-Dist: pydantic<3,>=2.0
|
|
44
|
+
Provides-Extra: agentic-chaos
|
|
45
|
+
Requires-Dist: agentic-chaos>=0.1; extra == 'agentic-chaos'
|
|
46
|
+
Provides-Extra: agentic-sidecar
|
|
47
|
+
Requires-Dist: agentic-sidecar>=0.0.1; extra == 'agentic-sidecar'
|
|
48
|
+
Provides-Extra: agenticlens
|
|
49
|
+
Requires-Dist: agenticlens>=0.1.3; extra == 'agenticlens'
|
|
50
|
+
Provides-Extra: deep-agentic-core-mcp
|
|
51
|
+
Requires-Dist: deep-agentic-core-mcp>=0.2.0; extra == 'deep-agentic-core-mcp'
|
|
52
|
+
Provides-Extra: dev
|
|
53
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
54
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
56
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
57
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
58
|
+
Requires-Dist: twine>=5.1; extra == 'dev'
|
|
59
|
+
Description-Content-Type: text/markdown
|
|
60
|
+
|
|
61
|
+
# agenticops-control-tower
|
|
62
|
+
|
|
63
|
+
**A unified control plane and operations console for the DeepAgentLabs ecosystem.**
|
|
64
|
+
|
|
65
|
+
> AgenticLens observes. Agentic Sidecar governs. Agentic Chaos tests. Agentic
|
|
66
|
+
> MCP connects. Control Tower operates.
|
|
67
|
+
|
|
68
|
+
## Status
|
|
69
|
+
|
|
70
|
+
**Concept / pre-implementation.** This repository currently contains the
|
|
71
|
+
architecture proposal ([`DeepAgent Control Tower End-to-End Concept.md`](DeepAgent%20Control%20Tower%20End-to-End%20Concept.md)),
|
|
72
|
+
this README, and the build plan in [ROADMAP.md](ROADMAP.md).
|
|
73
|
+
|
|
74
|
+
There is **no package code, no PyPI release, no API server, no CLI, and no web
|
|
75
|
+
console yet**. The point of the project today is to define the control-plane
|
|
76
|
+
shape clearly enough that implementation can start in a narrow, believable
|
|
77
|
+
order.
|
|
78
|
+
|
|
79
|
+
## Contents
|
|
80
|
+
|
|
81
|
+
- [Why this exists](#why-this-exists)
|
|
82
|
+
- [What Control Tower is](#what-control-tower-is)
|
|
83
|
+
- [What it is not](#what-it-is-not)
|
|
84
|
+
- [Architecture](#architecture)
|
|
85
|
+
- [Control Tower surfaces](#control-tower-surfaces)
|
|
86
|
+
- [Human operators and AI operators](#human-operators-and-ai-operators)
|
|
87
|
+
- [Runtime and framework position](#runtime-and-framework-position)
|
|
88
|
+
- [The DeepAgentLabs ecosystem](#the-deepagentlabs-ecosystem)
|
|
89
|
+
- [Initial scope](#initial-scope)
|
|
90
|
+
- [Roadmap](#roadmap)
|
|
91
|
+
|
|
92
|
+
## Why this exists
|
|
93
|
+
|
|
94
|
+
The DeepAgentLabs projects each answer a different operational question:
|
|
95
|
+
|
|
96
|
+
- **AgenticLens** asks: what happened, why did it happen, and what should I fix?
|
|
97
|
+
- **Agentic Sidecar** asks: should this action happen right now, given the
|
|
98
|
+
user's intent and current risk?
|
|
99
|
+
- **Agentic Chaos** asks: what breaks under stress, failure, and silent
|
|
100
|
+
degradation?
|
|
101
|
+
- **Agentic MCP** asks: how do hosts and agents access these capabilities
|
|
102
|
+
through one MCP-native surface?
|
|
103
|
+
|
|
104
|
+
What is still missing is the layer above them:
|
|
105
|
+
|
|
106
|
+
> What is deployed, where is it running, which capabilities are enabled, what
|
|
107
|
+
> is unhealthy, and how do I operate all of it from one place?
|
|
108
|
+
|
|
109
|
+
That missing layer is the job of `agenticops-control-tower`.
|
|
110
|
+
|
|
111
|
+
## What Control Tower is
|
|
112
|
+
|
|
113
|
+
Control Tower is intended to be the **runtime-agnostic, framework-agnostic
|
|
114
|
+
operations layer** for teams running multiple agents and multiple
|
|
115
|
+
DeepAgentLabs capabilities.
|
|
116
|
+
|
|
117
|
+
At a high level, it should eventually provide:
|
|
118
|
+
|
|
119
|
+
- a central agent registry
|
|
120
|
+
- capability discovery across agents and environments
|
|
121
|
+
- health and status visibility
|
|
122
|
+
- centralized configuration for supported capabilities
|
|
123
|
+
- a unified control API
|
|
124
|
+
- a human CLI
|
|
125
|
+
- a web console for operators
|
|
126
|
+
|
|
127
|
+
The key distinction is that Control Tower is **not just a dashboard**. The
|
|
128
|
+
dashboard is only one interface to the underlying control plane.
|
|
129
|
+
|
|
130
|
+
## What it is not
|
|
131
|
+
|
|
132
|
+
- **Not a replacement for AgenticLens.** Control Tower may surface Lens
|
|
133
|
+
insights, but Lens remains the observability and evaluation engine.
|
|
134
|
+
- **Not a replacement for Agentic Sidecar.** Control Tower may surface
|
|
135
|
+
Sidecar decisions and governance posture, but Sidecar remains the
|
|
136
|
+
decision-time supervision layer.
|
|
137
|
+
- **Not a replacement for Agentic Chaos.** Control Tower may orchestrate or
|
|
138
|
+
summarize chaos posture, but Chaos remains the resilience-testing engine.
|
|
139
|
+
- **Not the MCP layer itself.** Agentic MCP remains an independent package
|
|
140
|
+
and should be able to connect both to individual DeepAgentLabs capabilities
|
|
141
|
+
and to Control Tower.
|
|
142
|
+
- **Not tied to one runtime or one framework.** The control plane should sit
|
|
143
|
+
above LangGraph, CrewAI, AutoGen, OpenAI Agents SDK, AWS AgentCore-style
|
|
144
|
+
workloads, MCP-native agents, and custom Python systems rather than
|
|
145
|
+
assuming one execution model.
|
|
146
|
+
- **Not implemented yet.** The architecture in the concept doc is broader
|
|
147
|
+
than what a first real release should attempt. See [ROADMAP.md](ROADMAP.md)
|
|
148
|
+
for the narrowed build order.
|
|
149
|
+
|
|
150
|
+
## Architecture
|
|
151
|
+
|
|
152
|
+
The ecosystem boundary should stay crisp:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
Control Tower = OPERATE
|
|
156
|
+
Agentic MCP = CONNECT
|
|
157
|
+
AgenticLens = OBSERVE
|
|
158
|
+
Agentic Sidecar = GOVERN
|
|
159
|
+
Agentic Chaos = TEST
|
|
160
|
+
AI Operations Specification = STANDARDIZE
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Conceptually:
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
Human operators AI operators
|
|
167
|
+
| |
|
|
168
|
+
Console / CLI / API Agentic MCP
|
|
169
|
+
| |
|
|
170
|
+
+-----------+-----------+
|
|
171
|
+
|
|
|
172
|
+
v
|
|
173
|
+
DeepAgent Control Tower
|
|
174
|
+
|
|
|
175
|
+
+------------------+------------------+
|
|
176
|
+
| | |
|
|
177
|
+
v v v
|
|
178
|
+
AgenticLens Agentic Sidecar Agentic Chaos
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Control Tower's role is to centralize operations across agents and
|
|
182
|
+
capabilities, not to absorb the implementation logic of the sibling projects.
|
|
183
|
+
|
|
184
|
+
## Control Tower surfaces
|
|
185
|
+
|
|
186
|
+
The concept doc points to five main product surfaces:
|
|
187
|
+
|
|
188
|
+
- **Agent Registry**: inventory of known agents, runtimes, frameworks,
|
|
189
|
+
environments, capability versions, and last-seen status
|
|
190
|
+
- **Capability Discovery**: detect which DeepAgentLabs packages and features
|
|
191
|
+
are present on each agent wherever automatic discovery is technically
|
|
192
|
+
feasible
|
|
193
|
+
- **Configuration**: centralized configuration and policy updates for
|
|
194
|
+
supported capabilities
|
|
195
|
+
- **Unified Control API**: one programmatic interface over inventory, health,
|
|
196
|
+
capability status, and supported operations
|
|
197
|
+
- **AgenticOps Console**: the human-facing dashboard over the same control
|
|
198
|
+
plane used by the API and CLI
|
|
199
|
+
|
|
200
|
+
The CLI should be a first-class interface, not an afterthought. The same is
|
|
201
|
+
true for AI-facing operation through Agentic MCP once the underlying control
|
|
202
|
+
API exists.
|
|
203
|
+
|
|
204
|
+
## Human operators and AI operators
|
|
205
|
+
|
|
206
|
+
This project is unusual in that it has two equally important operator models:
|
|
207
|
+
|
|
208
|
+
- **Humans** should be able to use a console, CLI, or API to inspect and
|
|
209
|
+
operate agents across environments.
|
|
210
|
+
- **AI systems** should be able to use Agentic MCP to inspect and operate the
|
|
211
|
+
same control plane through an MCP-native interface.
|
|
212
|
+
|
|
213
|
+
That separation matters:
|
|
214
|
+
|
|
215
|
+
- Control Tower does **not** require MCP
|
|
216
|
+
- MCP does **not** require Control Tower
|
|
217
|
+
- when used together, MCP becomes the AI-native interface to the control
|
|
218
|
+
plane
|
|
219
|
+
|
|
220
|
+
## Runtime and framework position
|
|
221
|
+
|
|
222
|
+
Control Tower should be:
|
|
223
|
+
|
|
224
|
+
- **runtime agnostic**: local Python, containers, VMs, Kubernetes,
|
|
225
|
+
serverless, cloud-specific runtimes, and on-prem systems are all valid
|
|
226
|
+
targets
|
|
227
|
+
- **framework agnostic**: LangGraph, CrewAI, AutoGen, OpenAI Agents SDK,
|
|
228
|
+
custom harnesses, MCP-based agents, and future frameworks should all fit
|
|
229
|
+
the model
|
|
230
|
+
- **modular**: teams should be able to adopt a single DeepAgentLabs
|
|
231
|
+
capability without adopting the entire stack
|
|
232
|
+
|
|
233
|
+
That means deployment packaging is an implementation choice, not an
|
|
234
|
+
architectural dependency.
|
|
235
|
+
|
|
236
|
+
## The DeepAgentLabs ecosystem
|
|
237
|
+
|
|
238
|
+
Control Tower only makes sense if the package boundaries stay clear:
|
|
239
|
+
|
|
240
|
+
| Project | Role |
|
|
241
|
+
| --- | --- |
|
|
242
|
+
| `agenticlens` | Observe |
|
|
243
|
+
| `agentic-sidecar` | Govern |
|
|
244
|
+
| `agentic-chaos` | Test |
|
|
245
|
+
| `deep-agentic-core-mcp` | Connect |
|
|
246
|
+
| `ai-operations-spec` | Standardize |
|
|
247
|
+
| `agenticops-control-tower` | Operate |
|
|
248
|
+
|
|
249
|
+
- **AgenticLens** remains package-first observability, evaluation, and
|
|
250
|
+
operational intelligence
|
|
251
|
+
- **Agentic Sidecar** remains package-first supervision and governance
|
|
252
|
+
- **Agentic Chaos** remains package-first resilience and fault injection
|
|
253
|
+
- **Agentic MCP** remains the MCP-native access layer
|
|
254
|
+
- **AI Operations Specification** remains the shared operational contract
|
|
255
|
+
- **Control Tower** becomes the centralized operate/manage layer across them
|
|
256
|
+
|
|
257
|
+
This repository should therefore stay focused on:
|
|
258
|
+
|
|
259
|
+
- inventory and registry concerns
|
|
260
|
+
- control-plane APIs
|
|
261
|
+
- capability discovery contracts
|
|
262
|
+
- health and readiness visibility
|
|
263
|
+
- centralized operations and configuration
|
|
264
|
+
- multi-agent, multi-environment control-room workflows
|
|
265
|
+
|
|
266
|
+
It should not quietly turn into a duplicate implementation of the sibling
|
|
267
|
+
projects.
|
|
268
|
+
|
|
269
|
+
## Initial scope
|
|
270
|
+
|
|
271
|
+
The concept doc describes a very broad end state. A good first implementation
|
|
272
|
+
needs to be much narrower.
|
|
273
|
+
|
|
274
|
+
The first usable version should likely prove four things only:
|
|
275
|
+
|
|
276
|
+
1. agents can register and heartbeat
|
|
277
|
+
2. the system can discover installed DeepAgentLabs capabilities and versions
|
|
278
|
+
3. operators can inspect that inventory through a simple API and CLI
|
|
279
|
+
4. the same inventory can be surfaced later in a console without changing the
|
|
280
|
+
underlying control model
|
|
281
|
+
|
|
282
|
+
That is enough to validate the control-plane idea without pretending the full
|
|
283
|
+
dashboard, configuration orchestration, and cross-agent operations engine
|
|
284
|
+
already exist.
|
|
285
|
+
|
|
286
|
+
## Roadmap
|
|
287
|
+
|
|
288
|
+
The build plan is in [ROADMAP.md](ROADMAP.md). In short, the intended order
|
|
289
|
+
should be:
|
|
290
|
+
|
|
291
|
+
- start with a narrow registry and discovery core
|
|
292
|
+
- add a real control API and CLI before building the dashboard
|
|
293
|
+
- surface Lens, Sidecar, and Chaos data gradually rather than simulating a
|
|
294
|
+
complete integration layer
|
|
295
|
+
- add MCP connectivity to Control Tower after the underlying control surfaces
|
|
296
|
+
are real
|
|
297
|
+
|
|
298
|
+
If you want the full architectural reasoning behind those choices, read the
|
|
299
|
+
concept doc first and the roadmap second.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
agenticops_control_tower/__init__.py,sha256=61wxMKH4DGduCllcmDdiqlb_kepXCS3eMymczEGGe04,110
|
|
2
|
+
agenticops_control_tower/adapters/__init__.py,sha256=XtsNvzmekjd_6r3ToYas-sP0s-1uFt7TvOeYCeTPnlA,108
|
|
3
|
+
agenticops_control_tower/adapters/catalog.py,sha256=cmvYsVz961Y9FoyriJApo321rKTeFL4VPluOOe-OAk0,168
|
|
4
|
+
agenticops_control_tower/api/__init__.py,sha256=kR51genXB-bD_S6oGCjIW6x6UxTzJeoO2iDirsDWvkc,107
|
|
5
|
+
agenticops_control_tower/api/surface.py,sha256=MmRqDbj1qFvgk8XB5P2JO-2WF0P0qVBvl9K2xKT0oDI,899
|
|
6
|
+
agenticops_control_tower/cli/__init__.py,sha256=4kEEfC9ZwIa9hxFKgQqIycgy9TiUL4oC_NSEwFDQVig,24
|
|
7
|
+
agenticops_control_tower/cli/main.py,sha256=PFu0cLLYdsoe1FjRmlUqkPdx6QDVZyxf53vFPZCbI5I,308
|
|
8
|
+
agenticops_control_tower/config/__init__.py,sha256=J_Y5bKWBvYLNZchWmUVuGKsUMAvtMoupQqKm_gH0-i4,122
|
|
9
|
+
agenticops_control_tower/config/models.py,sha256=n6YTda_b_RULN7bTIuHsbSU_GRBWcP5LG0dMum7G_XI,490
|
|
10
|
+
agenticops_control_tower/console/__init__.py,sha256=fM845KVyxz8p-K8PsICMD1Bj8y_G-RUK-6A68uSJ_w0,32
|
|
11
|
+
agenticops_control_tower/console/app.py,sha256=G-Oy3f_1W8hzVWQzFzJVk-_QHO0EHhKwhjvHkOk-ysw,156
|
|
12
|
+
agenticops_control_tower/discovery/__init__.py,sha256=KLe7TpItYKZ6lzIACdNBwPDwS1ex9_W7HA92b6iURR8,132
|
|
13
|
+
agenticops_control_tower/discovery/service.py,sha256=2_bmnhk_se_PwbmEaq098kf_PhscaXMSmcpDY1CWjqc,555
|
|
14
|
+
agenticops_control_tower/models/__init__.py,sha256=taX-27pcbiU7zUAj262fOP49TkB7-YbpizOY1IOXhRw,175
|
|
15
|
+
agenticops_control_tower/models/agent.py,sha256=gH81kQuw5njjFBvAcRWfnsz2OSyucAidnc18OFG-ACM,1016
|
|
16
|
+
agenticops_control_tower/registry/__init__.py,sha256=E-YX9LmbUxoirPtoDKhJ1IFidrNfmqyI-lKuqHY82HI,98
|
|
17
|
+
agenticops_control_tower/registry/service.py,sha256=WEAy-H5KpNTZY66AogMvS8HeCoNK25gEZ6L0loj3yPo,939
|
|
18
|
+
agenticops_control_tower-0.0.1.dist-info/METADATA,sha256=iZZc8i61vNwV7z0iBPdkKYPeh5Lpc5X96UDTYeM_UrY,12192
|
|
19
|
+
agenticops_control_tower-0.0.1.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
20
|
+
agenticops_control_tower-0.0.1.dist-info/licenses/LICENSE,sha256=lvV6QrIxN4zuHKwVLpiYXXX_tQecwGTAYsiIAw3Cd3A,1095
|
|
21
|
+
agenticops_control_tower-0.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 agenticops-control-tower Contributors
|
|
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.
|
|
22
|
+
|