{"record":{"id":"409b14a849854220","repo":"langchain-ai/deepagents","slug":"external-event-payload-must-be-a-non-empty-string","errorCode":null,"errorMessage":"External event payload must be a non-empty string","messagePattern":"External event payload must be a non-empty string","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/code/deepagents_code/event_bus.py","lineNumber":78,"sourceCode":"    payload: str\n    source: str\n    bypass: BypassTier = BypassTier.QUEUED\n    correlation_id: str | None = None\n\n    def __post_init__(self) -> None:\n        \"\"\"Validate invariants for direct construction.\n\n        Raises:\n            ValueError: If `kind` is not a known kind, the payload is empty\n                or whitespace-only, or the kind is `\"signal\"` but the payload\n                is not a recognized signal name.\n        \"\"\"\n        if self.kind not in _VALID_KINDS:\n            msg = f\"Unknown external event kind: {self.kind!r}\"\n            raise ValueError(msg)\n        if not self.payload or not self.payload.strip():\n            msg = \"External event payload must be a non-empty string\"\n            raise ValueError(msg)\n        if self.kind == \"signal\" and self.payload.strip().lower() not in _VALID_SIGNALS:\n            msg = (\n                f\"Unknown external signal: {self.payload!r}; \"\n                f\"expected one of {sorted(_VALID_SIGNALS)}\"\n            )\n            raise ValueError(msg)\n\n\nclass EventSource(Protocol):\n    \"\"\"Source of external events for the Textual app.\n\n    Implementations must be safe to `stop()` even when `start()` failed\n    partway through; the app always invokes `stop()` from a `finally` block.\n    \"\"\"\n\n    async def start(\n        self,\n        sink: Callable[[ExternalEvent], Awaitable[None]],","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/code/deepagents_code/event_bus.py#L60-L96","documentation":"Alongside kind validation, `ExternalEvent.__post_init__` requires a non-empty, non-whitespace payload (`if not self.payload or not self.payload.strip()`). An empty payload carries no actionable information, so the dataclass rejects it at construction time rather than letting an inert event flow through the bus.","triggerScenarios":"Constructing `ExternalEvent(kind=<valid>, payload=\"\")` or `payload=\"   \"` — e.g. a socket producer forwarding a blank line, or splitting an incoming message without checking for empty segments.","commonSituations":"Unix-socket clients sending an empty JSON field; message framing that splits on newlines yielding empty trailing segments; templates/config generating empty payloads from unfilled variables.","solutions":["Populate the payload with meaningful content on the producer side before emitting.","Guard the producer: skip events whose payload is empty or whitespace-only.","Strip and validate incoming socket messages before wrapping them in `ExternalEvent`."],"exampleFix":"// before\nExternalEvent(kind=\"signal\", payload=msg.strip().split(\":\")[1])  # may be empty\n// after\nparts = msg.strip().split(\":\", 1)\nif len(parts) == 2 and parts[1].strip():\n    ExternalEvent(kind=\"signal\", payload=parts[1])","handlingStrategy":"validation","validationCode":"def safe_event(kind: str, payload: str):\n    if not payload or not payload.strip():\n        return None\n    return ExternalEvent(kind=kind, payload=payload)","typeGuard":"def has_payload(payload: object) -> bool:\n    return isinstance(payload, str) and bool(payload.strip())","tryCatchPattern":"try:\n    event = ExternalEvent(kind=kind, payload=payload)\nexcept ValueError as exc:\n    logger.warning(\"Dropping empty-payload event: %s\", exc)\n    event = None","preventionTips":["Validate/strip incoming socket messages before constructing events.","Skip empty frames at the producer rather than forwarding them.","Check message-splitting logic for empty trailing segments."],"tags":["event-bus","validation","empty-payload","input-error"],"backgroundTag":"empty-event-payload","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}