"""Agents module — the slot where AI agents plug into an edge, and the first tenant.

**STATUS: part of the product shape — the owner's direction, 2026-08-04** (*"our AI agents
arrive preconfigured, and the customer can add their own"*). The seam itself was founded in
`neoedges` (PROPOSAL of 2026-08-01) and is ported here with its law intact. Nothing in
`neoedge` imports this package, so the edge runs with it absent.

## Why a slot rather than an agent

Adapters already prove the shape: *adding an ERP is a table, not a code path.* Agents get
the same treatment — a declared seam with a narrow contract, so a new agent is a class that
answers questions, not a change to the edge. `roster.AgentRegistry` carries the product
half: our roster preconfigured, the customer's own classes added at run time, both listable
BEFORE anything runs.

The contract is deliberately one-directional: **agents READ the edge; they never write into
it.** An agent that could record would put a model inside the record path, which is exactly
what `Application != Ledger Core` forbids. Everything an agent produces is output *about*
the edge, never a new fact *in* it.

## The first tenant — the structured-information agent (owner's design)

> An AI agent that serves as a **source of structured information about company A** — feeding
> **our consultant agent**, which, once it has what it needs, learns how to set this system up
> for them: how to structure the company's processes so they can be automated.

Two parties, two very different rights, and the split is the whole design:

| | sees | purpose |
|---|---|---|
| **the company's agent** (`StructuredSourceAgent`) | the company's own edge, in full | answer questions about how this company actually works |
| **our consultant agent** | ONLY what the company's agent chooses to answer | learn how to configure the system for them |

That asymmetry is not politeness — it is the product. The consultant never gets a database
connection, never gets documents, and cannot ask for one: it gets **answers**. If the company
turns the agent off, the consultant learns nothing, and the edge keeps working.
"""

from .base import AgentContext, EdgeAgent
from .roster import PRECONFIGURED, AgentRegistry, RosterError
from .structured_source import StructuredSourceAgent

__all__ = ["AgentContext", "AgentRegistry", "EdgeAgent", "PRECONFIGURED", "RosterError",
           "StructuredSourceAgent"]
