69 lines
3.0 KiB
Python
69 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any, Mapping
|
|
|
|
from message_handoff import MessageEnvelope
|
|
|
|
|
|
def _get(value: Any, *names: str, default: Any = None) -> Any:
|
|
for name in names:
|
|
if isinstance(value, Mapping) and name in value:
|
|
return value[name]
|
|
if hasattr(value, name):
|
|
return getattr(value, name)
|
|
return default
|
|
|
|
|
|
def agent_event_to_envelope(event: Any, *, target: str | None = None, sequence: int = 1,
|
|
idempotency_key: str | None = None, **scope: Any) -> MessageEnvelope:
|
|
payload = _get(event, "payload", "data", default={}) or {}
|
|
target = target or _get(event, "target", "recipient")
|
|
if not target:
|
|
raise ValueError("MESSAGE_TARGET_REQUIRED")
|
|
return MessageEnvelope(
|
|
source=str(_get(event, "source", "producer", "agent_id", default="agent-event")),
|
|
target=str(target),
|
|
message_type=str(_get(event, "event_type", "type", "message_type", default="agent.event")),
|
|
payload=dict(payload),
|
|
sequence=sequence,
|
|
idempotency_key=idempotency_key or str(_get(event, "id", "event_id", default="")) or f"agent-event:{sequence}",
|
|
causation_id=_get(event, "causation_id"),
|
|
**scope,
|
|
)
|
|
|
|
|
|
def taskplane_event_to_envelope(event: Any, *, target: str, sequence: int = 1,
|
|
idempotency_key: str | None = None, **scope: Any) -> MessageEnvelope:
|
|
data = _get(event, "data", "payload", default={}) or {}
|
|
event_id = str(_get(event, "id", "event_id", default=""))
|
|
return MessageEnvelope(
|
|
source=str(_get(event, "source", default="task-plane")),
|
|
target=target,
|
|
message_type=str(_get(event, "type", "event_type", default="task.event")),
|
|
payload=dict(data),
|
|
sequence=sequence,
|
|
idempotency_key=idempotency_key or event_id or f"task-event:{sequence}",
|
|
causation_id=event_id or None,
|
|
**scope,
|
|
)
|
|
|
|
|
|
def legacy_message_to_envelope(message: Any, *, target: str | None = None, sequence: int = 1,
|
|
idempotency_key: str | None = None, **scope: Any) -> MessageEnvelope:
|
|
payload = _get(message, "payload", "data", "body", "content", default={})
|
|
if not isinstance(payload, Mapping):
|
|
payload = {"value": payload}
|
|
target = target or _get(message, "target", "recipient", "receiver")
|
|
if not target:
|
|
raise ValueError("MESSAGE_TARGET_REQUIRED")
|
|
source = _get(message, "source", "sender", "agent_id", default="legacy-message-bus")
|
|
kind = _get(message, "message_type", "type", "kind", default="legacy.message")
|
|
identifier = _get(message, "id", "message_id", "event_id")
|
|
return MessageEnvelope(
|
|
source=str(source), target=str(target), message_type=str(kind), payload=dict(payload),
|
|
sequence=sequence,
|
|
idempotency_key=idempotency_key or (str(identifier) if identifier else f"legacy:{sequence}"),
|
|
causation_id=str(identifier) if identifier else None,
|
|
**scope,
|
|
)
|