jarviscore-framework 0.2.1__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.
Files changed (32) hide show
  1. examples/cloud_deployment_example.py +162 -0
  2. examples/fastapi_integration_example.py +570 -0
  3. examples/listeneragent_cognitive_discovery_example.py +343 -0
  4. jarviscore/__init__.py +22 -5
  5. jarviscore/cli/smoketest.py +8 -4
  6. jarviscore/core/agent.py +227 -0
  7. jarviscore/data/examples/cloud_deployment_example.py +162 -0
  8. jarviscore/data/examples/fastapi_integration_example.py +570 -0
  9. jarviscore/data/examples/listeneragent_cognitive_discovery_example.py +343 -0
  10. jarviscore/docs/API_REFERENCE.md +296 -3
  11. jarviscore/docs/CHANGELOG.md +97 -0
  12. jarviscore/docs/CUSTOMAGENT_GUIDE.md +832 -13
  13. jarviscore/docs/GETTING_STARTED.md +111 -7
  14. jarviscore/docs/USER_GUIDE.md +152 -6
  15. jarviscore/integrations/__init__.py +16 -0
  16. jarviscore/integrations/fastapi.py +247 -0
  17. jarviscore/p2p/broadcaster.py +10 -3
  18. jarviscore/p2p/coordinator.py +310 -14
  19. jarviscore/p2p/keepalive.py +45 -23
  20. jarviscore/p2p/peer_client.py +282 -10
  21. jarviscore/p2p/swim_manager.py +9 -4
  22. jarviscore/profiles/__init__.py +10 -2
  23. jarviscore/profiles/listeneragent.py +292 -0
  24. {jarviscore_framework-0.2.1.dist-info → jarviscore_framework-0.3.0.dist-info}/METADATA +37 -4
  25. {jarviscore_framework-0.2.1.dist-info → jarviscore_framework-0.3.0.dist-info}/RECORD +32 -18
  26. {jarviscore_framework-0.2.1.dist-info → jarviscore_framework-0.3.0.dist-info}/WHEEL +1 -1
  27. tests/test_13_dx_improvements.py +554 -0
  28. tests/test_14_cloud_deployment.py +403 -0
  29. tests/test_15_llm_cognitive_discovery.py +684 -0
  30. tests/test_16_unified_dx_flow.py +947 -0
  31. {jarviscore_framework-0.2.1.dist-info → jarviscore_framework-0.3.0.dist-info}/licenses/LICENSE +0 -0
  32. {jarviscore_framework-0.2.1.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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarviscore-framework
3
- Version: 0.2.1
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>
@@ -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,13 +121,43 @@ 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
 
@@ -137,7 +170,7 @@ print(results[0]["output"]) # [2, 4, 6]
137
170
 
138
171
  ## Version
139
172
 
140
- **0.2.1**
173
+ **0.3.0**
141
174
 
142
175
  ## License
143
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
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=KEIOQgfB3Zc73dMMzekxOGbwlTAZV_u63zHeN8F24Y8,2954
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=5ip_EPd-BW0rkBOi2zNEgHbL_glgbX-X7_Iu8yFLrh0,13484
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=bQhuEsXdGHgwLhniE-Zgp4_pAOwFu-S2GdyQeL4wDU0,6888
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
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=rKFXBvfzd2jkLtVY80SOQrUnq4Z5fKNaJBBoh8QQhXk,25363
42
+ jarviscore/docs/API_REFERENCE.md,sha256=Izzo41VfrH2UtenMLzFk91HzPejTtBXdM6E_LoLqa0M,31837
37
43
  jarviscore/docs/AUTOAGENT_GUIDE.md,sha256=ftm8dymihs3Y9PZTZmSD9xRhlRFygfTZKm59Mz8zNRA,4618
44
+ jarviscore/docs/CHANGELOG.md,sha256=aJmLEaey3SSnyf2cMR-mBRr23tbfnXc2v0Har_11VbY,3259
38
45
  jarviscore/docs/CONFIGURATION.md,sha256=gsYElB2XcoSPx_65ca-NBmIe1HY_KS1zQCeFORKZcyI,14910
39
- jarviscore/docs/CUSTOMAGENT_GUIDE.md,sha256=CBSghYCtfTQykh3s7AVsAR_cKZO15JabTi3pvwOUjMw,42945
40
- jarviscore/docs/GETTING_STARTED.md,sha256=W5cHsZVpiIO5Z01eBZWDbLowxLCnW4-mQQmeGy_5YIA,16601
46
+ jarviscore/docs/CUSTOMAGENT_GUIDE.md,sha256=VXFhP5UH1cIYtTwklxVfpmDDko1GQbJvb0ZmEcSG5i4,67026
47
+ jarviscore/docs/GETTING_STARTED.md,sha256=dyreT-eQCQwSIe1S4yu8XtDN8LzD2vOXXyTxE9wCEkI,19776
41
48
  jarviscore/docs/TROUBLESHOOTING.md,sha256=mFTNWIGToGWaHSthVDVtdpw5Y994mSLyv1UuAqzuWEM,11544
42
- jarviscore/docs/USER_GUIDE.md,sha256=h2CM4hKPpLcKSEBSiS9ERlsx-nzAz123DFrLquLvpMU,17631
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=PQRBRfVQD1FNntnxi7H8VsOyYGk_63N-QtnRB4Dx_-I,14127
58
- jarviscore/p2p/coordinator.py,sha256=mZ1MhusDGHcV5BR1R4XZLBzF4B9lHwqqccluwLGDNk0,18728
59
- jarviscore/p2p/keepalive.py,sha256=Ml4TyXv2pzJ7UZl3uYVgMlHmpjxYV6fAebWLSEEXo5U,14079
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=tMUzXPWRZwyymA6mNdMWISpzVI-IOwDrYAri-Bf2ksg,20984
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=Mdr6D0uxJR0h1JMO_faAda2Ojv6gfjoY-ZOzD9q_DWo,10816
64
- jarviscore/profiles/__init__.py,sha256=vBV6W5vszx3px4UOZwCh2wsH-TYzIoPp4Zo_STT8pNo,154
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
- jarviscore_framework-0.2.1.dist-info/licenses/LICENSE,sha256=SjsXanvmQJFYz_SVFa17O85-bKIa_aG99wrkPpWtypo,1101
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.2.1.dist-info/METADATA,sha256=1HFKH6OVKN7PMlGrdblzXtqXTYpY7i6__N1uczT2uew,4512
130
- jarviscore_framework-0.2.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
131
- jarviscore_framework-0.2.1.dist-info/top_level.txt,sha256=aTco8nlqDftlvhB43Je0xXmb-Pw5qYgj-phawjHX4VY,36
132
- jarviscore_framework-0.2.1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5