ouroboros-ai 0.2.3__py3-none-any.whl → 0.4.0__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.
Potentially problematic release.
This version of ouroboros-ai might be problematic. Click here for more details.
- ouroboros/__init__.py +1 -1
- ouroboros/bigbang/__init__.py +9 -0
- ouroboros/bigbang/interview.py +16 -18
- ouroboros/bigbang/ontology.py +180 -0
- ouroboros/cli/commands/__init__.py +2 -0
- ouroboros/cli/commands/init.py +162 -97
- ouroboros/cli/commands/mcp.py +161 -0
- ouroboros/cli/commands/run.py +165 -27
- ouroboros/cli/main.py +2 -1
- ouroboros/core/ontology_aspect.py +455 -0
- ouroboros/core/ontology_questions.py +462 -0
- ouroboros/evaluation/__init__.py +16 -1
- ouroboros/evaluation/consensus.py +569 -11
- ouroboros/evaluation/models.py +81 -0
- ouroboros/events/ontology.py +135 -0
- ouroboros/mcp/__init__.py +83 -0
- ouroboros/mcp/client/__init__.py +20 -0
- ouroboros/mcp/client/adapter.py +632 -0
- ouroboros/mcp/client/manager.py +600 -0
- ouroboros/mcp/client/protocol.py +161 -0
- ouroboros/mcp/errors.py +377 -0
- ouroboros/mcp/resources/__init__.py +22 -0
- ouroboros/mcp/resources/handlers.py +328 -0
- ouroboros/mcp/server/__init__.py +21 -0
- ouroboros/mcp/server/adapter.py +408 -0
- ouroboros/mcp/server/protocol.py +291 -0
- ouroboros/mcp/server/security.py +636 -0
- ouroboros/mcp/tools/__init__.py +24 -0
- ouroboros/mcp/tools/definitions.py +351 -0
- ouroboros/mcp/tools/registry.py +269 -0
- ouroboros/mcp/types.py +333 -0
- ouroboros/orchestrator/__init__.py +31 -0
- ouroboros/orchestrator/events.py +40 -0
- ouroboros/orchestrator/mcp_config.py +419 -0
- ouroboros/orchestrator/mcp_tools.py +483 -0
- ouroboros/orchestrator/runner.py +119 -2
- ouroboros/providers/claude_code_adapter.py +75 -0
- ouroboros/strategies/__init__.py +23 -0
- ouroboros/strategies/devil_advocate.py +197 -0
- {ouroboros_ai-0.2.3.dist-info → ouroboros_ai-0.4.0.dist-info}/METADATA +73 -17
- {ouroboros_ai-0.2.3.dist-info → ouroboros_ai-0.4.0.dist-info}/RECORD +44 -19
- {ouroboros_ai-0.2.3.dist-info → ouroboros_ai-0.4.0.dist-info}/WHEEL +0 -0
- {ouroboros_ai-0.2.3.dist-info → ouroboros_ai-0.4.0.dist-info}/entry_points.txt +0 -0
- {ouroboros_ai-0.2.3.dist-info → ouroboros_ai-0.4.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"""Ouroboros resource handlers for MCP server.
|
|
2
|
+
|
|
3
|
+
This module defines resource handlers for exposing Ouroboros data:
|
|
4
|
+
- seeds: Access to seed definitions
|
|
5
|
+
- sessions: Access to session data
|
|
6
|
+
- events: Access to event history
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
|
|
12
|
+
import structlog
|
|
13
|
+
|
|
14
|
+
from ouroboros.core.types import Result
|
|
15
|
+
from ouroboros.mcp.errors import MCPResourceNotFoundError, MCPServerError
|
|
16
|
+
from ouroboros.mcp.types import MCPResourceContent, MCPResourceDefinition
|
|
17
|
+
|
|
18
|
+
log = structlog.get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class SeedsResourceHandler:
|
|
23
|
+
"""Handler for seed resources.
|
|
24
|
+
|
|
25
|
+
Provides access to seed definitions and content.
|
|
26
|
+
URI patterns:
|
|
27
|
+
- ouroboros://seeds - List all seeds
|
|
28
|
+
- ouroboros://seeds/{seed_id} - Get specific seed
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def definitions(self) -> Sequence[MCPResourceDefinition]:
|
|
33
|
+
"""Return the resource definitions."""
|
|
34
|
+
return (
|
|
35
|
+
MCPResourceDefinition(
|
|
36
|
+
uri="ouroboros://seeds",
|
|
37
|
+
name="Seeds List",
|
|
38
|
+
description="List of all available seeds in the system",
|
|
39
|
+
mime_type="application/json",
|
|
40
|
+
),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
async def handle(
|
|
44
|
+
self,
|
|
45
|
+
uri: str,
|
|
46
|
+
) -> Result[MCPResourceContent, MCPServerError]:
|
|
47
|
+
"""Handle a seed resource request.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
uri: The resource URI.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Result containing resource content or error.
|
|
54
|
+
"""
|
|
55
|
+
log.info("mcp.resource.seeds", uri=uri)
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
if uri == "ouroboros://seeds":
|
|
59
|
+
# TODO: Integrate with actual seed storage
|
|
60
|
+
content = (
|
|
61
|
+
'{"seeds": [\n'
|
|
62
|
+
' {"id": "seed-001", "name": "Example Seed", "status": "active"},\n'
|
|
63
|
+
' {"id": "seed-002", "name": "Another Seed", "status": "completed"}\n'
|
|
64
|
+
"]}"
|
|
65
|
+
)
|
|
66
|
+
return Result.ok(
|
|
67
|
+
MCPResourceContent(
|
|
68
|
+
uri=uri,
|
|
69
|
+
text=content,
|
|
70
|
+
mime_type="application/json",
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Handle specific seed ID
|
|
75
|
+
if uri.startswith("ouroboros://seeds/"):
|
|
76
|
+
seed_id = uri.replace("ouroboros://seeds/", "")
|
|
77
|
+
# TODO: Fetch actual seed
|
|
78
|
+
content = (
|
|
79
|
+
f'{{"id": "{seed_id}", '
|
|
80
|
+
f'"name": "Seed {seed_id}", '
|
|
81
|
+
f'"content": "Example seed content...", '
|
|
82
|
+
f'"status": "active"}}'
|
|
83
|
+
)
|
|
84
|
+
return Result.ok(
|
|
85
|
+
MCPResourceContent(
|
|
86
|
+
uri=uri,
|
|
87
|
+
text=content,
|
|
88
|
+
mime_type="application/json",
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
return Result.err(
|
|
93
|
+
MCPResourceNotFoundError(
|
|
94
|
+
f"Unknown seed resource: {uri}",
|
|
95
|
+
resource_type="seed",
|
|
96
|
+
resource_id=uri,
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
except Exception as e:
|
|
100
|
+
log.error("mcp.resource.seeds.error", uri=uri, error=str(e))
|
|
101
|
+
return Result.err(
|
|
102
|
+
MCPServerError(f"Failed to read seed resource: {e}")
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@dataclass
|
|
107
|
+
class SessionsResourceHandler:
|
|
108
|
+
"""Handler for session resources.
|
|
109
|
+
|
|
110
|
+
Provides access to session data and status.
|
|
111
|
+
URI patterns:
|
|
112
|
+
- ouroboros://sessions - List all sessions
|
|
113
|
+
- ouroboros://sessions/current - Get current active session
|
|
114
|
+
- ouroboros://sessions/{session_id} - Get specific session
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def definitions(self) -> Sequence[MCPResourceDefinition]:
|
|
119
|
+
"""Return the resource definitions."""
|
|
120
|
+
return (
|
|
121
|
+
MCPResourceDefinition(
|
|
122
|
+
uri="ouroboros://sessions",
|
|
123
|
+
name="Sessions List",
|
|
124
|
+
description="List of all sessions",
|
|
125
|
+
mime_type="application/json",
|
|
126
|
+
),
|
|
127
|
+
MCPResourceDefinition(
|
|
128
|
+
uri="ouroboros://sessions/current",
|
|
129
|
+
name="Current Session",
|
|
130
|
+
description="The currently active session",
|
|
131
|
+
mime_type="application/json",
|
|
132
|
+
),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
async def handle(
|
|
136
|
+
self,
|
|
137
|
+
uri: str,
|
|
138
|
+
) -> Result[MCPResourceContent, MCPServerError]:
|
|
139
|
+
"""Handle a session resource request.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
uri: The resource URI.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Result containing resource content or error.
|
|
146
|
+
"""
|
|
147
|
+
log.info("mcp.resource.sessions", uri=uri)
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
if uri == "ouroboros://sessions":
|
|
151
|
+
# TODO: Integrate with actual session management
|
|
152
|
+
content = (
|
|
153
|
+
'{"sessions": [\n'
|
|
154
|
+
' {"id": "session-001", "status": "active", "phase": "execution"},\n'
|
|
155
|
+
' {"id": "session-002", "status": "completed", "phase": "done"}\n'
|
|
156
|
+
"]}"
|
|
157
|
+
)
|
|
158
|
+
return Result.ok(
|
|
159
|
+
MCPResourceContent(
|
|
160
|
+
uri=uri,
|
|
161
|
+
text=content,
|
|
162
|
+
mime_type="application/json",
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
if uri == "ouroboros://sessions/current":
|
|
167
|
+
# TODO: Get actual current session
|
|
168
|
+
content = (
|
|
169
|
+
'{"id": "session-001", '
|
|
170
|
+
'"status": "active", '
|
|
171
|
+
'"phase": "execution", '
|
|
172
|
+
'"progress": 0.6, '
|
|
173
|
+
'"current_iteration": 3, '
|
|
174
|
+
'"max_iterations": 10}'
|
|
175
|
+
)
|
|
176
|
+
return Result.ok(
|
|
177
|
+
MCPResourceContent(
|
|
178
|
+
uri=uri,
|
|
179
|
+
text=content,
|
|
180
|
+
mime_type="application/json",
|
|
181
|
+
)
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# Handle specific session ID
|
|
185
|
+
if uri.startswith("ouroboros://sessions/"):
|
|
186
|
+
session_id = uri.replace("ouroboros://sessions/", "")
|
|
187
|
+
# TODO: Fetch actual session
|
|
188
|
+
content = (
|
|
189
|
+
f'{{"id": "{session_id}", '
|
|
190
|
+
f'"status": "active", '
|
|
191
|
+
f'"phase": "execution", '
|
|
192
|
+
f'"seed_id": "seed-001"}}'
|
|
193
|
+
)
|
|
194
|
+
return Result.ok(
|
|
195
|
+
MCPResourceContent(
|
|
196
|
+
uri=uri,
|
|
197
|
+
text=content,
|
|
198
|
+
mime_type="application/json",
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return Result.err(
|
|
203
|
+
MCPResourceNotFoundError(
|
|
204
|
+
f"Unknown session resource: {uri}",
|
|
205
|
+
resource_type="session",
|
|
206
|
+
resource_id=uri,
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
except Exception as e:
|
|
210
|
+
log.error("mcp.resource.sessions.error", uri=uri, error=str(e))
|
|
211
|
+
return Result.err(
|
|
212
|
+
MCPServerError(f"Failed to read session resource: {e}")
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
@dataclass
|
|
217
|
+
class EventsResourceHandler:
|
|
218
|
+
"""Handler for event resources.
|
|
219
|
+
|
|
220
|
+
Provides access to event history.
|
|
221
|
+
URI patterns:
|
|
222
|
+
- ouroboros://events - List recent events
|
|
223
|
+
- ouroboros://events/{session_id} - Events for a specific session
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
@property
|
|
227
|
+
def definitions(self) -> Sequence[MCPResourceDefinition]:
|
|
228
|
+
"""Return the resource definitions."""
|
|
229
|
+
return (
|
|
230
|
+
MCPResourceDefinition(
|
|
231
|
+
uri="ouroboros://events",
|
|
232
|
+
name="Events",
|
|
233
|
+
description="Recent event history",
|
|
234
|
+
mime_type="application/json",
|
|
235
|
+
),
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
async def handle(
|
|
239
|
+
self,
|
|
240
|
+
uri: str,
|
|
241
|
+
) -> Result[MCPResourceContent, MCPServerError]:
|
|
242
|
+
"""Handle an events resource request.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
uri: The resource URI.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Result containing resource content or error.
|
|
249
|
+
"""
|
|
250
|
+
log.info("mcp.resource.events", uri=uri)
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
if uri == "ouroboros://events":
|
|
254
|
+
# TODO: Integrate with actual event store
|
|
255
|
+
content = (
|
|
256
|
+
'{"events": [\n'
|
|
257
|
+
' {"id": "evt-001", "type": "execution", "session_id": "session-001", '
|
|
258
|
+
'"timestamp": "2025-01-25T10:00:00Z"},\n'
|
|
259
|
+
' {"id": "evt-002", "type": "evaluation", "session_id": "session-001", '
|
|
260
|
+
'"timestamp": "2025-01-25T10:01:00Z"}\n'
|
|
261
|
+
"]}"
|
|
262
|
+
)
|
|
263
|
+
return Result.ok(
|
|
264
|
+
MCPResourceContent(
|
|
265
|
+
uri=uri,
|
|
266
|
+
text=content,
|
|
267
|
+
mime_type="application/json",
|
|
268
|
+
)
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
# Handle session-specific events
|
|
272
|
+
if uri.startswith("ouroboros://events/"):
|
|
273
|
+
session_id = uri.replace("ouroboros://events/", "")
|
|
274
|
+
# TODO: Fetch actual events for session
|
|
275
|
+
content = (
|
|
276
|
+
f'{{"session_id": "{session_id}", "events": [\n'
|
|
277
|
+
f' {{"id": "evt-001", "type": "execution", '
|
|
278
|
+
f'"timestamp": "2025-01-25T10:00:00Z"}},\n'
|
|
279
|
+
f' {{"id": "evt-002", "type": "evaluation", '
|
|
280
|
+
f'"timestamp": "2025-01-25T10:01:00Z"}}\n'
|
|
281
|
+
f"]}}"
|
|
282
|
+
)
|
|
283
|
+
return Result.ok(
|
|
284
|
+
MCPResourceContent(
|
|
285
|
+
uri=uri,
|
|
286
|
+
text=content,
|
|
287
|
+
mime_type="application/json",
|
|
288
|
+
)
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
return Result.err(
|
|
292
|
+
MCPResourceNotFoundError(
|
|
293
|
+
f"Unknown events resource: {uri}",
|
|
294
|
+
resource_type="events",
|
|
295
|
+
resource_id=uri,
|
|
296
|
+
)
|
|
297
|
+
)
|
|
298
|
+
except Exception as e:
|
|
299
|
+
log.error("mcp.resource.events.error", uri=uri, error=str(e))
|
|
300
|
+
return Result.err(
|
|
301
|
+
MCPServerError(f"Failed to read events resource: {e}")
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
# Convenience functions for handler access
|
|
306
|
+
def seeds_handler() -> SeedsResourceHandler:
|
|
307
|
+
"""Create a SeedsResourceHandler instance."""
|
|
308
|
+
return SeedsResourceHandler()
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def sessions_handler() -> SessionsResourceHandler:
|
|
312
|
+
"""Create a SessionsResourceHandler instance."""
|
|
313
|
+
return SessionsResourceHandler()
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def events_handler() -> EventsResourceHandler:
|
|
317
|
+
"""Create an EventsResourceHandler instance."""
|
|
318
|
+
return EventsResourceHandler()
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
# List of all Ouroboros resources for registration
|
|
322
|
+
OUROBOROS_RESOURCES: tuple[
|
|
323
|
+
SeedsResourceHandler | SessionsResourceHandler | EventsResourceHandler, ...
|
|
324
|
+
] = (
|
|
325
|
+
SeedsResourceHandler(),
|
|
326
|
+
SessionsResourceHandler(),
|
|
327
|
+
EventsResourceHandler(),
|
|
328
|
+
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""MCP Server package.
|
|
2
|
+
|
|
3
|
+
This package provides MCP server functionality for exposing Ouroboros
|
|
4
|
+
capabilities to external MCP clients.
|
|
5
|
+
|
|
6
|
+
Public API:
|
|
7
|
+
MCPServer: Protocol defining the server interface
|
|
8
|
+
ToolHandler: Protocol for tool handlers
|
|
9
|
+
ResourceHandler: Protocol for resource handlers
|
|
10
|
+
MCPServerAdapter: Concrete implementation using FastMCP
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from ouroboros.mcp.server.adapter import MCPServerAdapter
|
|
14
|
+
from ouroboros.mcp.server.protocol import MCPServer, ResourceHandler, ToolHandler
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"MCPServer",
|
|
18
|
+
"ToolHandler",
|
|
19
|
+
"ResourceHandler",
|
|
20
|
+
"MCPServerAdapter",
|
|
21
|
+
]
|