ouroboros-ai 0.3.0__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.

Files changed (42) hide show
  1. ouroboros/__init__.py +1 -1
  2. ouroboros/bigbang/__init__.py +9 -0
  3. ouroboros/bigbang/ontology.py +180 -0
  4. ouroboros/cli/commands/__init__.py +2 -0
  5. ouroboros/cli/commands/mcp.py +161 -0
  6. ouroboros/cli/commands/run.py +165 -27
  7. ouroboros/cli/main.py +2 -1
  8. ouroboros/core/ontology_aspect.py +455 -0
  9. ouroboros/core/ontology_questions.py +462 -0
  10. ouroboros/evaluation/__init__.py +16 -1
  11. ouroboros/evaluation/consensus.py +569 -11
  12. ouroboros/evaluation/models.py +81 -0
  13. ouroboros/events/ontology.py +135 -0
  14. ouroboros/mcp/__init__.py +83 -0
  15. ouroboros/mcp/client/__init__.py +20 -0
  16. ouroboros/mcp/client/adapter.py +632 -0
  17. ouroboros/mcp/client/manager.py +600 -0
  18. ouroboros/mcp/client/protocol.py +161 -0
  19. ouroboros/mcp/errors.py +377 -0
  20. ouroboros/mcp/resources/__init__.py +22 -0
  21. ouroboros/mcp/resources/handlers.py +328 -0
  22. ouroboros/mcp/server/__init__.py +21 -0
  23. ouroboros/mcp/server/adapter.py +408 -0
  24. ouroboros/mcp/server/protocol.py +291 -0
  25. ouroboros/mcp/server/security.py +636 -0
  26. ouroboros/mcp/tools/__init__.py +24 -0
  27. ouroboros/mcp/tools/definitions.py +351 -0
  28. ouroboros/mcp/tools/registry.py +269 -0
  29. ouroboros/mcp/types.py +333 -0
  30. ouroboros/orchestrator/__init__.py +31 -0
  31. ouroboros/orchestrator/events.py +40 -0
  32. ouroboros/orchestrator/mcp_config.py +419 -0
  33. ouroboros/orchestrator/mcp_tools.py +483 -0
  34. ouroboros/orchestrator/runner.py +119 -2
  35. ouroboros/providers/claude_code_adapter.py +75 -0
  36. ouroboros/strategies/__init__.py +23 -0
  37. ouroboros/strategies/devil_advocate.py +197 -0
  38. {ouroboros_ai-0.3.0.dist-info → ouroboros_ai-0.4.0.dist-info}/METADATA +10 -5
  39. {ouroboros_ai-0.3.0.dist-info → ouroboros_ai-0.4.0.dist-info}/RECORD +42 -17
  40. {ouroboros_ai-0.3.0.dist-info → ouroboros_ai-0.4.0.dist-info}/WHEEL +0 -0
  41. {ouroboros_ai-0.3.0.dist-info → ouroboros_ai-0.4.0.dist-info}/entry_points.txt +0 -0
  42. {ouroboros_ai-0.3.0.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
+ ]