route optimizer agent with dailygrubs ai assign

This commit is contained in:
2026-09-01 13:48:58 +05:30
parent aa4d4c6549
commit 90cdb57a38
28 changed files with 3281 additions and 135 deletions

View File

@@ -171,6 +171,22 @@ class MessageBus:
) -> str:
return await self.send_to_agent(sender, "ALL", message_type, payload, correlation_id)
async def _deliver_to_agent(self, agent_id: str, message: AgentMessage):
"""Hand a directed message to a locally-registered agent so it is
actually consumed (via its ``deliver``). Only if no such agent exists in
this process does it fall back to the pull queue — so a message is never
silently lost, but is delivered live whenever the recipient is present."""
agent = self._agents.get(agent_id)
if agent is not None and hasattr(agent, "deliver"):
try:
await agent.deliver(message)
return
except Exception as e:
logger.error(f"Delivery to {agent_id} failed: {e}")
return
async with self._lock:
self._queues[agent_id].append(QueuedMessage(message))
async def get_messages(self, agent_id: str) -> List[AgentMessage]:
async with self._lock:
queued = self._queues.pop(agent_id, [])
@@ -179,6 +195,26 @@ class MessageBus:
async def peek_messages(self, agent_id: str) -> List[AgentMessage]:
return [q.message for q in self._queues.get(agent_id, [])]
# ------------------------------------------------------------------ #
# Telemetry #
# ------------------------------------------------------------------ #
async def publish_telemetry(self, kind: str, payload: Dict[str, Any]):
"""
Fire-and-forget observability event on plain NATS (subject `telemetry.<kind>`).
Deliberately NOT JetStream: telemetry is ephemeral fan-out for dashboards
and must never accumulate in the persistent `logistics` stream. No-op
when NATS is not connected — telemetry must never affect agent behavior.
"""
if self._nc is None or not self._nc.is_connected:
return
try:
body = {"kind": kind, "ts": datetime.now().isoformat(), **payload}
await self._nc.publish(f"telemetry.{kind}", json.dumps(body).encode())
except Exception as e:
logger.debug(f"Telemetry publish failed [{kind}]: {e}")
# ------------------------------------------------------------------ #
# Hooks #
# ------------------------------------------------------------------ #
@@ -266,8 +302,7 @@ class MessageBus:
async def handler(msg):
try:
agent_msg = AgentMessage.from_json(msg.data.decode())
async with self._lock:
self._queues[agent_id].append(QueuedMessage(agent_msg))
await self._deliver_to_agent(agent_id, agent_msg)
except Exception as e:
logger.error(f"NATS agent-sub decode error [{agent_id}]: {e}")
finally:
@@ -282,8 +317,7 @@ class MessageBus:
async def _local_dispatch(self, message: AgentMessage):
"""In-process dispatch used when NATS is not connected."""
if message.recipient != "ALL":
async with self._lock:
self._queues[message.recipient].append(QueuedMessage(message))
await self._deliver_to_agent(message.recipient, message)
else:
for callback in list(self._subscribers.get(message.message_type, [])):
try: