agent-inbox 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +18 -0
- package/CLAUDE.md +92 -1
- package/README.md +73 -6
- package/bench/inbox-growth.bench.ts +224 -0
- package/dist/federation/connection-manager.d.ts +8 -0
- package/dist/federation/connection-manager.d.ts.map +1 -1
- package/dist/federation/connection-manager.js +12 -0
- package/dist/federation/connection-manager.js.map +1 -1
- package/dist/federation/delivery-queue.d.ts +11 -3
- package/dist/federation/delivery-queue.d.ts.map +1 -1
- package/dist/federation/delivery-queue.js +38 -8
- package/dist/federation/delivery-queue.js.map +1 -1
- package/dist/federation/queue-store.d.ts +42 -0
- package/dist/federation/queue-store.d.ts.map +1 -0
- package/dist/federation/queue-store.js +87 -0
- package/dist/federation/queue-store.js.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +124 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -0
- package/dist/jsonrpc/mail-push-types.d.ts +9 -0
- package/dist/jsonrpc/mail-push-types.d.ts.map +1 -1
- package/dist/jsonrpc/mail-push-types.js +1 -0
- package/dist/jsonrpc/mail-push-types.js.map +1 -1
- package/dist/jsonrpc/mail-server.d.ts +8 -1
- package/dist/jsonrpc/mail-server.d.ts.map +1 -1
- package/dist/jsonrpc/mail-server.js +42 -1
- package/dist/jsonrpc/mail-server.js.map +1 -1
- package/dist/mail/address-book.d.ts +43 -0
- package/dist/mail/address-book.d.ts.map +1 -0
- package/dist/mail/address-book.js +95 -0
- package/dist/mail/address-book.js.map +1 -0
- package/dist/mail/attachment-store.d.ts +31 -0
- package/dist/mail/attachment-store.d.ts.map +1 -0
- package/dist/mail/attachment-store.js +74 -0
- package/dist/mail/attachment-store.js.map +1 -0
- package/dist/mail/email-mapper.d.ts +41 -0
- package/dist/mail/email-mapper.d.ts.map +1 -0
- package/dist/mail/email-mapper.js +216 -0
- package/dist/mail/email-mapper.js.map +1 -0
- package/dist/mail/fs-attachment-store.d.ts +38 -0
- package/dist/mail/fs-attachment-store.d.ts.map +1 -0
- package/dist/mail/fs-attachment-store.js +165 -0
- package/dist/mail/fs-attachment-store.js.map +1 -0
- package/dist/mail/mail-gateway.d.ts +114 -0
- package/dist/mail/mail-gateway.d.ts.map +1 -0
- package/dist/mail/mail-gateway.js +402 -0
- package/dist/mail/mail-gateway.js.map +1 -0
- package/dist/mail/provider-transport.d.ts +138 -0
- package/dist/mail/provider-transport.d.ts.map +1 -0
- package/dist/mail/provider-transport.js +434 -0
- package/dist/mail/provider-transport.js.map +1 -0
- package/dist/mail/rate-limiter.d.ts +20 -0
- package/dist/mail/rate-limiter.d.ts.map +1 -0
- package/dist/mail/rate-limiter.js +56 -0
- package/dist/mail/rate-limiter.js.map +1 -0
- package/dist/mail/smtp-transport.d.ts +141 -0
- package/dist/mail/smtp-transport.d.ts.map +1 -0
- package/dist/mail/smtp-transport.js +415 -0
- package/dist/mail/smtp-transport.js.map +1 -0
- package/dist/mail/types.d.ts +177 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/mail/types.js +11 -0
- package/dist/mail/types.js.map +1 -0
- package/dist/push/notifier.d.ts +21 -0
- package/dist/push/notifier.d.ts.map +1 -1
- package/dist/push/notifier.js +84 -2
- package/dist/push/notifier.js.map +1 -1
- package/dist/router/destination.d.ts +69 -0
- package/dist/router/destination.d.ts.map +1 -0
- package/dist/router/destination.js +106 -0
- package/dist/router/destination.js.map +1 -0
- package/dist/router/message-router.d.ts +15 -0
- package/dist/router/message-router.d.ts.map +1 -1
- package/dist/router/message-router.js +25 -3
- package/dist/router/message-router.js.map +1 -1
- package/dist/storage/interface.d.ts +21 -0
- package/dist/storage/interface.d.ts.map +1 -1
- package/dist/storage/memory.d.ts +12 -0
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +50 -0
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite.d.ts +14 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +79 -1
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/traceability/traceability.d.ts.map +1 -1
- package/dist/traceability/traceability.js +7 -17
- package/dist/traceability/traceability.js.map +1 -1
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/DESIGN.md +15 -0
- package/docs/MAIL-INTEROP-PLAN.md +660 -0
- package/package.json +29 -3
- package/renovate.json5 +6 -0
- package/rules/agent-inbox.md +1 -0
- package/src/federation/connection-manager.ts +12 -0
- package/src/federation/delivery-queue.ts +38 -8
- package/src/federation/queue-store.ts +124 -0
- package/src/index.ts +186 -1
- package/src/jsonrpc/mail-push-types.ts +10 -0
- package/src/jsonrpc/mail-server.ts +48 -1
- package/src/mail/address-book.ts +111 -0
- package/src/mail/attachment-store.ts +90 -0
- package/src/mail/email-mapper.ts +288 -0
- package/src/mail/fs-attachment-store.ts +163 -0
- package/src/mail/mail-gateway.ts +505 -0
- package/src/mail/provider-transport.ts +577 -0
- package/src/mail/rate-limiter.ts +51 -0
- package/src/mail/smtp-transport.ts +589 -0
- package/src/mail/types.ts +221 -0
- package/src/push/notifier.ts +98 -2
- package/src/router/destination.ts +140 -0
- package/src/router/message-router.ts +41 -4
- package/src/storage/interface.ts +22 -0
- package/src/storage/memory.ts +59 -0
- package/src/storage/sqlite.ts +114 -1
- package/src/traceability/traceability.ts +7 -16
- package/src/types.ts +74 -0
- package/test/federation/delivery-queue-sqlite.test.ts +158 -0
- package/test/load.test.ts +288 -0
- package/test/mail/address-book.test.ts +111 -0
- package/test/mail/attachment-store-contract.test.ts +92 -0
- package/test/mail/attachment-store.test.ts +69 -0
- package/test/mail/destination.test.ts +115 -0
- package/test/mail/dsn-parse.test.ts +239 -0
- package/test/mail/email-mapper.test.ts +341 -0
- package/test/mail/external-id.test.ts +43 -0
- package/test/mail/fs-attachment-store.test.ts +134 -0
- package/test/mail/full-flow-e2e.test.ts +200 -0
- package/test/mail/mail-gateway.test.ts +419 -0
- package/test/mail/mail-transport-contract.test.ts +134 -0
- package/test/mail/mock-mail.ts +161 -0
- package/test/mail/mock-postmark.ts +66 -0
- package/test/mail/provider-transport.test.ts +381 -0
- package/test/mail/rate-limiter.test.ts +48 -0
- package/test/mail/router-mail-integration.test.ts +138 -0
- package/test/mail/smtp-e2e.test.ts +98 -0
- package/test/mail/smtp-transport.test.ts +138 -0
- package/test/mail-presence.test.ts +149 -0
- package/test/mail-push.test.ts +44 -0
- package/test/mail-server.test.ts +25 -0
- package/test/push-notifier.test.ts +81 -0
- package/test/sqlite-storage.test.ts +106 -0
- package/test/storage.test.ts +92 -0
- package/vitest.bench.config.ts +8 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
<!-- SWARMKIT-WIKI:START -->
|
|
4
|
+
## SwarmKit Ecosystem Knowledge Base
|
|
5
|
+
|
|
6
|
+
This repository participates in the SwarmKit ecosystem. Before changing architecture, package boundaries, cross-repo integrations, protocols, task/dispatch behavior, memory/learning flows, workspace/git behavior, or agent orchestration semantics, query the shared knowledge base:
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs context --cwd "$PWD"
|
|
10
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs repo agent-inbox
|
|
11
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs interactions agent-inbox
|
|
12
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs search "<concept>"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Canonical ecosystem memory lives at `/Users/alexngai/GitHub/swarmkit-wiki`.
|
|
16
|
+
|
|
17
|
+
When this repo changes knowledge that should persist across agents, update the relevant wiki article, semantic model, raw snapshot, graph artifact, or cross-repo interaction data in `swarmkit-wiki`. Do not treat this repo's local `.understand-anything/` cache as canonical; graph artifacts are centralized in `swarmkit-wiki/.understand-anything/graphs/`.
|
|
18
|
+
<!-- SWARMKIT-WIKI:END -->
|
package/CLAUDE.md
CHANGED
|
@@ -13,7 +13,7 @@ npm test # Run all tests (vitest)
|
|
|
13
13
|
npm run test:watch # Watch mode
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
All tests use vitest. Run the full suite before committing — there are
|
|
16
|
+
All tests use vitest. Run the full suite before committing — there are 612 tests across 49 files. Most run fast; the SQLite load tests take ~10s.
|
|
17
17
|
|
|
18
18
|
## Project layout
|
|
19
19
|
|
|
@@ -43,10 +43,22 @@ src/
|
|
|
43
43
|
mesh-connector.ts Factory for creating MeshTransport connections (MapAgentConnectionClass)
|
|
44
44
|
delivery-bridge.ts DeliveryHandler bridge — intercepts MAP delivery → inbox storage
|
|
45
45
|
type-mapper.ts MAP Message ↔ Inbox Message bidirectional translation
|
|
46
|
+
mail/ Email interop (inbound + outbound) — see docs/MAIL-INTEROP-PLAN.md
|
|
47
|
+
types.ts MailTransport interface + envelope types (OutboundMail, InboundMail, etc.)
|
|
48
|
+
mail-gateway.ts Ingress/egress, dedup, abuse controls, durable retry, bounce handling
|
|
49
|
+
smtp-transport.ts Self-hosted SMTP backend (smtp-server/nodemailer/mailparser/mailauth) + DSN parsing
|
|
50
|
+
provider-transport.ts Managed Postmark backend (REST API + webhooks)
|
|
51
|
+
email-mapper.ts RFC 5322 email ↔ Inbox Message bidirectional translation
|
|
52
|
+
address-book.ts agent_id ↔ email-address mapping, owned domains, plus-addressing
|
|
53
|
+
attachment-store.ts SqliteAttachmentStore — content-addressed attachment bytes (default)
|
|
54
|
+
fs-attachment-store.ts FsAttachmentStore — filesystem attachment bytes (opt-in, large/high-volume)
|
|
55
|
+
rate-limiter.ts Sliding-window limiter for inbound abuse control
|
|
56
|
+
router/destination.ts classifyDestination — local / federation / mail recipient classification
|
|
46
57
|
|
|
47
58
|
test/
|
|
48
59
|
federation/ Federation tests (connection-manager, routing, queue, address, trust, integration, sdk-integration)
|
|
49
60
|
mesh/ Mesh transport tests (mesh-transport, mesh-connector, federation-mesh, delivery-bridge, type-mapper, meshpeer-integration, e2e)
|
|
61
|
+
mail/ Mail tests (destination, address-book, email-mapper, attachment-store, contract suite, gateway, smtp/provider transports, dsn-parse, rate-limiter, smtp-e2e)
|
|
50
62
|
registry/ Warm registry tests
|
|
51
63
|
*.test.ts Core tests (storage, router, traceability, IPC, mail-server, push)
|
|
52
64
|
|
|
@@ -111,6 +123,53 @@ Key mesh components:
|
|
|
111
123
|
- `DeliveryBridge` (`src/mesh/delivery-bridge.ts`) — intercepts MAP delivery for inbox storage
|
|
112
124
|
- `TypeMapper` (`src/mesh/type-mapper.ts`) — bidirectional MAP ↔ Inbox message translation
|
|
113
125
|
|
|
126
|
+
### Mail interop (email) is optional
|
|
127
|
+
|
|
128
|
+
Agent Inbox can send and receive external email through a pluggable
|
|
129
|
+
`MailTransport` interface (`src/mail/types.ts`). Enabled via `InboxConfig.mail`.
|
|
130
|
+
Full design: `docs/MAIL-INTEROP-PLAN.md`.
|
|
131
|
+
|
|
132
|
+
**Two backends, one interface** (mirrors the WebSocket/mesh transport split):
|
|
133
|
+
- **Self-hosted SMTP** (`smtp-transport.ts`, default) — `smtp-server` inbound +
|
|
134
|
+
`nodemailer` outbound + `mailparser`/`mailauth`. Lightweight; TLS terminated
|
|
135
|
+
upstream. All four libs are optional peer deps (dynamic import).
|
|
136
|
+
- **Managed Postmark** (`provider-transport.ts`) — REST API outbound + webhook
|
|
137
|
+
inbound. The `postmark` SDK is an optional peer dep; the client is injectable.
|
|
138
|
+
|
|
139
|
+
**Recipient classification** (`src/router/destination.ts`): `classifyDestination`
|
|
140
|
+
splits recipients into `local` / `federation` / `mail` using explicit lists —
|
|
141
|
+
email addresses (`bob@example.com`) and federation addresses (`bob@system-2`)
|
|
142
|
+
are syntactically identical, so this disambiguation is required. Federation
|
|
143
|
+
peers may declare domains (win over mail); unknown `@x` is an error, never a
|
|
144
|
+
guess. `MessageRouter.setMail()` adds the mail egress branch;
|
|
145
|
+
`ConnectionManager.setMailRecipientFilter()` stops federation from grabbing mail
|
|
146
|
+
addresses.
|
|
147
|
+
|
|
148
|
+
**Mail flow:**
|
|
149
|
+
1. Inbound: transport receives → `MailGateway` applies policy (size, allow-list,
|
|
150
|
+
DMARC, attachment cap) + rate limiting + dedup (on RFC Message-ID) → maps via
|
|
151
|
+
`email-mapper` → commits via `router.routeMessage` (single ingestion path).
|
|
152
|
+
The transport ACKs only after the handler resolves (commit-before-ACK); a
|
|
153
|
+
throw NACKs.
|
|
154
|
+
2. Outbound: router routes `mail`-class recipients to `MailGateway.send()` →
|
|
155
|
+
`email-mapper` renders → `transport.send()`. `delivered`/`transient`/
|
|
156
|
+
`permanent` disposition drives done / durable-retry-queue / bounce.
|
|
157
|
+
3. Bounces: outbound `permanent` results and inbound DSNs (RFC 3464, parsed by
|
|
158
|
+
SMTP `parseDsnFromParsed` or Postmark bounce webhooks) converge on one
|
|
159
|
+
config-gated handler — emits `mail.bounced` and synthesizes an inbox notice.
|
|
160
|
+
|
|
161
|
+
**Durability:** outbound retries use the `DeliveryQueue` with the SQLite
|
|
162
|
+
`QueueStore` (survives restart); inbound dedup uses `storage.recordExternalId`/
|
|
163
|
+
`hasSeenExternalId`. Attachments live behind `AttachmentStore`, content-addressed
|
|
164
|
+
by sha256 — `SqliteAttachmentStore` (default, atomic with the message) or
|
|
165
|
+
`FsAttachmentStore` (opt-in via `config.mail.attachments.backend = "fs"`, keeps
|
|
166
|
+
bytes on disk; write-then-rename so a crash leaves only GC-able orphans). Both
|
|
167
|
+
pass the shared `test/mail/attachment-store-contract.test.ts`.
|
|
168
|
+
|
|
169
|
+
**Contract suite:** `test/mail/mail-transport-contract.test.ts` runs the same
|
|
170
|
+
suite against every backend via a `MailTransportHarness` (mock + Postmark fake
|
|
171
|
+
client). Any new backend must pass it unchanged.
|
|
172
|
+
|
|
114
173
|
### Event-driven internals
|
|
115
174
|
|
|
116
175
|
Components communicate via `EventEmitter`. Key events:
|
|
@@ -120,6 +179,7 @@ Components communicate via `EventEmitter`. Key events:
|
|
|
120
179
|
- `federation.message.received` — incoming federation message
|
|
121
180
|
- `federation.broadcast` — broadcast strategy fired
|
|
122
181
|
- `routing.updated` — routing table changed
|
|
182
|
+
- `mail.received` / `mail.sent` / `mail.queued` / `mail.bounced` / `mail.rejected` / `mail.rate_limited` — mail gateway lifecycle
|
|
123
183
|
|
|
124
184
|
## Conventions
|
|
125
185
|
|
|
@@ -130,6 +190,7 @@ Components communicate via `EventEmitter`. Key events:
|
|
|
130
190
|
- Content normalization: string payloads auto-wrapped to `{ type: "text", text: "..." }`
|
|
131
191
|
- Federation tests use `MockMapServer` (in-process broker) in `test/federation/sdk-integration.test.ts`
|
|
132
192
|
- Mesh tests use `MockMeshContext` (linked pair) in `test/mesh/mock-mesh.ts`
|
|
193
|
+
- Mail tests use `MockMailTransport` (`test/mail/mock-mail.ts`) and a fake Postmark client (`test/mail/mock-postmark.ts`); both expose a `MailTransportHarness` for the shared contract suite
|
|
133
194
|
- Mesh channel name convention: protocol channels use `"proto:"` prefix (e.g., `"proto:agent-inbox"`)
|
|
134
195
|
|
|
135
196
|
## Common tasks
|
|
@@ -149,3 +210,33 @@ Components communicate via `EventEmitter`. Key events:
|
|
|
149
210
|
1. Add to interface in `src/storage/interface.ts`
|
|
150
211
|
2. Implement in both `memory.ts` and `sqlite.ts`
|
|
151
212
|
3. Test in `test/storage.test.ts` and `test/sqlite-storage.test.ts`
|
|
213
|
+
|
|
214
|
+
### Adding a new mail backend
|
|
215
|
+
1. Implement the `MailTransport` interface (`src/mail/types.ts`) in
|
|
216
|
+
`src/mail/<name>-transport.ts`. Load any SDK as an optional peer dep via
|
|
217
|
+
dynamic import; keep send/parse logic in exported pure functions.
|
|
218
|
+
2. Map the backend's failures to `delivered`/`transient`/`permanent`
|
|
219
|
+
dispositions — never throw from `send()` for delivery failures. ACK inbound
|
|
220
|
+
only after the awaited handler resolves.
|
|
221
|
+
3. Provide a `MailTransportHarness` (inject inbound + program next send) and add
|
|
222
|
+
`runMailTransportContract("<Name>", makeHarness)` to
|
|
223
|
+
`test/mail/mail-transport-contract.test.ts`. It must pass unchanged.
|
|
224
|
+
4. Wire it in `src/index.ts` under the `config.mail.backend` switch and declare
|
|
225
|
+
the SDK in `package.json` peerDependencies (optional).
|
|
226
|
+
|
|
227
|
+
<!-- SWARMKIT-WIKI:START -->
|
|
228
|
+
## SwarmKit Ecosystem Knowledge Base
|
|
229
|
+
|
|
230
|
+
This repository participates in the SwarmKit ecosystem. Before changing architecture, package boundaries, cross-repo integrations, protocols, task/dispatch behavior, memory/learning flows, workspace/git behavior, or agent orchestration semantics, query the shared knowledge base:
|
|
231
|
+
|
|
232
|
+
```sh
|
|
233
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs context --cwd "$PWD"
|
|
234
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs repo agent-inbox
|
|
235
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs interactions agent-inbox
|
|
236
|
+
node /Users/alexngai/GitHub/swarmkit-wiki/scripts/query-knowledge.mjs search "<concept>"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Canonical ecosystem memory lives at `/Users/alexngai/GitHub/swarmkit-wiki`.
|
|
240
|
+
|
|
241
|
+
When this repo changes knowledge that should persist across agents, update the relevant wiki article, semantic model, raw snapshot, graph artifact, or cross-repo interaction data in `swarmkit-wiki`. Do not treat this repo's local `.understand-anything/` cache as canonical; graph artifacts are centralized in `swarmkit-wiki/.understand-anything/graphs/`.
|
|
242
|
+
<!-- SWARMKIT-WIKI:END -->
|
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ Built to work with [claude-code-swarm](https://github.com/alexngai/claude-code-s
|
|
|
10
10
|
- **Threading** — Messages can be grouped by `thread_tag` and linked via `in_reply_to` for conversation threading.
|
|
11
11
|
- **Traceability** — Auto-creates conversations, turns, and threads from messaging events following MAP's mail conventions.
|
|
12
12
|
- **Federation** — Route messages across independent systems. Supports WebSocket (MAP SDK) and encrypted P2P mesh (agentic-mesh) transports, configurable per-peer. Routing strategies: table, broadcast, hierarchical.
|
|
13
|
+
- **Email interop** — Send and receive real email through a pluggable `MailTransport`. Self-hosted SMTP (default) or managed Postmark, behind one interface. Inbound is mapped into agent inboxes; outbound, durable retry, dedup, bounces, and abuse controls are built in.
|
|
13
14
|
- **Multiple interfaces** — IPC (UNIX socket), MCP tools (stdio), MAP JSON-RPC, and event-based push via `inbox.message` events.
|
|
14
15
|
|
|
15
16
|
## Architecture
|
|
@@ -23,12 +24,20 @@ Agent Runtime (Claude Code, OpenAI, etc.)
|
|
|
23
24
|
│
|
|
24
25
|
├── Local delivery (same system)
|
|
25
26
|
├── Federation via MAP SDK (WebSocket)
|
|
26
|
-
|
|
27
|
+
├── Federation via agentic-mesh (encrypted P2P)
|
|
28
|
+
│ │
|
|
29
|
+
│ MeshPeer (MAP server, FederationGateway,
|
|
30
|
+
│ agent discovery, hop/loop detection)
|
|
31
|
+
└── Email via MailTransport (self-hosted SMTP / Postmark)
|
|
27
32
|
│
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
MailGateway (ingress policy + dedup, durable retry,
|
|
34
|
+
bounces, attachments)
|
|
30
35
|
```
|
|
31
36
|
|
|
37
|
+
Recipients are classified once into `local` / `federation` / `mail`, so an
|
|
38
|
+
external email address (`bob@example.com`) and a federation address
|
|
39
|
+
(`bob@system-2`) — which look identical — are routed unambiguously.
|
|
40
|
+
|
|
32
41
|
Agent Inbox can run standalone (IPC + MCP only), with a MAP server (WebSocket federation), or with an embedded agentic-mesh `MeshPeer` (encrypted P2P federation with full MAP protocol support).
|
|
33
42
|
|
|
34
43
|
## Quick start
|
|
@@ -149,12 +158,57 @@ Federation connections are gated by an allow-list. Only systems in `allowedServe
|
|
|
149
158
|
|
|
150
159
|
Messages to offline peers are queued with configurable TTL, overflow policy, and retry strategy. Queues flush automatically on reconnect.
|
|
151
160
|
|
|
161
|
+
## Email interop
|
|
162
|
+
|
|
163
|
+
Agents can send and receive real email. Email moves through a pluggable
|
|
164
|
+
`MailTransport` interface with two interchangeable backends (the same
|
|
165
|
+
WebSocket/mesh split applied to mail):
|
|
166
|
+
|
|
167
|
+
- **Self-hosted SMTP** (default) — `smtp-server` inbound + `nodemailer` outbound,
|
|
168
|
+
with `mailparser`/`mailauth`. Lightweight; TLS terminated upstream.
|
|
169
|
+
- **Managed Postmark** — REST API outbound + webhook inbound.
|
|
170
|
+
|
|
171
|
+
All four SMTP libs and the `postmark` SDK are **optional peer dependencies**,
|
|
172
|
+
loaded only when mail is enabled.
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
await createAgentInbox({
|
|
176
|
+
sqlitePath: "/var/lib/agent-inbox/inbox.db", // durable queue + attachments
|
|
177
|
+
config: {
|
|
178
|
+
mail: {
|
|
179
|
+
enabled: true,
|
|
180
|
+
backend: "smtp", // or "provider"
|
|
181
|
+
identity: {
|
|
182
|
+
localDomains: ["agents.example.com"],
|
|
183
|
+
mappings: [{ agentId: "alice", address: "alice@agents.example.com" }],
|
|
184
|
+
},
|
|
185
|
+
routableDomains: ["example.com"], // domains we'll send to
|
|
186
|
+
smtp: { listenPort: 25, relay: { host: "smarthost", port: 587 } },
|
|
187
|
+
rateLimit: { perSenderDomain: 60, global: 600 },
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Once enabled, sending to an email address just works: `send_message({ to: "user@example.com", ... })` routes via the mail gateway.
|
|
194
|
+
|
|
195
|
+
**What's handled for you:**
|
|
196
|
+
|
|
197
|
+
- **Recipient classification** — `local` / `federation` / `mail`, explicit-list driven, so `bob@example.com` (mail) and `bob@system-2` (federation) never collide. Unknown domains are an error, never a guess.
|
|
198
|
+
- **Threading** — RFC `Message-ID`/`In-Reply-To`/`References` map onto inbox `thread_tag`/`in_reply_to` in both directions.
|
|
199
|
+
- **Durability** — outbound retries use the persistent delivery queue (survives restart); inbound is deduped on `Message-ID` and committed before the transport ACKs.
|
|
200
|
+
- **Bounces** — outbound permanent failures and inbound DSNs (RFC 3464 / Postmark webhooks) converge on one handler that emits `mail.bounced` and drops a notice into the sender's inbox.
|
|
201
|
+
- **Attachments** — content-addressed behind an `AttachmentStore`: SQLite BLOBs (default) or filesystem (`attachments.backend: "fs"`).
|
|
202
|
+
- **Abuse controls** — per-sender/global rate limiting, sender allow-lists, optional DMARC-fail rejection, attachment caps, and webhook Basic Auth.
|
|
203
|
+
|
|
204
|
+
Full design and rationale: [docs/MAIL-INTEROP-PLAN.md](docs/MAIL-INTEROP-PLAN.md).
|
|
205
|
+
|
|
152
206
|
## Storage
|
|
153
207
|
|
|
154
208
|
Two storage backends:
|
|
155
209
|
|
|
156
210
|
- **InMemoryStorage** — Default. Fast, no dependencies. Data lost on restart.
|
|
157
|
-
- **SQLiteStorage** — Persistent storage with FTS5 full-text search. Requires `better-sqlite3`.
|
|
211
|
+
- **SQLiteStorage** — Persistent storage with FTS5 full-text search. Requires `better-sqlite3`. Also backs the durable mail retry queue, inbound dedup, and (by default) attachment bytes — so enabling mail with SQLite gives restart-safe delivery.
|
|
158
212
|
|
|
159
213
|
## Project structure
|
|
160
214
|
|
|
@@ -167,7 +221,8 @@ src/
|
|
|
167
221
|
memory.ts In-memory implementation
|
|
168
222
|
sqlite.ts SQLite implementation (persistent + FTS5)
|
|
169
223
|
router/
|
|
170
|
-
message-router.ts Message routing: resolve recipients, local vs remote
|
|
224
|
+
message-router.ts Message routing: resolve recipients, local vs remote vs mail
|
|
225
|
+
destination.ts classifyDestination — local / federation / mail
|
|
171
226
|
federation/
|
|
172
227
|
connection-manager.ts MAP connections + federation peer management
|
|
173
228
|
routing-engine.ts Configurable routing (table/broadcast/hierarchical)
|
|
@@ -193,6 +248,16 @@ src/
|
|
|
193
248
|
mesh-connector.ts Factory for MeshTransport connections
|
|
194
249
|
delivery-bridge.ts DeliveryHandler bridge (MAP delivery → inbox storage)
|
|
195
250
|
type-mapper.ts Bidirectional MAP ↔ Inbox message translation
|
|
251
|
+
mail/
|
|
252
|
+
types.ts MailTransport interface + envelope types
|
|
253
|
+
mail-gateway.ts Ingress/egress, dedup, abuse controls, retry, bounces
|
|
254
|
+
smtp-transport.ts Self-hosted SMTP backend + DSN parsing
|
|
255
|
+
provider-transport.ts Managed Postmark backend (REST + webhooks)
|
|
256
|
+
email-mapper.ts RFC 5322 email ↔ Inbox message translation
|
|
257
|
+
address-book.ts agent_id ↔ email, owned domains, plus-addressing
|
|
258
|
+
attachment-store.ts SqliteAttachmentStore (default)
|
|
259
|
+
fs-attachment-store.ts FsAttachmentStore (opt-in, filesystem)
|
|
260
|
+
rate-limiter.ts Sliding-window limiter for inbound abuse control
|
|
196
261
|
```
|
|
197
262
|
|
|
198
263
|
## Testing
|
|
@@ -202,7 +267,7 @@ npm test # Run all tests
|
|
|
202
267
|
npm run test:watch # Watch mode
|
|
203
268
|
```
|
|
204
269
|
|
|
205
|
-
|
|
270
|
+
612 tests across 49 test files covering:
|
|
206
271
|
|
|
207
272
|
- Storage (in-memory + SQLite)
|
|
208
273
|
- Message routing and content normalization
|
|
@@ -217,6 +282,7 @@ npm run test:watch # Watch mode
|
|
|
217
282
|
- Mesh transport (MeshTransport, MeshConnector, federation-mesh integration)
|
|
218
283
|
- Mesh Phase 2 (DeliveryBridge, TypeMapper, MeshPeer integration)
|
|
219
284
|
- E2E with real agentic-mesh MeshPeer instances (bidirectional messaging, reply chains, concurrent load)
|
|
285
|
+
- Email interop: destination classification, RFC mapping, address book, attachment stores (SQLite + filesystem), durable queue persistence, DSN/bounce parsing (incl. real-`mailparser` fixtures), rate limiting, a shared `MailTransport` contract run against both backends, and a full-flow e2e over real SMTP sockets between two nodes
|
|
220
286
|
|
|
221
287
|
## Development
|
|
222
288
|
|
|
@@ -231,6 +297,7 @@ Requires Node.js >= 18.
|
|
|
231
297
|
## Further reading
|
|
232
298
|
|
|
233
299
|
- [docs/DESIGN.md](docs/DESIGN.md) — Detailed architecture and design decisions
|
|
300
|
+
- [docs/MAIL-INTEROP-PLAN.md](docs/MAIL-INTEROP-PLAN.md) — Email interop design: the `MailTransport` interface, recipient classification, durability, bounces, and the SMTP/Postmark backends
|
|
234
301
|
- [docs/CLAUDE-CODE-SWARM-PROPOSAL.md](docs/CLAUDE-CODE-SWARM-PROPOSAL.md) — Proposal: replace claude-code-swarm's sidecar with embedded MeshPeer + agent-inbox
|
|
235
302
|
|
|
236
303
|
## License
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { describe, it } from "vitest";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { EventEmitter } from "node:events";
|
|
6
|
+
import { ulid } from "ulid";
|
|
7
|
+
import { SqliteStorage } from "../src/storage/sqlite.js";
|
|
8
|
+
import { MessageRouter } from "../src/router/message-router.js";
|
|
9
|
+
import { TraceabilityLayer } from "../src/traceability/traceability.js";
|
|
10
|
+
import { PushNotifier } from "../src/push/notifier.js";
|
|
11
|
+
import type { Message, Conversation, Turn } from "../src/types.js";
|
|
12
|
+
import type { Storage } from "../src/storage/interface.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Before/after benchmark.
|
|
16
|
+
*
|
|
17
|
+
* Drives the same N-message workload through two code paths:
|
|
18
|
+
* - LEGACY: simulates the pre-fix behavior (jsonl caps off + traceability
|
|
19
|
+
* re-upserts the message and rewrites the conversation+participants on
|
|
20
|
+
* every message).
|
|
21
|
+
* - FIXED: the current code path.
|
|
22
|
+
*
|
|
23
|
+
* Reports jsonl file size, SQLite DB size, and wall-clock time so the
|
|
24
|
+
* impact of the fixes is visible empirically.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const N = parseInt(process.env.BENCH_N ?? "2000", 10);
|
|
28
|
+
const RECIPIENTS = 10;
|
|
29
|
+
|
|
30
|
+
interface Result {
|
|
31
|
+
label: string;
|
|
32
|
+
durationMs: number;
|
|
33
|
+
jsonlBytes: number;
|
|
34
|
+
jsonlLines: number;
|
|
35
|
+
dbBytes: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Pre-fix traceability behavior, kept here purely for the benchmark. */
|
|
39
|
+
class LegacyTraceability {
|
|
40
|
+
private tagToConversation = new Map<string, string>();
|
|
41
|
+
private scopeCatchAll = new Map<string, string>();
|
|
42
|
+
|
|
43
|
+
constructor(private storage: Storage, events: EventEmitter) {
|
|
44
|
+
events.on("message.created", (msg: Message) => this.onMessage(msg));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private onMessage(message: Message): void {
|
|
48
|
+
const conversationId = this.resolveConversation(message);
|
|
49
|
+
|
|
50
|
+
// OLD: re-upsert the entire message (and recipients) just to set conv_id
|
|
51
|
+
if (!message.conversation_id) {
|
|
52
|
+
message.conversation_id = conversationId;
|
|
53
|
+
this.storage.putMessage(message);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.ensureParticipant(conversationId, message.sender_id);
|
|
57
|
+
for (const r of message.recipients) {
|
|
58
|
+
this.ensureParticipant(conversationId, r.agent_id);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const turn: Turn = {
|
|
62
|
+
id: `turn-${ulid()}`,
|
|
63
|
+
conversation_id: conversationId,
|
|
64
|
+
participant_id: message.sender_id,
|
|
65
|
+
source_message_id: message.id,
|
|
66
|
+
content_type: message.content.type,
|
|
67
|
+
content: message.content,
|
|
68
|
+
created_at: message.created_at,
|
|
69
|
+
};
|
|
70
|
+
this.storage.addTurn(turn);
|
|
71
|
+
|
|
72
|
+
// OLD: rewrite conversation row + DELETE/INSERT all participants
|
|
73
|
+
const conv = this.storage.getConversation(conversationId);
|
|
74
|
+
if (conv) {
|
|
75
|
+
conv.updated_at = message.created_at;
|
|
76
|
+
this.storage.putConversation(conv);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private resolveConversation(message: Message): string {
|
|
81
|
+
if (message.thread_tag) {
|
|
82
|
+
const key = `${message.thread_tag}:${message.scope}`;
|
|
83
|
+
const existing = this.tagToConversation.get(key);
|
|
84
|
+
if (existing) return existing;
|
|
85
|
+
const id = this.create(message.scope, message.thread_tag);
|
|
86
|
+
this.tagToConversation.set(key, id);
|
|
87
|
+
return id;
|
|
88
|
+
}
|
|
89
|
+
const existing = this.scopeCatchAll.get(message.scope);
|
|
90
|
+
if (existing) return existing;
|
|
91
|
+
const id = this.create(message.scope, "General");
|
|
92
|
+
this.scopeCatchAll.set(message.scope, id);
|
|
93
|
+
return id;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private create(scope: string, subject?: string): string {
|
|
97
|
+
const now = new Date().toISOString();
|
|
98
|
+
const conv: Conversation = {
|
|
99
|
+
id: `conv-${ulid()}`,
|
|
100
|
+
scope,
|
|
101
|
+
subject,
|
|
102
|
+
status: "active",
|
|
103
|
+
participants: [],
|
|
104
|
+
metadata: {},
|
|
105
|
+
created_at: now,
|
|
106
|
+
updated_at: now,
|
|
107
|
+
};
|
|
108
|
+
this.storage.putConversation(conv);
|
|
109
|
+
return conv.id;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private ensureParticipant(conversationId: string, agentId: string): void {
|
|
113
|
+
const conv = this.storage.getConversation(conversationId);
|
|
114
|
+
if (!conv) return;
|
|
115
|
+
if (conv.participants.some((p) => p.agent_id === agentId)) return;
|
|
116
|
+
conv.participants.push({
|
|
117
|
+
agent_id: agentId,
|
|
118
|
+
joined_at: new Date().toISOString(),
|
|
119
|
+
});
|
|
120
|
+
this.storage.putConversation(conv);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function runScenario(
|
|
125
|
+
label: string,
|
|
126
|
+
setup: (
|
|
127
|
+
inboxDir: string,
|
|
128
|
+
dbPath: string
|
|
129
|
+
) => {
|
|
130
|
+
storage: SqliteStorage;
|
|
131
|
+
router: MessageRouter;
|
|
132
|
+
}
|
|
133
|
+
): Promise<Result> {
|
|
134
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "inbox-bench-"));
|
|
135
|
+
const dbPath = path.join(tmp, "inbox.db");
|
|
136
|
+
|
|
137
|
+
const { storage, router } = setup(tmp, dbPath);
|
|
138
|
+
const recipients = Array.from({ length: RECIPIENTS }, (_, i) => `agent-${i}`);
|
|
139
|
+
|
|
140
|
+
const t0 = Date.now();
|
|
141
|
+
for (let i = 0; i < N; i++) {
|
|
142
|
+
await router.routeMessage({
|
|
143
|
+
from: "alice",
|
|
144
|
+
to: recipients,
|
|
145
|
+
payload: `msg-${i} ${"x".repeat(40)}`,
|
|
146
|
+
threadTag: "broadcast",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const durationMs = Date.now() - t0;
|
|
150
|
+
|
|
151
|
+
const inboxFile = path.join(tmp, "agent-0.inbox.jsonl");
|
|
152
|
+
const raw = fs.existsSync(inboxFile)
|
|
153
|
+
? fs.readFileSync(inboxFile, "utf-8")
|
|
154
|
+
: "";
|
|
155
|
+
const jsonlLines = raw.split("\n").filter((l) => l.length > 0).length;
|
|
156
|
+
const jsonlBytes = fs.existsSync(inboxFile)
|
|
157
|
+
? fs.statSync(inboxFile).size
|
|
158
|
+
: 0;
|
|
159
|
+
|
|
160
|
+
storage.close();
|
|
161
|
+
const dbBytes = fs.statSync(dbPath).size;
|
|
162
|
+
|
|
163
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
164
|
+
|
|
165
|
+
return { label, durationMs, jsonlBytes, jsonlLines, dbBytes };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function fmt(bytes: number): string {
|
|
169
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
170
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
171
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MiB`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
describe("inbox-growth before/after", () => {
|
|
175
|
+
it(
|
|
176
|
+
`compares legacy vs fixed code paths (N=${N})`,
|
|
177
|
+
async () => {
|
|
178
|
+
const legacy = await runScenario("LEGACY", (inboxDir, dbPath) => {
|
|
179
|
+
const storage = new SqliteStorage({ path: dbPath });
|
|
180
|
+
const events = new EventEmitter();
|
|
181
|
+
const router = new MessageRouter(storage, events, "default");
|
|
182
|
+
new LegacyTraceability(storage, events);
|
|
183
|
+
new PushNotifier(
|
|
184
|
+
{
|
|
185
|
+
inboxDir,
|
|
186
|
+
// pre-fix: no caps
|
|
187
|
+
maxEntriesPerInbox: 0,
|
|
188
|
+
maxBytesPerInbox: 0,
|
|
189
|
+
},
|
|
190
|
+
storage,
|
|
191
|
+
events
|
|
192
|
+
);
|
|
193
|
+
return { storage, router };
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
const fixed = await runScenario("FIXED", (inboxDir, dbPath) => {
|
|
197
|
+
const storage = new SqliteStorage({ path: dbPath });
|
|
198
|
+
const events = new EventEmitter();
|
|
199
|
+
const router = new MessageRouter(storage, events, "default");
|
|
200
|
+
new TraceabilityLayer(storage, events);
|
|
201
|
+
new PushNotifier({ inboxDir }, storage, events); // defaults
|
|
202
|
+
return { storage, router };
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const pct = (a: number, b: number) =>
|
|
206
|
+
a === 0 ? "n/a" : `${((b / a) * 100).toFixed(1)}%`;
|
|
207
|
+
|
|
208
|
+
const lines = [
|
|
209
|
+
"",
|
|
210
|
+
`Inbox growth bench — N=${N} messages × ${RECIPIENTS} recipients (broadcast)`,
|
|
211
|
+
"─".repeat(78),
|
|
212
|
+
`${"metric".padEnd(28)} ${"legacy".padEnd(16)} ${"fixed".padEnd(16)} fixed/legacy`,
|
|
213
|
+
"─".repeat(78),
|
|
214
|
+
`${"jsonl file size".padEnd(28)} ${fmt(legacy.jsonlBytes).padEnd(16)} ${fmt(fixed.jsonlBytes).padEnd(16)} ${pct(legacy.jsonlBytes, fixed.jsonlBytes)}`,
|
|
215
|
+
`${"jsonl line count".padEnd(28)} ${String(legacy.jsonlLines).padEnd(16)} ${String(fixed.jsonlLines).padEnd(16)} ${pct(legacy.jsonlLines, fixed.jsonlLines)}`,
|
|
216
|
+
`${"sqlite db size (post-close)".padEnd(28)} ${fmt(legacy.dbBytes).padEnd(16)} ${fmt(fixed.dbBytes).padEnd(16)} ${pct(legacy.dbBytes, fixed.dbBytes)}`,
|
|
217
|
+
`${"wall-clock duration".padEnd(28)} ${(legacy.durationMs + " ms").padEnd(16)} ${(fixed.durationMs + " ms").padEnd(16)} ${pct(legacy.durationMs, fixed.durationMs)}`,
|
|
218
|
+
"─".repeat(78),
|
|
219
|
+
];
|
|
220
|
+
console.log(lines.join("\n"));
|
|
221
|
+
},
|
|
222
|
+
120_000
|
|
223
|
+
);
|
|
224
|
+
});
|
|
@@ -39,6 +39,8 @@ export declare class ConnectionManager {
|
|
|
39
39
|
private meshConnector;
|
|
40
40
|
private meshPeer;
|
|
41
41
|
private onIncoming;
|
|
42
|
+
/** Optional predicate marking recipients owned by the mail gateway (skipped). */
|
|
43
|
+
private mailFilter;
|
|
42
44
|
readonly routing: RoutingEngine;
|
|
43
45
|
readonly queue: DeliveryQueue;
|
|
44
46
|
readonly trust: TrustManager;
|
|
@@ -53,6 +55,12 @@ export declare class ConnectionManager {
|
|
|
53
55
|
* Get the resolved system ID for this Agent Inbox instance.
|
|
54
56
|
*/
|
|
55
57
|
getSystemId(): SystemId;
|
|
58
|
+
/**
|
|
59
|
+
* Register a predicate identifying recipients handled by the mail gateway.
|
|
60
|
+
* Those recipients are skipped by route() so a `bob@example.com` address is
|
|
61
|
+
* not mistaken for a federation peer.
|
|
62
|
+
*/
|
|
63
|
+
setMailRecipientFilter(fn: (agentId: string) => boolean): void;
|
|
56
64
|
/**
|
|
57
65
|
* Establish federation with a peer. Uses MAP federation/connect protocol.
|
|
58
66
|
* If an SDK class was injected, opens a real MAP connection to the peer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/federation/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,OAAO,EACP,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,uBAAuB,EAEvB,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,KAAK,IAAI,CAAC;AAEX;;;;;;GAMG;AACH,qBAAa,iBAAiB;
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/federation/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,8 @@ export class ConnectionManager {
|
|
|
25
25
|
meshConnector;
|
|
26
26
|
meshPeer;
|
|
27
27
|
onIncoming;
|
|
28
|
+
/** Optional predicate marking recipients owned by the mail gateway (skipped). */
|
|
29
|
+
mailFilter = null;
|
|
28
30
|
routing;
|
|
29
31
|
queue;
|
|
30
32
|
trust;
|
|
@@ -64,6 +66,14 @@ export class ConnectionManager {
|
|
|
64
66
|
getSystemId() {
|
|
65
67
|
return this.systemId;
|
|
66
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a predicate identifying recipients handled by the mail gateway.
|
|
71
|
+
* Those recipients are skipped by route() so a `bob@example.com` address is
|
|
72
|
+
* not mistaken for a federation peer.
|
|
73
|
+
*/
|
|
74
|
+
setMailRecipientFilter(fn) {
|
|
75
|
+
this.mailFilter = fn;
|
|
76
|
+
}
|
|
67
77
|
/**
|
|
68
78
|
* Establish federation with a peer. Uses MAP federation/connect protocol.
|
|
69
79
|
* If an SDK class was injected, opens a real MAP connection to the peer.
|
|
@@ -199,6 +209,8 @@ export class ConnectionManager {
|
|
|
199
209
|
async route(message) {
|
|
200
210
|
// Determine target for each recipient
|
|
201
211
|
for (const recipient of message.recipients) {
|
|
212
|
+
if (this.mailFilter?.(recipient.agent_id))
|
|
213
|
+
continue; // handled by mail gateway
|
|
202
214
|
const addr = parseAddress(recipient.agent_id);
|
|
203
215
|
if (!isRemoteAddress(addr))
|
|
204
216
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/federation/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/federation/connection-manager.ts"],"names":[],"mappings":"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"}
|