Inbound wire contract
The route isPOST /generic/events. Authentication headers are:
The signing secret belongs to the selected installation. The install and the
literal direction tag
in are included in the signed bytes. The exact raw body
is signed, not a parsed/re-serialized JSON object. An unknown install and a bad
signature receive the same opaque 401.
message_id, conversation_key, actor_id and nonblank body are required.
actor_display_name, parent_message_id and author_is_bot are optional.
Empty body_format defaults to markdown; text is also accepted. Empty
topology defaults to direct; known alternatives are group and channel.
Unknown topology becomes unknown rather than being trusted as a direct chat.
Unknown JSON fields are tolerated by this decoder.
The connector namespaces the conversation as
generic:{install}:{conversation_key}. Caller-supplied conversation keys do not
select another installation’s namespace. External participant IDs become actors
within the owning agent’s perspective. The bot-author flag is an engagement
signal, not a global actor type.
Admission and deduplication
The ingress implementation bounds request size, rate-limits incoming sources, caches unknown installations briefly and caps conversations/actors per install. It uses the shared durable event-claim mechanism before handing admitted work to the dispatcher. Tests exercise these boundaries with constructed runtimes; they do not establish public provisioning or outbound delivery support.Work still required
- A supported credential and installation provisioning flow, including rotation and disablement.
- Production runtime construction for generic installations.
- Signed outbound delivery and its retry, ordering, idempotency and recovery contract. There is no generic persistent delivery outbox today.
- Any optional progress stream or SSE interface.
internal/connector/generic
and internal/app/generic_ingress.go;
production connector construction is in
internal/app/wire.go.