AgentInbox Architecture Baseline

This document defines the initial architecture baseline for AgentInbox.

It is intentionally narrow. The goal is not to design a complete platform up front. The goal is to lock the boundary between:

For the next-step event retention and multi-consumer design, see Event Bus Backend.

One Sentence

AgentInbox is the shared local ingress and delivery layer for agents.

It hosts reusable subscription sources, evaluates agent-specific interests on top of those sources, stores normalized inbound items, activates local runtimes when needed, and delivers outbound replies or updates back to external systems.

Position In The Stack

Current stack interpretation:

This means AgentInbox is not optional glue. It is the system boundary that keeps connector logic out of agent runtimes.

Primary Architectural Goal

The repository should solve this problem:

How do multiple local agents reuse the same outside-world subscriptions and delivery paths without embedding provider-specific connector logic inside each runtime?

Core Boundary

Use this boundary as the baseline:

This boundary should stay explicit in code and docs.

Why AgentInbox Exists

Without AgentInbox, each runtime or agent tends to absorb:

That creates connector gravity inside the runtime.

AgentInbox exists to stop that drift.

Reuse Of uxc

AgentInbox should reuse uxc as a foundational capability layer.

uxc should be treated as the default path for:

This does not mean AgentInbox should delegate all logic to uxc.

The separation is:

So the rule is:

Reuse Of webmcp-bridge

When a source or outbound surface lives primarily in browser/web-app space, AgentInbox should prefer reusing webmcp-bridge rather than building direct browser/session logic itself.

The separation is:

Core Objects

The initial model should stay small.

SubscriptionSource

A shared hosted source in the local environment.

Examples:

Responsibilities:

Non-responsibilities:

Interest

An agent-specific filter and delivery rule on top of a SubscriptionSource.

Responsibilities:

Non-responsibilities:

InboxItem

A normalized inbound item stored by AgentInbox.

Responsibilities:

Note:

An InboxItem is not the same thing as a runtime queue item. The runtime should read inbox items and map them into runtime-specific meaning.

Activation

A lightweight wake signal sent from AgentInbox to a runtime.

Responsibilities:

Non-responsibilities:

DeliveryHandle

A source-specific or surface-specific handle for outbound delivery.

Examples:

Responsibilities:

Inbound Flow

Recommended first-pass inbound flow:

  1. runtime or agent registers one or more Interest records
  2. AgentInbox ensures the needed SubscriptionSource is hosted
  3. source activity produces InboxItem records
  4. matching interests create Activation
  5. runtime receives the activation and decides whether/how to read items
  6. runtime maps inbox items into its own queue and task semantics

Outbound Flow

Recommended first-pass outbound flow:

  1. runtime decides to send a reply, ask, update, or notify
  2. runtime references a DeliveryHandle
  3. AgentInbox performs the source-specific delivery
  4. source-specific message/thread identity remains in AgentInbox, not in the runtime connector layer

Shared Source Model

One important rule:

That allows:

This is a core reason for the product to exist at all.

Minimal Scope For V1

V1 should prove the boundary, not platform breadth.

Reasonable first-pass scope:

Non-Goals For V1

Do not build these by default:

Architectural Rule Of Thumb

When implementing a feature, ask:

  1. Is this source hosting?
  2. Is this activation?
  3. Is this outbound delivery?
  4. Is this actually runtime logic that belongs in the runtime?
  5. Is this actually generic capability execution that should be delegated to uxc?

If the answer to 4 is yes, do not put it in AgentInbox. If the answer to 5 is yes, do not reimplement it in AgentInbox.

Current Implementation Bias

The first implementation should prefer:

The first implementation should avoid: