Yoke.sh
Agents

Egress actor

User-visible output — egress decides what reaches the forum based on text content, not message type.

The egress actor is the only place that decides what the user sees on the forum. The processor and inference loop do not think about visibility — they persist monologue messages and emit conversation.message.posted events. Egress reads those events and forwards the ones that should reach the user.

Rule

If the LLM output includes text, send that text to the user. Everything else stays internal.

Monologue messageForward to forum?
Agent-authored, has text partsYes — text parts only
Agent-authored, tool_call onlyNo
System-authored tool_resultNo
Ingested user copyNo (already on forum)
Agent text + tool_call in same messageYes — text parts only

This is not tied to type: reply. Monologue traffic from the processor is always type: message. Egress does not filter on message type — it filters on author (agent monologue participant) and content (non-empty text parts).

type: reply remains available for other conversation semantics (threading, explicit reply relations). It is not the signal for user-visible agent output.

Flow

flowchart LR
  P[Processor / inference loop] -->|post type: message| M[Monologue]
  M -->|conversation.message.posted| E[Egress]
  E -->|agent text only| F[Forum]
  B[Chat platform bridge] -->|agent text on forum| U[User]
  F --> B

The processor posts tool calls, tool results, and agent text to the monologue without deciding what is user-facing. Egress copies agent text to the forum. A chat platform bridge (if configured) watches forum traffic from the agent participant and delivers it to Slack, North chat, etc.

Filter

Egress subscribes to:

  • agent.forum.joined — record routing for a new stint
  • agent.monologue.compacted — repoint routing after compaction swap
  • conversation.message.posted — all message posts (not just one message type)

On each conversation.message.posted:

  1. Is conversationId a tracked monologue for this agent?
  2. Is authorParticipantId the agent's monologue participant?
  3. Does the message body contain non-empty text parts?

If all yes → post text parts to the forum. Routing uses join state keyed by monologue id, not body.meta.sourceConversationId.

Join state

joins[forumId] = {
  forumParticipantId,      // agent on the forum
  monologueId,             // active internal transcript
  monologueParticipantId,  // agent on the monologue — author filter
};

Updated on agent.forum.joined and agent.monologue.compacted.

Contrast with processor

ProcessorEgress
JobLLM inference + tool executionUser-visible copy-out
VisibilityDoes not decideDecides from text content
Output typeAlways type: message on monologuetype: message on forum
Triggers onMonologue events (excludes forum + legacy reply)All monologue message posts
  • Processor — event-driven inference; does not handle visibility
  • Mesh pattern — ingestion → processor → egress pipeline
  • Message types — part types and body schema

On this page