jarviscore-framework 0.2.0__py3-none-any.whl → 0.3.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.
- examples/cloud_deployment_example.py +162 -0
- examples/customagent_p2p_example.py +566 -183
- examples/fastapi_integration_example.py +570 -0
- examples/listeneragent_cognitive_discovery_example.py +343 -0
- jarviscore/__init__.py +22 -5
- jarviscore/cli/smoketest.py +8 -4
- jarviscore/core/agent.py +227 -0
- jarviscore/data/examples/cloud_deployment_example.py +162 -0
- jarviscore/data/examples/customagent_p2p_example.py +566 -183
- jarviscore/data/examples/fastapi_integration_example.py +570 -0
- jarviscore/data/examples/listeneragent_cognitive_discovery_example.py +343 -0
- jarviscore/docs/API_REFERENCE.md +296 -3
- jarviscore/docs/CHANGELOG.md +97 -0
- jarviscore/docs/CONFIGURATION.md +2 -2
- jarviscore/docs/CUSTOMAGENT_GUIDE.md +2021 -255
- jarviscore/docs/GETTING_STARTED.md +112 -8
- jarviscore/docs/TROUBLESHOOTING.md +3 -3
- jarviscore/docs/USER_GUIDE.md +152 -6
- jarviscore/integrations/__init__.py +16 -0
- jarviscore/integrations/fastapi.py +247 -0
- jarviscore/p2p/broadcaster.py +10 -3
- jarviscore/p2p/coordinator.py +310 -14
- jarviscore/p2p/keepalive.py +45 -23
- jarviscore/p2p/peer_client.py +282 -10
- jarviscore/p2p/swim_manager.py +9 -4
- jarviscore/profiles/__init__.py +10 -2
- jarviscore/profiles/listeneragent.py +292 -0
- {jarviscore_framework-0.2.0.dist-info → jarviscore_framework-0.3.0.dist-info}/METADATA +42 -8
- {jarviscore_framework-0.2.0.dist-info → jarviscore_framework-0.3.0.dist-info}/RECORD +36 -22
- {jarviscore_framework-0.2.0.dist-info → jarviscore_framework-0.3.0.dist-info}/WHEEL +1 -1
- tests/test_13_dx_improvements.py +554 -0
- tests/test_14_cloud_deployment.py +403 -0
- tests/test_15_llm_cognitive_discovery.py +684 -0
- tests/test_16_unified_dx_flow.py +947 -0
- {jarviscore_framework-0.2.0.dist-info → jarviscore_framework-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {jarviscore_framework-0.2.0.dist-info → jarviscore_framework-0.3.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ListenerAgent - Agent profile for API-first services with secondary P2P.
|
|
3
|
+
|
|
4
|
+
For agents where HTTP API is primary and P2P listening is background
|
|
5
|
+
functionality. Abstracts away the message loop - developers just
|
|
6
|
+
implement handlers.
|
|
7
|
+
|
|
8
|
+
Example:
|
|
9
|
+
class MyAPIAgent(ListenerAgent):
|
|
10
|
+
role = "api_processor"
|
|
11
|
+
capabilities = ["data_processing"]
|
|
12
|
+
|
|
13
|
+
async def on_peer_request(self, msg):
|
|
14
|
+
result = await self.process(msg.data)
|
|
15
|
+
return {"status": "success", "result": result}
|
|
16
|
+
|
|
17
|
+
async def on_peer_notify(self, msg):
|
|
18
|
+
await self.log_event(msg.data)
|
|
19
|
+
"""
|
|
20
|
+
from abc import abstractmethod
|
|
21
|
+
from typing import Any, Optional, Dict
|
|
22
|
+
import asyncio
|
|
23
|
+
import logging
|
|
24
|
+
|
|
25
|
+
from .customagent import CustomAgent
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ListenerAgent(CustomAgent):
|
|
31
|
+
"""
|
|
32
|
+
Agent that listens for peer messages without requiring a custom run() loop.
|
|
33
|
+
|
|
34
|
+
Designed for API-first agents where:
|
|
35
|
+
- The HTTP server (FastAPI, etc.) is the primary interface
|
|
36
|
+
- P2P mesh participation is secondary/background functionality
|
|
37
|
+
- You just want to handle incoming peer messages without loop boilerplate
|
|
38
|
+
|
|
39
|
+
Instead of writing a run() loop, implement message handlers:
|
|
40
|
+
- on_peer_request(msg) - Handle request-response messages (return value sent back)
|
|
41
|
+
- on_peer_notify(msg) - Handle fire-and-forget notifications
|
|
42
|
+
|
|
43
|
+
Configuration Attributes:
|
|
44
|
+
listen_timeout: Seconds to wait for messages before checking shutdown (default: 1.0)
|
|
45
|
+
auto_respond: Automatically send on_peer_request return value as response (default: True)
|
|
46
|
+
|
|
47
|
+
Example - Basic Usage:
|
|
48
|
+
class MyAPIAgent(ListenerAgent):
|
|
49
|
+
role = "api_processor"
|
|
50
|
+
capabilities = ["processing"]
|
|
51
|
+
|
|
52
|
+
async def on_peer_request(self, msg):
|
|
53
|
+
# Handle incoming requests from other agents
|
|
54
|
+
result = await self.process(msg.data)
|
|
55
|
+
return {"status": "success", "result": result}
|
|
56
|
+
|
|
57
|
+
async def on_peer_notify(self, msg):
|
|
58
|
+
# Handle fire-and-forget notifications
|
|
59
|
+
await self.log_event(msg.data)
|
|
60
|
+
|
|
61
|
+
Example - With FastAPI:
|
|
62
|
+
from fastapi import FastAPI
|
|
63
|
+
from jarviscore.integrations.fastapi import JarvisLifespan
|
|
64
|
+
from jarviscore.profiles import ListenerAgent
|
|
65
|
+
|
|
66
|
+
class ProcessorAgent(ListenerAgent):
|
|
67
|
+
role = "processor"
|
|
68
|
+
capabilities = ["data_processing"]
|
|
69
|
+
|
|
70
|
+
async def on_peer_request(self, msg):
|
|
71
|
+
if msg.data.get("action") == "process":
|
|
72
|
+
return {"result": await self.process(msg.data["payload"])}
|
|
73
|
+
return {"error": "unknown action"}
|
|
74
|
+
|
|
75
|
+
agent = ProcessorAgent()
|
|
76
|
+
app = FastAPI(lifespan=JarvisLifespan(agent, mode="p2p"))
|
|
77
|
+
|
|
78
|
+
@app.post("/process")
|
|
79
|
+
async def process_endpoint(data: dict, request: Request):
|
|
80
|
+
# HTTP endpoint - primary interface
|
|
81
|
+
agent = request.app.state.jarvis_agents["processor"]
|
|
82
|
+
return await agent.process(data)
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
# Configuration - can be overridden in subclasses
|
|
86
|
+
listen_timeout: float = 1.0 # Seconds to wait for messages
|
|
87
|
+
auto_respond: bool = True # Automatically send response for requests
|
|
88
|
+
|
|
89
|
+
async def run(self):
|
|
90
|
+
"""
|
|
91
|
+
Default listener loop - handles peer messages automatically.
|
|
92
|
+
|
|
93
|
+
Runs in background, dispatches incoming messages to:
|
|
94
|
+
- on_peer_request() for request-response messages
|
|
95
|
+
- on_peer_notify() for fire-and-forget notifications
|
|
96
|
+
|
|
97
|
+
You typically don't need to override this. Just implement the handlers.
|
|
98
|
+
"""
|
|
99
|
+
self._logger.info(f"[{self.role}] Listener loop started")
|
|
100
|
+
|
|
101
|
+
while not self.shutdown_requested:
|
|
102
|
+
try:
|
|
103
|
+
# Wait for incoming message with timeout
|
|
104
|
+
# Timeout allows periodic shutdown_requested checks
|
|
105
|
+
msg = await self.peers.receive(timeout=self.listen_timeout)
|
|
106
|
+
|
|
107
|
+
if msg is None:
|
|
108
|
+
# Timeout - no message, continue loop to check shutdown
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
# Dispatch to appropriate handler
|
|
112
|
+
await self._dispatch_message(msg)
|
|
113
|
+
|
|
114
|
+
except asyncio.CancelledError:
|
|
115
|
+
self._logger.debug(f"[{self.role}] Listener loop cancelled")
|
|
116
|
+
raise
|
|
117
|
+
except Exception as e:
|
|
118
|
+
self._logger.error(f"[{self.role}] Listener loop error: {e}")
|
|
119
|
+
await self.on_error(e, None)
|
|
120
|
+
|
|
121
|
+
self._logger.info(f"[{self.role}] Listener loop stopped")
|
|
122
|
+
|
|
123
|
+
async def _dispatch_message(self, msg):
|
|
124
|
+
"""
|
|
125
|
+
Dispatch message to appropriate handler based on message type.
|
|
126
|
+
|
|
127
|
+
Handles:
|
|
128
|
+
- REQUEST messages: calls on_peer_request, sends response if auto_respond=True
|
|
129
|
+
- NOTIFY messages: calls on_peer_notify
|
|
130
|
+
"""
|
|
131
|
+
from jarviscore.p2p.messages import MessageType
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
# Check if this is a request (expects response)
|
|
135
|
+
is_request = (
|
|
136
|
+
msg.type == MessageType.REQUEST or
|
|
137
|
+
getattr(msg, 'is_request', False) or
|
|
138
|
+
msg.correlation_id is not None
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if is_request:
|
|
142
|
+
# Request-response: call handler, optionally send response
|
|
143
|
+
response = await self.on_peer_request(msg)
|
|
144
|
+
|
|
145
|
+
if self.auto_respond and response is not None:
|
|
146
|
+
await self.peers.respond(msg, response)
|
|
147
|
+
self._logger.debug(
|
|
148
|
+
f"[{self.role}] Sent response to {msg.sender}"
|
|
149
|
+
)
|
|
150
|
+
else:
|
|
151
|
+
# Notification: fire-and-forget
|
|
152
|
+
await self.on_peer_notify(msg)
|
|
153
|
+
|
|
154
|
+
except Exception as e:
|
|
155
|
+
self._logger.error(
|
|
156
|
+
f"[{self.role}] Error handling message from {msg.sender}: {e}"
|
|
157
|
+
)
|
|
158
|
+
await self.on_error(e, msg)
|
|
159
|
+
|
|
160
|
+
# ─────────────────────────────────────────────────────────────────
|
|
161
|
+
# Override these methods in your agent
|
|
162
|
+
# ─────────────────────────────────────────────────────────────────
|
|
163
|
+
|
|
164
|
+
@abstractmethod
|
|
165
|
+
async def on_peer_request(self, msg) -> Any:
|
|
166
|
+
"""
|
|
167
|
+
Handle incoming peer request.
|
|
168
|
+
|
|
169
|
+
Override this to process request-response messages from other agents.
|
|
170
|
+
The return value is automatically sent as response (if auto_respond=True).
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
msg: IncomingMessage with:
|
|
174
|
+
- msg.sender: Sender agent ID or role
|
|
175
|
+
- msg.data: Request payload (dict)
|
|
176
|
+
- msg.correlation_id: For response matching (handled automatically)
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Response data (dict) to send back to the requester.
|
|
180
|
+
Return None to skip sending a response.
|
|
181
|
+
|
|
182
|
+
Example:
|
|
183
|
+
async def on_peer_request(self, msg):
|
|
184
|
+
action = msg.data.get("action")
|
|
185
|
+
|
|
186
|
+
if action == "analyze":
|
|
187
|
+
result = await self.analyze(msg.data["payload"])
|
|
188
|
+
return {"status": "success", "result": result}
|
|
189
|
+
|
|
190
|
+
elif action == "status":
|
|
191
|
+
return {"status": "ok", "queue_size": self.queue_size}
|
|
192
|
+
|
|
193
|
+
return {"status": "error", "message": f"Unknown action: {action}"}
|
|
194
|
+
"""
|
|
195
|
+
pass
|
|
196
|
+
|
|
197
|
+
async def on_peer_notify(self, msg) -> None:
|
|
198
|
+
"""
|
|
199
|
+
Handle incoming peer notification.
|
|
200
|
+
|
|
201
|
+
Override this to process fire-and-forget messages from other agents.
|
|
202
|
+
No response is expected or sent.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
msg: IncomingMessage with:
|
|
206
|
+
- msg.sender: Sender agent ID or role
|
|
207
|
+
- msg.data: Notification payload (dict)
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
async def on_peer_notify(self, msg):
|
|
211
|
+
event = msg.data.get("event")
|
|
212
|
+
|
|
213
|
+
if event == "task_complete":
|
|
214
|
+
await self.update_dashboard(msg.data)
|
|
215
|
+
self._logger.info(f"Task completed by {msg.sender}")
|
|
216
|
+
|
|
217
|
+
elif event == "peer_joined":
|
|
218
|
+
self._logger.info(f"New peer in mesh: {msg.data.get('role')}")
|
|
219
|
+
"""
|
|
220
|
+
# Default: log and ignore
|
|
221
|
+
self._logger.debug(
|
|
222
|
+
f"[{self.role}] Received notify from {msg.sender}: "
|
|
223
|
+
f"{list(msg.data.keys()) if isinstance(msg.data, dict) else 'data'}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
async def on_error(self, error: Exception, msg=None) -> None:
|
|
227
|
+
"""
|
|
228
|
+
Handle errors during message processing.
|
|
229
|
+
|
|
230
|
+
Override to customize error handling (logging, alerting, metrics, etc.)
|
|
231
|
+
Default implementation logs the error and continues processing.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
error: The exception that occurred
|
|
235
|
+
msg: The message being processed when error occurred (may be None)
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
async def on_error(self, error, msg):
|
|
239
|
+
# Log with context
|
|
240
|
+
self._logger.error(
|
|
241
|
+
f"Error processing message: {error}",
|
|
242
|
+
extra={"sender": msg.sender if msg else None}
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
# Send to error tracking service
|
|
246
|
+
await self.error_tracker.capture(error, context={"msg": msg})
|
|
247
|
+
|
|
248
|
+
# Optionally notify the sender of failure
|
|
249
|
+
if msg and msg.correlation_id:
|
|
250
|
+
await self.peers.respond(msg, {
|
|
251
|
+
"status": "error",
|
|
252
|
+
"error": str(error)
|
|
253
|
+
})
|
|
254
|
+
"""
|
|
255
|
+
if msg:
|
|
256
|
+
self._logger.error(
|
|
257
|
+
f"[{self.role}] Error processing message from {msg.sender}: {error}"
|
|
258
|
+
)
|
|
259
|
+
else:
|
|
260
|
+
self._logger.error(f"[{self.role}] Error in listener loop: {error}")
|
|
261
|
+
|
|
262
|
+
# ─────────────────────────────────────────────────────────────────
|
|
263
|
+
# Workflow compatibility
|
|
264
|
+
# ─────────────────────────────────────────────────────────────────
|
|
265
|
+
|
|
266
|
+
async def execute_task(self, task: Dict[str, Any]) -> Dict[str, Any]:
|
|
267
|
+
"""
|
|
268
|
+
Execute a task (for workflow/distributed modes).
|
|
269
|
+
|
|
270
|
+
Delegates to on_peer_request for consistency, allowing the same
|
|
271
|
+
agent to work in both P2P and workflow modes.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
task: Task specification dict
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
Result dict with status and output
|
|
278
|
+
"""
|
|
279
|
+
from jarviscore.p2p.messages import IncomingMessage, MessageType
|
|
280
|
+
|
|
281
|
+
# Create a synthetic message to pass to the handler
|
|
282
|
+
synthetic_msg = IncomingMessage(
|
|
283
|
+
sender="workflow",
|
|
284
|
+
sender_node="local",
|
|
285
|
+
type=MessageType.REQUEST,
|
|
286
|
+
data=task,
|
|
287
|
+
correlation_id=None,
|
|
288
|
+
timestamp=0
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
result = await self.on_peer_request(synthetic_msg)
|
|
292
|
+
return {"status": "success", "output": result}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jarviscore-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Build autonomous AI agents in 3 lines of code. Production-ready orchestration with P2P mesh networking.
|
|
5
5
|
Author-email: Ruth Mutua <mutuandinda82@gmail.com>, Muyukani Kizito <muyukani@prescottdata.io>
|
|
6
6
|
Maintainer-email: Prescott Data <info@prescottdata.io>
|
|
7
7
|
License-Expression: MIT
|
|
8
|
-
Project-URL: Homepage, https://github.com/
|
|
9
|
-
Project-URL: Documentation, https://jarviscore
|
|
10
|
-
Project-URL: Repository, https://github.com/
|
|
11
|
-
Project-URL: Issues, https://github.com/
|
|
8
|
+
Project-URL: Homepage, https://github.com/Prescott-Data/jarviscore-framework
|
|
9
|
+
Project-URL: Documentation, https://github.com/Prescott-Data/jarviscore-framework/tree/main/jarviscore/docs
|
|
10
|
+
Project-URL: Repository, https://github.com/Prescott-Data/jarviscore-framework
|
|
11
|
+
Project-URL: Issues, https://github.com/Prescott-Data/jarviscore-framework/issues
|
|
12
12
|
Keywords: agents,p2p,llm,distributed,workflow,orchestration
|
|
13
13
|
Classifier: Development Status :: 3 - Alpha
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
@@ -49,8 +49,11 @@ Dynamic: license-file
|
|
|
49
49
|
|
|
50
50
|
- ✅ **AutoAgent** - LLM generates and executes code from natural language
|
|
51
51
|
- ✅ **CustomAgent** - Bring your own logic (LangChain, CrewAI, etc.)
|
|
52
|
+
- ✅ **ListenerAgent** - API-first agents with background P2P (just implement handlers)
|
|
52
53
|
- ✅ **P2P Mesh** - Agent discovery and communication via SWIM protocol
|
|
53
54
|
- ✅ **Workflow Orchestration** - Dependencies, context passing, multi-step pipelines
|
|
55
|
+
- ✅ **FastAPI Integration** - 3-line setup with JarvisLifespan
|
|
56
|
+
- ✅ **Cloud Deployment** - Self-registering agents for Docker/K8s
|
|
54
57
|
|
|
55
58
|
## Installation
|
|
56
59
|
|
|
@@ -118,16 +121,47 @@ results = await mesh.workflow("demo", [
|
|
|
118
121
|
print(results[0]["output"]) # [2, 4, 6]
|
|
119
122
|
```
|
|
120
123
|
|
|
124
|
+
### ListenerAgent + FastAPI (API-First)
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
from fastapi import FastAPI
|
|
128
|
+
from jarviscore.profiles import ListenerAgent
|
|
129
|
+
from jarviscore.integrations.fastapi import JarvisLifespan
|
|
130
|
+
|
|
131
|
+
class ProcessorAgent(ListenerAgent):
|
|
132
|
+
role = "processor"
|
|
133
|
+
capabilities = ["processing"]
|
|
134
|
+
|
|
135
|
+
async def on_peer_request(self, msg):
|
|
136
|
+
# Handle requests from other agents
|
|
137
|
+
return {"result": msg.data.get("task", "").upper()}
|
|
138
|
+
|
|
139
|
+
# That's it - 3 lines to integrate with FastAPI
|
|
140
|
+
app = FastAPI(lifespan=JarvisLifespan(ProcessorAgent(), mode="p2p"))
|
|
141
|
+
```
|
|
142
|
+
|
|
121
143
|
## Execution Modes
|
|
122
144
|
|
|
123
145
|
| Mode | Profile | Use Case |
|
|
124
146
|
|------|---------|----------|
|
|
125
147
|
| `autonomous` | AutoAgent | Single machine, LLM code generation |
|
|
126
|
-
| `p2p` | CustomAgent | Agent-to-agent communication, swarms |
|
|
127
|
-
| `distributed` | CustomAgent | Multi-node workflows + P2P |
|
|
148
|
+
| `p2p` | CustomAgent, ListenerAgent | Agent-to-agent communication, swarms |
|
|
149
|
+
| `distributed` | CustomAgent, ListenerAgent | Multi-node workflows + P2P |
|
|
150
|
+
|
|
151
|
+
## What's New in 0.3.0
|
|
152
|
+
|
|
153
|
+
**Developer Experience Improvements:**
|
|
154
|
+
- **ListenerAgent** - No more writing `run()` loops. Just implement `on_peer_request()` and `on_peer_notify()` handlers.
|
|
155
|
+
- **JarvisLifespan** - FastAPI integration reduced from ~100 lines to 3 lines.
|
|
156
|
+
- **Cognitive Discovery** - `peers.get_cognitive_context()` generates LLM-ready peer descriptions. No more hardcoded agent names in prompts.
|
|
157
|
+
|
|
158
|
+
**Cloud Deployment:**
|
|
159
|
+
- **Self-Registration** - `agent.join_mesh()` lets agents join existing meshes without central orchestrator.
|
|
160
|
+
- **Remote Visibility** - Agents on different nodes are automatically discovered and callable.
|
|
128
161
|
|
|
129
162
|
## Documentation
|
|
130
163
|
|
|
164
|
+
- [User Guide](jarviscore/docs/USER_GUIDE.md) - Complete documentation
|
|
131
165
|
- [Getting Started](jarviscore/docs/GETTING_STARTED.md) - 5-minute quickstart
|
|
132
166
|
- [AutoAgent Guide](jarviscore/docs/AUTOAGENT_GUIDE.md) - LLM-powered agents
|
|
133
167
|
- [CustomAgent Guide](jarviscore/docs/CUSTOMAGENT_GUIDE.md) - Bring your own code
|
|
@@ -136,7 +170,7 @@ print(results[0]["output"]) # [2, 4, 6]
|
|
|
136
170
|
|
|
137
171
|
## Version
|
|
138
172
|
|
|
139
|
-
**0.
|
|
173
|
+
**0.3.0**
|
|
140
174
|
|
|
141
175
|
## License
|
|
142
176
|
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
examples/autoagent_distributed_example.py,sha256=yXxabyqPqPc-CTroTf-0GAl63ln3zPRMhMYBEi1Tpsc,8586
|
|
2
2
|
examples/calculator_agent_example.py,sha256=x7TrzE45WT_1DqwEnw8U3Fw56WpR9jBe3SLZz5vsKWc,2276
|
|
3
|
+
examples/cloud_deployment_example.py,sha256=PhB9-3pGgVY_w2UkTlBLGma_JSVEhG6hInxCDODOKwg,5044
|
|
3
4
|
examples/custom_profile_decorator.py,sha256=4EAgqXrT9an1f5AQ3cEWAhPvI_EeXbQq7O8ByunXb_M,4099
|
|
4
5
|
examples/custom_profile_wrap.py,sha256=0NoQECVBEJOiL7Syr2QL73jnvj2XhGQZUhOvisqEQXw,5088
|
|
5
6
|
examples/customagent_distributed_example.py,sha256=_vt_2sqSCIdHgwuV4VQFzHzmC3bgemPrHFifeA5tRNE,13677
|
|
6
|
-
examples/customagent_p2p_example.py,sha256=
|
|
7
|
+
examples/customagent_p2p_example.py,sha256=tWywC5abc1aYIyW2V6Xgr_XkjZdqzcOeLut3PnzUpB8,30669
|
|
8
|
+
examples/fastapi_integration_example.py,sha256=BBWHwLCD6qYF56jkfW9cLIAWHCgx6EWyRpiRCwwr6D4,22470
|
|
9
|
+
examples/listeneragent_cognitive_discovery_example.py,sha256=ycPj2UzN9AMgUInca0CJZF0tZ8x7BMP8Xk1dsHhMG78,12964
|
|
7
10
|
examples/multi_agent_workflow.py,sha256=Sygx3iEBM9WzorVMXqtiwn4rLYrW9BsxsiQSKceuzsE,4303
|
|
8
11
|
examples/research_agent_example.py,sha256=phJ5AHNnZ_pxCfiKvHoTp_IFwOAW7VD1fRNHlXvfgj4,2287
|
|
9
|
-
jarviscore/__init__.py,sha256=
|
|
12
|
+
jarviscore/__init__.py,sha256=p_jA9o1KGmXiQS0iKZPVvFZjUZcz2OXR3mAfpYUWKuo,3609
|
|
10
13
|
jarviscore/adapter/__init__.py,sha256=fipq2XzgW3Us35tbFhs9B_ypoeEZeaP7bTsNPFFZVRk,1092
|
|
11
14
|
jarviscore/adapter/decorator.py,sha256=ZY-WCF16EvtQWkra_6HNBKdTOJ0G5yvrD5PYKa6bcqk,12040
|
|
12
15
|
jarviscore/adapter/wrapper.py,sha256=kU9nBiezU1M1dq9x5EjnAVHs_QjFFOFx7dR4TNyFdPk,9666
|
|
@@ -14,7 +17,7 @@ jarviscore/cli/__init__.py,sha256=OnpJ37xDcbh3jFhALLY1jimgp1mxlB1-VhsKhGS6TDY,12
|
|
|
14
17
|
jarviscore/cli/__main__.py,sha256=GuIqW9NKJ3n70ei54ItzrBYEVaWG5dAWGxdu87w7YgI,829
|
|
15
18
|
jarviscore/cli/check.py,sha256=eWvk6fkRsJ8hpgT60XUoAn_0nyzF0PFKRl65m7U9cxQ,13955
|
|
16
19
|
jarviscore/cli/scaffold.py,sha256=LZhqOSUVO7ZgBZnu2M2pUsRmTXtInYfOVJDaPkVE0Ck,4898
|
|
17
|
-
jarviscore/cli/smoketest.py,sha256=
|
|
20
|
+
jarviscore/cli/smoketest.py,sha256=gNTlPfJYQYQesVNSqx0fOsIMtRIHUa5GWHRqWcibPQc,13772
|
|
18
21
|
jarviscore/config/__init__.py,sha256=ZLjbRHSi5azaDyoSOFr9cQ65J5Fvi56xI-WHdczc204,178
|
|
19
22
|
jarviscore/config/settings.py,sha256=ueYpJAZxT1zoEPymzrn0OHAXZxQXBqSMs87VwolPdhg,3516
|
|
20
23
|
jarviscore/context/__init__.py,sha256=FdMfHUPs1vDRDaz2WR_F3IJi9k4FIVBvsGVKD5dJBrQ,1171
|
|
@@ -22,24 +25,28 @@ jarviscore/context/dependency.py,sha256=ns6IwTsMBBuP0w8oBRt60iiNsu5k7RomEViUi4kk
|
|
|
22
25
|
jarviscore/context/jarvis_context.py,sha256=6ai2TjDE5PRiBxF5lTdyBMoK3b8wv6cr0a6q55PoUSk,5775
|
|
23
26
|
jarviscore/context/memory.py,sha256=taonyl24ZUe-NZ5VtvrxljNv6f_BebuH6VE7l0B9S7A,4442
|
|
24
27
|
jarviscore/core/__init__.py,sha256=30K2aqZckYTRZupn6X-mGV2QDSqWCgJ1cpN6Zk1gqlQ,177
|
|
25
|
-
jarviscore/core/agent.py,sha256=
|
|
28
|
+
jarviscore/core/agent.py,sha256=j76BGNwN6ATnjWujvBSz8Dvojz7W9AEzC7gxfs9xde4,15561
|
|
26
29
|
jarviscore/core/mesh.py,sha256=XPAX_mRqpLj22vT9SI4MmyT65EQR9KxTEULqJ3BlHwk,22898
|
|
27
30
|
jarviscore/core/profile.py,sha256=sTrGTxV9mAqbt5l3z0-BSNOeWzq8YDLR3mlaPFSgt1c,2190
|
|
28
31
|
jarviscore/data/.env.example,sha256=TCPdye7tYNDOEpcgaEuzUsQ-H7m9G6rsyzNZV9IYQ9s,5156
|
|
29
32
|
jarviscore/data/__init__.py,sha256=757nsqMkytYV0zXiM_mh3LqtGZZ1lgFuMzvaLrW51PM,151
|
|
30
33
|
jarviscore/data/examples/autoagent_distributed_example.py,sha256=yXxabyqPqPc-CTroTf-0GAl63ln3zPRMhMYBEi1Tpsc,8586
|
|
31
34
|
jarviscore/data/examples/calculator_agent_example.py,sha256=x7TrzE45WT_1DqwEnw8U3Fw56WpR9jBe3SLZz5vsKWc,2276
|
|
35
|
+
jarviscore/data/examples/cloud_deployment_example.py,sha256=PhB9-3pGgVY_w2UkTlBLGma_JSVEhG6hInxCDODOKwg,5044
|
|
32
36
|
jarviscore/data/examples/customagent_distributed_example.py,sha256=_vt_2sqSCIdHgwuV4VQFzHzmC3bgemPrHFifeA5tRNE,13677
|
|
33
|
-
jarviscore/data/examples/customagent_p2p_example.py,sha256=
|
|
37
|
+
jarviscore/data/examples/customagent_p2p_example.py,sha256=tWywC5abc1aYIyW2V6Xgr_XkjZdqzcOeLut3PnzUpB8,30669
|
|
38
|
+
jarviscore/data/examples/fastapi_integration_example.py,sha256=BBWHwLCD6qYF56jkfW9cLIAWHCgx6EWyRpiRCwwr6D4,22470
|
|
39
|
+
jarviscore/data/examples/listeneragent_cognitive_discovery_example.py,sha256=ycPj2UzN9AMgUInca0CJZF0tZ8x7BMP8Xk1dsHhMG78,12964
|
|
34
40
|
jarviscore/data/examples/multi_agent_workflow.py,sha256=Sygx3iEBM9WzorVMXqtiwn4rLYrW9BsxsiQSKceuzsE,4303
|
|
35
41
|
jarviscore/data/examples/research_agent_example.py,sha256=phJ5AHNnZ_pxCfiKvHoTp_IFwOAW7VD1fRNHlXvfgj4,2287
|
|
36
|
-
jarviscore/docs/API_REFERENCE.md,sha256=
|
|
42
|
+
jarviscore/docs/API_REFERENCE.md,sha256=Izzo41VfrH2UtenMLzFk91HzPejTtBXdM6E_LoLqa0M,31837
|
|
37
43
|
jarviscore/docs/AUTOAGENT_GUIDE.md,sha256=ftm8dymihs3Y9PZTZmSD9xRhlRFygfTZKm59Mz8zNRA,4618
|
|
38
|
-
jarviscore/docs/
|
|
39
|
-
jarviscore/docs/
|
|
40
|
-
jarviscore/docs/
|
|
41
|
-
jarviscore/docs/
|
|
42
|
-
jarviscore/docs/
|
|
44
|
+
jarviscore/docs/CHANGELOG.md,sha256=aJmLEaey3SSnyf2cMR-mBRr23tbfnXc2v0Har_11VbY,3259
|
|
45
|
+
jarviscore/docs/CONFIGURATION.md,sha256=gsYElB2XcoSPx_65ca-NBmIe1HY_KS1zQCeFORKZcyI,14910
|
|
46
|
+
jarviscore/docs/CUSTOMAGENT_GUIDE.md,sha256=VXFhP5UH1cIYtTwklxVfpmDDko1GQbJvb0ZmEcSG5i4,67026
|
|
47
|
+
jarviscore/docs/GETTING_STARTED.md,sha256=dyreT-eQCQwSIe1S4yu8XtDN8LzD2vOXXyTxE9wCEkI,19776
|
|
48
|
+
jarviscore/docs/TROUBLESHOOTING.md,sha256=mFTNWIGToGWaHSthVDVtdpw5Y994mSLyv1UuAqzuWEM,11544
|
|
49
|
+
jarviscore/docs/USER_GUIDE.md,sha256=DJQAC2luWvjhSxyAfMKo6T_ZLVEXBjZSmp61u2a5tyo,21078
|
|
43
50
|
jarviscore/execution/__init__.py,sha256=yDAMehMO2dVvdKjxVx7zQV2AaxySmvymA24QF3O9tlY,1754
|
|
44
51
|
jarviscore/execution/code_registry.py,sha256=C3_hAVXIeCG31qwSBUrmBBicmd2vnUrXJhJgj8MKlJw,9213
|
|
45
52
|
jarviscore/execution/generator.py,sha256=zY7IxxDu4xoifeuCGZZN8_l8zQCsB5eUO9HGIiLIttw,8696
|
|
@@ -48,23 +55,26 @@ jarviscore/execution/repair.py,sha256=yy6GTX6nFoA38S9V1ZGvqOeH3iRThRkMI3GZ6F_2Wr
|
|
|
48
55
|
jarviscore/execution/result_handler.py,sha256=7SKr-teFksqNgejhnZNrjAzKbtDXbOSV3Tv7gfYsdig,10590
|
|
49
56
|
jarviscore/execution/sandbox.py,sha256=IVkccce_WHDxXO6l8BCcuxAB5iueJfYtbryydoE972c,19981
|
|
50
57
|
jarviscore/execution/search.py,sha256=JSoT8vb_yT6_EKaAgUQDS8ONgFeKf6s8YlEeTn6FaWQ,9923
|
|
58
|
+
jarviscore/integrations/__init__.py,sha256=2Nfn0b_Cpw3Zf64ePYrKTk8PIVqjxK3YGHD4iIURE4A,437
|
|
59
|
+
jarviscore/integrations/fastapi.py,sha256=QBhbnSRYEswl0q94BUt_bbjwa91XekG8czTfGi8tDmY,9238
|
|
51
60
|
jarviscore/orchestration/__init__.py,sha256=Ia9GfEMWif0tN0Ju89q6M_x_BRw9FcQl5Rf99p8CIKU,386
|
|
52
61
|
jarviscore/orchestration/claimer.py,sha256=ekhHqhtxpi_USnPsIioFK6bA2nhH6jalulBkptYubVU,3106
|
|
53
62
|
jarviscore/orchestration/dependency.py,sha256=UtSSwSC2Ak5V5dYeZWJy3wZZuTE-Y-fcglkoIgNT_70,4377
|
|
54
63
|
jarviscore/orchestration/engine.py,sha256=Xh9Fn3aVY7iwj7cAXdHcN90ogOiVFJlyJeoKnJjZR4A,10937
|
|
55
64
|
jarviscore/orchestration/status.py,sha256=XeKASMNQDwpJ6HpDw3m3eAAMNWsWCj4k9jrvMnLHPbo,2540
|
|
56
65
|
jarviscore/p2p/__init__.py,sha256=k1KkBnbb74jrfWKLiKRsMbepy6xBfQZOGzOlDKvslp0,927
|
|
57
|
-
jarviscore/p2p/broadcaster.py,sha256=
|
|
58
|
-
jarviscore/p2p/coordinator.py,sha256=
|
|
59
|
-
jarviscore/p2p/keepalive.py,sha256=
|
|
66
|
+
jarviscore/p2p/broadcaster.py,sha256=Gaj0nCHDBQrVe4ob4GcaFSqnAaVe3ugEILslc5Mq1qE,14414
|
|
67
|
+
jarviscore/p2p/coordinator.py,sha256=UtsSVSigIhs2Rcx1v5BVdLC11P649u71y8Bw4cU1fMk,30087
|
|
68
|
+
jarviscore/p2p/keepalive.py,sha256=it0SyXVBmujfE79thrap-A1UxZW01p9ENEIglIbQoAM,14988
|
|
60
69
|
jarviscore/p2p/messages.py,sha256=nd7ZutZ1Xge2C1KkRSwQK3RJ03ScxqESF3fl48hEkhI,2540
|
|
61
|
-
jarviscore/p2p/peer_client.py,sha256=
|
|
70
|
+
jarviscore/p2p/peer_client.py,sha256=CFOpZ3OUev1W3apD5EaM4uigx5yshhAjNjDEDUJIXMo,31545
|
|
62
71
|
jarviscore/p2p/peer_tool.py,sha256=qXiF0b2pTo8tJ8bUHxe_XbxE0UFgwu2wCpy-W82ocUo,9098
|
|
63
|
-
jarviscore/p2p/swim_manager.py,sha256=
|
|
64
|
-
jarviscore/profiles/__init__.py,sha256=
|
|
72
|
+
jarviscore/p2p/swim_manager.py,sha256=mu9clcJ22gqSOoeWlr4QW9b4vhRvD6QEAlTjAVVZvV4,11126
|
|
73
|
+
jarviscore/profiles/__init__.py,sha256=Nxpa31ZZglybHP_2UC2U2ilnQ5GPgJXx4T3uH5QsfnY,455
|
|
65
74
|
jarviscore/profiles/autoagent.py,sha256=1nJAVf1oU9lLO47BP1xFGBDZtypXXkwKy6kZjtpdlX0,10424
|
|
66
75
|
jarviscore/profiles/customagent.py,sha256=GRauTYlWyYSgZrWyYZlAPNkJoVgjDHjfY_c0rdeoOgM,4618
|
|
67
|
-
|
|
76
|
+
jarviscore/profiles/listeneragent.py,sha256=B4XCdk0T5j6amZmqYztE1m2GCk02ynK5DOdA3VhgHpg,11221
|
|
77
|
+
jarviscore_framework-0.3.0.dist-info/licenses/LICENSE,sha256=SjsXanvmQJFYz_SVFa17O85-bKIa_aG99wrkPpWtypo,1101
|
|
68
78
|
test_logs/code_registry/functions/data_generator-558779ed_560ebc37.py,sha256=ua0Lueqe1mWCeMpKTMaumfPS-ZrWBFF_Zx6TU5QVjNo,132
|
|
69
79
|
test_logs/code_registry/functions/data_generator-5ed3609e_560ebc37.py,sha256=ua0Lueqe1mWCeMpKTMaumfPS-ZrWBFF_Zx6TU5QVjNo,132
|
|
70
80
|
test_logs/code_registry/functions/data_generator-66da0356_43970bb9.py,sha256=vOkjCOcfXHLJX2TkR3et9vWSwEhCmOn4DdJHMGfTMVY,733
|
|
@@ -115,6 +125,10 @@ tests/test_07_distributed_single_node.py,sha256=rFL4FmD5-4MVfgnQ5FwAlIm2FFEdmNOB
|
|
|
115
125
|
tests/test_08_distributed_multi_node.py,sha256=GkznK1f9aDEFF5_37WhBh553Ov6bw7IDOAvngo4848I,18039
|
|
116
126
|
tests/test_09_distributed_autoagent.py,sha256=sg5KpHdiYyqQpKAPLNrjkaH4Ur6N8rwYrhbgiCe_KH8,20328
|
|
117
127
|
tests/test_10_distributed_customagent.py,sha256=ZtmZYHPHvW6wPdt3lveixSPm6GO1Fm3v6TCdox6YI6c,29728
|
|
128
|
+
tests/test_13_dx_improvements.py,sha256=rhmTFResVBAx3Vz-C0HDkt1E6tOAUS2GuQG9SRy1HIQ,20332
|
|
129
|
+
tests/test_14_cloud_deployment.py,sha256=EaqJ9Cai9Ki61dhmeqNgMfEkWGnL8-aQg52CKZ6335I,16402
|
|
130
|
+
tests/test_15_llm_cognitive_discovery.py,sha256=UD0PNDSxQ6yy261yEfq3vf4moYYpQSRs3WI5P-tJ7eo,26381
|
|
131
|
+
tests/test_16_unified_dx_flow.py,sha256=XLLcpvEi40pJMw_7ifsP7udGxnQUIMZ6hvc81DvOuUw,38237
|
|
118
132
|
tests/test_agent.py,sha256=qx9SFDTP4DlcQi6hV8y6LZyEYX6IB8D3VnM7fODnW9s,5182
|
|
119
133
|
tests/test_autoagent.py,sha256=_mzinLdQwskOn6a-yGqdfoOsqw2f52XSyTCmj8hLqlg,4628
|
|
120
134
|
tests/test_autoagent_day4.py,sha256=TTb0kSImF9stMsq4cMlkGahf9UBpYjoNXAkgnkKuuQA,4719
|
|
@@ -126,7 +140,7 @@ tests/test_llm_fallback.py,sha256=CNajpKkQ6MO503dRbgaP2cz9kXHwUGKo5381tHKTe4c,57
|
|
|
126
140
|
tests/test_mesh.py,sha256=JmAAvZaduQ8dHThFDBYgUnjiz8a3r4Kt1atvdH1JO5I,11857
|
|
127
141
|
tests/test_p2p_integration.py,sha256=F9B21eWlwRzSRphm2Kacs9nM1FgSbSzi6RSLPDvvt2U,10995
|
|
128
142
|
tests/test_remote_sandbox.py,sha256=80ebc0pWInauWnywsQ0VSzlk8OexSCgGL7BcJUCPkR8,3268
|
|
129
|
-
jarviscore_framework-0.
|
|
130
|
-
jarviscore_framework-0.
|
|
131
|
-
jarviscore_framework-0.
|
|
132
|
-
jarviscore_framework-0.
|
|
143
|
+
jarviscore_framework-0.3.0.dist-info/METADATA,sha256=W1VITOJ59DKyADAX-GWifmhKzrgfCCwOJqWFHehKyuU,5945
|
|
144
|
+
jarviscore_framework-0.3.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
145
|
+
jarviscore_framework-0.3.0.dist-info/top_level.txt,sha256=aTco8nlqDftlvhB43Je0xXmb-Pw5qYgj-phawjHX4VY,36
|
|
146
|
+
jarviscore_framework-0.3.0.dist-info/RECORD,,
|