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.
Files changed (149) hide show
  1. package/AGENTS.md +18 -0
  2. package/CLAUDE.md +92 -1
  3. package/README.md +73 -6
  4. package/bench/inbox-growth.bench.ts +224 -0
  5. package/dist/federation/connection-manager.d.ts +8 -0
  6. package/dist/federation/connection-manager.d.ts.map +1 -1
  7. package/dist/federation/connection-manager.js +12 -0
  8. package/dist/federation/connection-manager.js.map +1 -1
  9. package/dist/federation/delivery-queue.d.ts +11 -3
  10. package/dist/federation/delivery-queue.d.ts.map +1 -1
  11. package/dist/federation/delivery-queue.js +38 -8
  12. package/dist/federation/delivery-queue.js.map +1 -1
  13. package/dist/federation/queue-store.d.ts +42 -0
  14. package/dist/federation/queue-store.d.ts.map +1 -0
  15. package/dist/federation/queue-store.js +87 -0
  16. package/dist/federation/queue-store.js.map +1 -0
  17. package/dist/index.d.mts +2 -0
  18. package/dist/index.d.ts +29 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +124 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +1 -0
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/jsonrpc/mail-push-types.d.ts +9 -0
  25. package/dist/jsonrpc/mail-push-types.d.ts.map +1 -1
  26. package/dist/jsonrpc/mail-push-types.js +1 -0
  27. package/dist/jsonrpc/mail-push-types.js.map +1 -1
  28. package/dist/jsonrpc/mail-server.d.ts +8 -1
  29. package/dist/jsonrpc/mail-server.d.ts.map +1 -1
  30. package/dist/jsonrpc/mail-server.js +42 -1
  31. package/dist/jsonrpc/mail-server.js.map +1 -1
  32. package/dist/mail/address-book.d.ts +43 -0
  33. package/dist/mail/address-book.d.ts.map +1 -0
  34. package/dist/mail/address-book.js +95 -0
  35. package/dist/mail/address-book.js.map +1 -0
  36. package/dist/mail/attachment-store.d.ts +31 -0
  37. package/dist/mail/attachment-store.d.ts.map +1 -0
  38. package/dist/mail/attachment-store.js +74 -0
  39. package/dist/mail/attachment-store.js.map +1 -0
  40. package/dist/mail/email-mapper.d.ts +41 -0
  41. package/dist/mail/email-mapper.d.ts.map +1 -0
  42. package/dist/mail/email-mapper.js +216 -0
  43. package/dist/mail/email-mapper.js.map +1 -0
  44. package/dist/mail/fs-attachment-store.d.ts +38 -0
  45. package/dist/mail/fs-attachment-store.d.ts.map +1 -0
  46. package/dist/mail/fs-attachment-store.js +165 -0
  47. package/dist/mail/fs-attachment-store.js.map +1 -0
  48. package/dist/mail/mail-gateway.d.ts +114 -0
  49. package/dist/mail/mail-gateway.d.ts.map +1 -0
  50. package/dist/mail/mail-gateway.js +402 -0
  51. package/dist/mail/mail-gateway.js.map +1 -0
  52. package/dist/mail/provider-transport.d.ts +138 -0
  53. package/dist/mail/provider-transport.d.ts.map +1 -0
  54. package/dist/mail/provider-transport.js +434 -0
  55. package/dist/mail/provider-transport.js.map +1 -0
  56. package/dist/mail/rate-limiter.d.ts +20 -0
  57. package/dist/mail/rate-limiter.d.ts.map +1 -0
  58. package/dist/mail/rate-limiter.js +56 -0
  59. package/dist/mail/rate-limiter.js.map +1 -0
  60. package/dist/mail/smtp-transport.d.ts +141 -0
  61. package/dist/mail/smtp-transport.d.ts.map +1 -0
  62. package/dist/mail/smtp-transport.js +415 -0
  63. package/dist/mail/smtp-transport.js.map +1 -0
  64. package/dist/mail/types.d.ts +177 -0
  65. package/dist/mail/types.d.ts.map +1 -0
  66. package/dist/mail/types.js +11 -0
  67. package/dist/mail/types.js.map +1 -0
  68. package/dist/push/notifier.d.ts +21 -0
  69. package/dist/push/notifier.d.ts.map +1 -1
  70. package/dist/push/notifier.js +84 -2
  71. package/dist/push/notifier.js.map +1 -1
  72. package/dist/router/destination.d.ts +69 -0
  73. package/dist/router/destination.d.ts.map +1 -0
  74. package/dist/router/destination.js +106 -0
  75. package/dist/router/destination.js.map +1 -0
  76. package/dist/router/message-router.d.ts +15 -0
  77. package/dist/router/message-router.d.ts.map +1 -1
  78. package/dist/router/message-router.js +25 -3
  79. package/dist/router/message-router.js.map +1 -1
  80. package/dist/storage/interface.d.ts +21 -0
  81. package/dist/storage/interface.d.ts.map +1 -1
  82. package/dist/storage/memory.d.ts +12 -0
  83. package/dist/storage/memory.d.ts.map +1 -1
  84. package/dist/storage/memory.js +50 -0
  85. package/dist/storage/memory.js.map +1 -1
  86. package/dist/storage/sqlite.d.ts +14 -0
  87. package/dist/storage/sqlite.d.ts.map +1 -1
  88. package/dist/storage/sqlite.js +79 -1
  89. package/dist/storage/sqlite.js.map +1 -1
  90. package/dist/traceability/traceability.d.ts.map +1 -1
  91. package/dist/traceability/traceability.js +7 -17
  92. package/dist/traceability/traceability.js.map +1 -1
  93. package/dist/types.d.ts +80 -0
  94. package/dist/types.d.ts.map +1 -1
  95. package/docs/DESIGN.md +15 -0
  96. package/docs/MAIL-INTEROP-PLAN.md +660 -0
  97. package/package.json +29 -3
  98. package/renovate.json5 +6 -0
  99. package/rules/agent-inbox.md +1 -0
  100. package/src/federation/connection-manager.ts +12 -0
  101. package/src/federation/delivery-queue.ts +38 -8
  102. package/src/federation/queue-store.ts +124 -0
  103. package/src/index.ts +186 -1
  104. package/src/jsonrpc/mail-push-types.ts +10 -0
  105. package/src/jsonrpc/mail-server.ts +48 -1
  106. package/src/mail/address-book.ts +111 -0
  107. package/src/mail/attachment-store.ts +90 -0
  108. package/src/mail/email-mapper.ts +288 -0
  109. package/src/mail/fs-attachment-store.ts +163 -0
  110. package/src/mail/mail-gateway.ts +505 -0
  111. package/src/mail/provider-transport.ts +577 -0
  112. package/src/mail/rate-limiter.ts +51 -0
  113. package/src/mail/smtp-transport.ts +589 -0
  114. package/src/mail/types.ts +221 -0
  115. package/src/push/notifier.ts +98 -2
  116. package/src/router/destination.ts +140 -0
  117. package/src/router/message-router.ts +41 -4
  118. package/src/storage/interface.ts +22 -0
  119. package/src/storage/memory.ts +59 -0
  120. package/src/storage/sqlite.ts +114 -1
  121. package/src/traceability/traceability.ts +7 -16
  122. package/src/types.ts +74 -0
  123. package/test/federation/delivery-queue-sqlite.test.ts +158 -0
  124. package/test/load.test.ts +288 -0
  125. package/test/mail/address-book.test.ts +111 -0
  126. package/test/mail/attachment-store-contract.test.ts +92 -0
  127. package/test/mail/attachment-store.test.ts +69 -0
  128. package/test/mail/destination.test.ts +115 -0
  129. package/test/mail/dsn-parse.test.ts +239 -0
  130. package/test/mail/email-mapper.test.ts +341 -0
  131. package/test/mail/external-id.test.ts +43 -0
  132. package/test/mail/fs-attachment-store.test.ts +134 -0
  133. package/test/mail/full-flow-e2e.test.ts +200 -0
  134. package/test/mail/mail-gateway.test.ts +419 -0
  135. package/test/mail/mail-transport-contract.test.ts +134 -0
  136. package/test/mail/mock-mail.ts +161 -0
  137. package/test/mail/mock-postmark.ts +66 -0
  138. package/test/mail/provider-transport.test.ts +381 -0
  139. package/test/mail/rate-limiter.test.ts +48 -0
  140. package/test/mail/router-mail-integration.test.ts +138 -0
  141. package/test/mail/smtp-e2e.test.ts +98 -0
  142. package/test/mail/smtp-transport.test.ts +138 -0
  143. package/test/mail-presence.test.ts +149 -0
  144. package/test/mail-push.test.ts +44 -0
  145. package/test/mail-server.test.ts +25 -0
  146. package/test/push-notifier.test.ts +81 -0
  147. package/test/sqlite-storage.test.ts +106 -0
  148. package/test/storage.test.ts +92 -0
  149. package/vitest.bench.config.ts +8 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Mail interop type contract.
3
+ *
4
+ * Defines the `MailTransport` interface and its envelope types — the backend-
5
+ * agnostic contract every mail backend (self-hosted SMTP, managed provider)
6
+ * must satisfy. See docs/MAIL-INTEROP-PLAN.md for the design rationale.
7
+ *
8
+ * Phase 1 lands the types only; no backend, gateway, or router wiring yet.
9
+ */
10
+ /** What a backend can do. The gateway adapts to these instead of assuming. */
11
+ export interface MailCapabilities {
12
+ /**
13
+ * How outbound mail leaves: direct to arbitrary public MX (self-hosted SMTP),
14
+ * via a configured smarthost relay, or via the backend's own API. Informational.
15
+ */
16
+ outbound: "mx" | "relay" | "api";
17
+ /** Backend signs DKIM itself (provider) or we must sign before handing off. */
18
+ signsDkim: boolean;
19
+ /** Backend verifies SPF/DKIM/DMARC on inbound and reports results. */
20
+ verifiesInboundAuth: boolean;
21
+ /** Inbound arrives via a long-lived listener (SMTP) or a push webhook. */
22
+ inbound: "listener" | "webhook" | "none";
23
+ /** Max message size the backend will accept, bytes. */
24
+ maxMessageBytes: number;
25
+ }
26
+ export type MailTransportState = "stopped" | "starting" | "ready" | "degraded" | "stopping";
27
+ export interface MailHealth {
28
+ state: MailTransportState;
29
+ /** Human-readable detail for health endpoints / logs. */
30
+ detail?: string;
31
+ }
32
+ export interface MailAddress {
33
+ /** RFC 5322 addr-spec, e.g. "bob@example.com". */
34
+ address: string;
35
+ /** Optional display name. */
36
+ name?: string;
37
+ }
38
+ export interface MailAttachment {
39
+ filename?: string;
40
+ contentType: string;
41
+ /** Content-ID for inline html parts. */
42
+ contentId?: string;
43
+ /** Opaque handle into an AttachmentStore — the envelope carries a ref, not bytes. */
44
+ contentRef: string;
45
+ sizeBytes: number;
46
+ }
47
+ export interface OutboundMail {
48
+ /** Stable key for idempotent send. Derived from the inbox Message.id. */
49
+ idempotencyKey: string;
50
+ from: MailAddress;
51
+ to: MailAddress[];
52
+ cc?: MailAddress[];
53
+ bcc?: MailAddress[];
54
+ subject?: string;
55
+ /** Rendered bodies. At least one of text/html should be present. */
56
+ text?: string;
57
+ html?: string;
58
+ /** RFC 5322 threading headers, already computed by the mapper. */
59
+ headers: {
60
+ messageId: string;
61
+ inReplyTo?: string;
62
+ references?: string[];
63
+ };
64
+ attachments?: MailAttachment[];
65
+ /** Opaque passthrough for backend-specific knobs (provider tags, etc.). */
66
+ backendHints?: Record<string, unknown>;
67
+ }
68
+ export type MailSendDisposition = "delivered" | "transient" | "permanent";
69
+ /**
70
+ * Result of a send attempt. Backends collapse their native failure modes into
71
+ * these three dispositions so the retry/queue layer needs no backend knowledge.
72
+ */
73
+ export interface MailSendResult {
74
+ disposition: MailSendDisposition;
75
+ /** Provider/SMTP id when delivered, for correlating DSNs/bounces. */
76
+ remoteMessageId?: string;
77
+ /** Numeric SMTP-style code when available (e.g. 250, 451, 550). */
78
+ code?: number;
79
+ /** Human-readable, for logs only — never parsed for control flow. */
80
+ detail?: string;
81
+ /** For transient failures: hint for next attempt (e.g. greylist retry-after). */
82
+ retryAfterMs?: number;
83
+ }
84
+ export interface InboundAuthResults {
85
+ spf: "pass" | "fail" | "softfail" | "neutral" | "none";
86
+ dkim: "pass" | "fail" | "none";
87
+ dmarc: "pass" | "fail" | "none";
88
+ }
89
+ /**
90
+ * Bounce/DSN classification, parsed from RFC 3464 delivery-status reports.
91
+ * Present when an inbound message is a bounce, so the gateway can correlate it
92
+ * to the failed outbound send instead of treating it as a fresh message.
93
+ */
94
+ export interface InboundBounce {
95
+ /** "failed" (permanent), "delayed" (transient), "delivered" (positive DSN). */
96
+ action: "failed" | "delayed" | "delivered";
97
+ /** The address that bounced. */
98
+ recipient: string;
99
+ /** RFC 3463 status code, e.g. "5.1.1". */
100
+ status?: string;
101
+ /** Message-ID of the original outbound mail, when the DSN echoes it. */
102
+ originalMessageId?: string;
103
+ diagnostic?: string;
104
+ }
105
+ export interface InboundMail {
106
+ /** Peer-asserted SMTP envelope (MAIL FROM / RCPT TO), distinct from headers. */
107
+ envelopeFrom: string;
108
+ envelopeTo: string[];
109
+ from: MailAddress;
110
+ to: MailAddress[];
111
+ cc?: MailAddress[];
112
+ subject?: string;
113
+ text?: string;
114
+ html?: string;
115
+ headers: {
116
+ messageId?: string;
117
+ inReplyTo?: string;
118
+ references?: string[];
119
+ /** Everything else, lower-cased keys, for the mapper to mine. */
120
+ raw: Record<string, string | string[]>;
121
+ };
122
+ attachments?: MailAttachment[];
123
+ /** Auth verdict — present iff capabilities.verifiesInboundAuth. */
124
+ authResults?: InboundAuthResults;
125
+ /** Peer IP / hostname, for allow-listing and abuse control. */
126
+ remote?: {
127
+ ip?: string;
128
+ reverseDns?: string;
129
+ };
130
+ /** Set when this inbound mail is a bounce/DSN (see InboundBounce). */
131
+ bounce?: InboundBounce;
132
+ sizeBytes: number;
133
+ receivedAt: string;
134
+ }
135
+ /**
136
+ * Ingress handler. The transport awaits this; resolution means "durably
137
+ * accepted" and only then is the peer MTA / webhook ACKed. A thrown handler
138
+ * means NACK so the sender retries — never a silent drop.
139
+ */
140
+ export type InboundHandler = (mail: InboundMail) => Promise<void>;
141
+ export interface MailTransport {
142
+ readonly capabilities: MailCapabilities;
143
+ readonly state: MailTransportState;
144
+ /**
145
+ * Idempotent. Resolves only when inbound is actually accepting (port bound /
146
+ * webhook registered) so callers don't ACK before we can receive.
147
+ */
148
+ start(): Promise<void>;
149
+ /** Graceful: stop accepting new inbound, finish in-flight, then release. */
150
+ stop(): Promise<void>;
151
+ /**
152
+ * Send one already-rendered outbound message.
153
+ * MUST be idempotent on `envelope.idempotencyKey`.
154
+ * MUST NOT throw for delivery failures — return a classified result instead.
155
+ * MAY throw only for programmer error (e.g. called while stopped).
156
+ */
157
+ send(envelope: OutboundMail): Promise<MailSendResult>;
158
+ /** Register the single ingress handler. See InboundHandler. */
159
+ onReceive(handler: InboundHandler): void;
160
+ /** Liveness for health endpoints and the degraded → ready transition. */
161
+ health(): Promise<MailHealth>;
162
+ }
163
+ /**
164
+ * Swappable attachment byte store. `contentRef` values on MailAttachment are
165
+ * opaque handles produced by `put`. Mirrors the Storage two-impl pattern:
166
+ * SqliteAttachmentStore (default) and FsAttachmentStore (opt-in) land later.
167
+ */
168
+ export interface AttachmentStore {
169
+ /** Returns a content-addressed ref (sha256-based). Dedups identical bytes. */
170
+ put(bytes: Buffer, meta: {
171
+ contentType: string;
172
+ filename?: string;
173
+ }): Promise<string>;
174
+ get(ref: string): Promise<Buffer>;
175
+ delete(ref: string): Promise<void>;
176
+ }
177
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Mail interop type contract.
3
+ *
4
+ * Defines the `MailTransport` interface and its envelope types — the backend-
5
+ * agnostic contract every mail backend (self-hosted SMTP, managed provider)
6
+ * must satisfy. See docs/MAIL-INTEROP-PLAN.md for the design rationale.
7
+ *
8
+ * Phase 1 lands the types only; no backend, gateway, or router wiring yet.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mail/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -17,6 +17,14 @@ export interface NotifierConfig {
17
17
  inboxDir: string;
18
18
  /** Optional webhook URLs to POST new messages to */
19
19
  webhooks?: string[];
20
+ /** Soft cap on entries per per-agent inbox file. The file is allowed to
21
+ * grow ~10% over this before being trimmed back, to amortize trim cost
22
+ * across many appends. Defaults to 1000. Set to 0 to disable. */
23
+ maxEntriesPerInbox?: number;
24
+ /** Soft cap (in bytes) on per-agent inbox file size, with the same ~10%
25
+ * amortization headroom as `maxEntriesPerInbox`. Defaults to 5 MiB. Set
26
+ * to 0 to disable. */
27
+ maxBytesPerInbox?: number;
20
28
  }
21
29
  export interface InboxFileEntry {
22
30
  messageId: string;
@@ -39,10 +47,23 @@ export declare class PushNotifier {
39
47
  private storage;
40
48
  private events;
41
49
  private webhooks;
50
+ private maxEntries;
51
+ private maxBytes;
52
+ /** In-memory tracking so we can decide when to trim without stat/read. */
53
+ private entryCounts;
54
+ private fileSizes;
42
55
  constructor(config: NotifierConfig, storage: Storage, events: EventEmitter);
43
56
  private onMessage;
44
57
  /** Write a message to an agent's inbox file (NDJSON) */
45
58
  private writeAgentInbox;
59
+ /** Update in-memory entry/size counters after an append. Lazy-inits from
60
+ * the file when first seen so caps still apply across process restarts. */
61
+ private bumpCounters;
62
+ /** Trim the file when soft caps (~1.1× the configured limits) are exceeded.
63
+ * This amortizes the cost of read+rewrite across many appends. */
64
+ private maybeEnforceCap;
65
+ /** Trim the file to maxEntries / maxBytes. Returns counts of what's left. */
66
+ private trimFile;
46
67
  /** Read and format an agent's pending inbox as markdown (for hook injection) */
47
68
  readAndClearAgentInbox(agentId: string): string | null;
48
69
  /** Get the path to an agent's inbox file */
@@ -1 +1 @@
1
- {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/push/notifier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,YAAY;IAIrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,QAAQ,CAAW;gBAGjB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY;IAW9B,OAAO,CAAC,SAAS;IAoBjB,wDAAwD;IACxD,OAAO,CAAC,eAAe;IAmBvB,gFAAgF;IAChF,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkCtD,4CAA4C;IAC5C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC,8CAA8C;YAChC,WAAW;CAuB1B;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBlD;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CA0BrE"}
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/push/notifier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;sEAEkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;2BAEuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,YAAY;IASrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IAVhB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,0EAA0E;IAC1E,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAA6B;gBAGpC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY;IAc9B,OAAO,CAAC,SAAS;IAoBjB,wDAAwD;IACxD,OAAO,CAAC,eAAe;IAwBvB;gFAC4E;IAC5E,OAAO,CAAC,YAAY;IAoBpB;uEACmE;IACnE,OAAO,CAAC,eAAe;IAgBvB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ;IA6BhB,gFAAgF;IAChF,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoCtD,4CAA4C;IAC5C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC,8CAA8C;YAChC,WAAW;CAuB1B;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBlD;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CA0BrE"}
@@ -1,15 +1,25 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
+ const DEFAULT_MAX_ENTRIES = 1000;
4
+ const DEFAULT_MAX_BYTES = 5 * 1024 * 1024;
3
5
  export class PushNotifier {
4
6
  config;
5
7
  storage;
6
8
  events;
7
9
  webhooks;
10
+ maxEntries;
11
+ maxBytes;
12
+ /** In-memory tracking so we can decide when to trim without stat/read. */
13
+ entryCounts = new Map();
14
+ fileSizes = new Map();
8
15
  constructor(config, storage, events) {
9
16
  this.config = config;
10
17
  this.storage = storage;
11
18
  this.events = events;
12
19
  this.webhooks = config.webhooks ?? [];
20
+ this.maxEntries =
21
+ config.maxEntriesPerInbox ?? DEFAULT_MAX_ENTRIES;
22
+ this.maxBytes = config.maxBytesPerInbox ?? DEFAULT_MAX_BYTES;
13
23
  // Subscribe to message.created events
14
24
  events.on("message.created", (msg) => this.onMessage(msg));
15
25
  // Ensure inbox directory exists
@@ -45,12 +55,82 @@ export class PushNotifier {
45
55
  importance: message.importance,
46
56
  timestamp: message.created_at,
47
57
  };
58
+ const line = JSON.stringify(entry) + "\n";
48
59
  try {
49
- fs.appendFileSync(filePath, JSON.stringify(entry) + "\n");
60
+ fs.appendFileSync(filePath, line);
50
61
  }
51
62
  catch {
52
- // Best-effort write
63
+ return; // Best-effort write
53
64
  }
65
+ if (this.maxEntries <= 0 && this.maxBytes <= 0)
66
+ return;
67
+ this.bumpCounters(filePath, line.length);
68
+ this.maybeEnforceCap(filePath);
69
+ }
70
+ /** Update in-memory entry/size counters after an append. Lazy-inits from
71
+ * the file when first seen so caps still apply across process restarts. */
72
+ bumpCounters(filePath, addedBytes) {
73
+ let count = this.entryCounts.get(filePath);
74
+ let size = this.fileSizes.get(filePath);
75
+ if (count === undefined || size === undefined) {
76
+ try {
77
+ const raw = fs.readFileSync(filePath, "utf-8");
78
+ count = raw.split("\n").filter((l) => l.length > 0).length;
79
+ size = raw.length;
80
+ }
81
+ catch {
82
+ count = 1;
83
+ size = addedBytes;
84
+ }
85
+ }
86
+ else {
87
+ count++;
88
+ size += addedBytes;
89
+ }
90
+ this.entryCounts.set(filePath, count);
91
+ this.fileSizes.set(filePath, size);
92
+ }
93
+ /** Trim the file when soft caps (~1.1× the configured limits) are exceeded.
94
+ * This amortizes the cost of read+rewrite across many appends. */
95
+ maybeEnforceCap(filePath) {
96
+ const count = this.entryCounts.get(filePath) ?? 0;
97
+ const size = this.fileSizes.get(filePath) ?? 0;
98
+ const overEntries = this.maxEntries > 0 && count > this.maxEntries * 1.1;
99
+ const overBytes = this.maxBytes > 0 && size > this.maxBytes * 1.1;
100
+ if (!overEntries && !overBytes)
101
+ return;
102
+ const result = this.trimFile(filePath);
103
+ this.entryCounts.set(filePath, result.lines);
104
+ this.fileSizes.set(filePath, result.bytes);
105
+ }
106
+ /** Trim the file to maxEntries / maxBytes. Returns counts of what's left. */
107
+ trimFile(filePath) {
108
+ let raw;
109
+ try {
110
+ raw = fs.readFileSync(filePath, "utf-8");
111
+ }
112
+ catch {
113
+ return { lines: 0, bytes: 0 };
114
+ }
115
+ let kept = raw.split("\n").filter((l) => l.length > 0);
116
+ if (this.maxEntries > 0 && kept.length > this.maxEntries) {
117
+ kept = kept.slice(kept.length - this.maxEntries);
118
+ }
119
+ let bytes = kept.reduce((acc, l) => acc + l.length + 1, 0);
120
+ if (this.maxBytes > 0) {
121
+ while (kept.length > 1 && bytes > this.maxBytes) {
122
+ bytes -= kept[0].length + 1;
123
+ kept.shift();
124
+ }
125
+ }
126
+ const out = kept.length ? kept.join("\n") + "\n" : "";
127
+ try {
128
+ fs.writeFileSync(filePath, out);
129
+ }
130
+ catch {
131
+ // Best-effort
132
+ }
133
+ return { lines: kept.length, bytes: out.length };
54
134
  }
55
135
  /** Read and format an agent's pending inbox as markdown (for hook injection) */
56
136
  readAndClearAgentInbox(agentId) {
@@ -81,6 +161,8 @@ export class PushNotifier {
81
161
  // Clear the file
82
162
  try {
83
163
  fs.writeFileSync(filePath, "");
164
+ this.entryCounts.set(filePath, 0);
165
+ this.fileSizes.set(filePath, 0);
84
166
  }
85
167
  catch {
86
168
  // Best-effort clear
@@ -1 +1 @@
1
- {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/push/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AA0ClC,MAAM,OAAO,YAAY;IAIb;IACA;IACA;IALF,QAAQ,CAAW;IAE3B,YACU,MAAsB,EACtB,OAAgB,EAChB,MAAoB;QAFpB,WAAM,GAAN,MAAM,CAAgB;QACtB,YAAO,GAAP,OAAO,CAAS;QAChB,WAAM,GAAN,MAAM,CAAc;QAE5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEtC,sCAAsC;QACtC,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpE,gCAAgC;QAChC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAEO,SAAS,CAAC,OAAgB;QAChC,gEAAgE;QAChE,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAElD,8DAA8D;YAC9D,MAAM,KAAK,GAAsB;gBAC/B,OAAO,EAAE,SAAS,CAAC,QAAQ;gBAC3B,aAAa,EAAE,SAAS,CAAC,IAAI;gBAC7B,OAAO;aACR,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,8BAA8B;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,wDAAwD;IAChD,eAAe,CAAC,OAAe,EAAE,OAAgB;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAmB;YAC5B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO,CAAC,SAAS;YACvB,EAAE,EAAE,OAAO;YACX,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,UAAU;YAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,OAAO,CAAC,UAAU;SAC9B,CAAC;QACF,IAAI,CAAC;YACH,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,sBAAsB,CAAC,OAAe;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,gBAAgB;QAChB,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,iBAAiB;QACjB,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;QAED,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,4CAA4C;IAC5C,cAAc,CAAC,OAAe;QAC5B,uCAAuC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,8CAA8C;IACtC,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,OAAgB;QACrD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,EAAE;gBACf,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE;wBACP,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,IAAI,EAAE,OAAO,CAAC,SAAS;wBACvB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;wBACrD,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,SAAS,EAAE,OAAO,CAAC,UAAU;wBAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,SAAS,EAAE,OAAO,CAAC,UAAU;qBAC9B;iBACF,CAAC;gBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,OAAyB;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,QAAQ,GACZ,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,OAAO,GAAG,QAAQ,QAAQ,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;QAEhF,iBAAiB;QACjB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAkC,CAAC;QACzD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,KAAM,OAA4B,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;IACxD,IAAI,IAAI,GAAG,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5D,IAAI,IAAI,GAAG,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC/D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/push/notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Destination classification.
3
+ *
4
+ * Email addresses are syntactically identical to federation addresses
5
+ * (`bob@example.com` vs `bob@system-2`), so before routing we must classify a
6
+ * recipient as one of: local agent, federation peer, or external mail.
7
+ *
8
+ * Classification is explicit-list driven — nothing is guessed from "looks like
9
+ * a domain". An unknown `@x` is a hard error rather than a silent misroute.
10
+ * Federation peers may declare their own domains, in which case they win over
11
+ * mail config for that domain. See docs/MAIL-INTEROP-PLAN.md §1.
12
+ *
13
+ * This layer sits *above* `parseAddress`, which is left untouched.
14
+ */
15
+ import type { FederatedAddress } from "../types.js";
16
+ export type Destination = {
17
+ class: "local";
18
+ agentId: string;
19
+ } | {
20
+ class: "federation";
21
+ agentId: string;
22
+ address: FederatedAddress;
23
+ } | {
24
+ class: "mail";
25
+ email: string;
26
+ };
27
+ export interface DestinationPeer {
28
+ systemId: string;
29
+ /** Dotted addresses routed to this peer instead of being treated as mail. */
30
+ domains?: string[];
31
+ }
32
+ export interface DestinationContext {
33
+ /** Returns true if `id` is a known local agent. */
34
+ isLocalAgent: (id: string) => boolean;
35
+ /** Configured federation peers (system ids + optionally declared domains). */
36
+ federationPeers: DestinationPeer[];
37
+ /** Mail domains we recognize (identity.localDomains ∪ routableDomains). */
38
+ mailDomains: string[];
39
+ }
40
+ /** Thrown when a recipient matches neither a federation peer nor a mail domain. */
41
+ export declare class UnknownDestinationError extends Error {
42
+ readonly agentId: string;
43
+ constructor(agentId: string);
44
+ }
45
+ /**
46
+ * Classify a recipient address into local / federation / mail.
47
+ *
48
+ * Priority order (deterministic):
49
+ * 1. No `@` → local
50
+ * 2. `@x` matches a peer systemId or domain → federation
51
+ * 3. `@x` (or parent domain) in mailDomains → mail
52
+ * 4. otherwise → throw UnknownDestinationError
53
+ *
54
+ * @throws UnknownDestinationError for rule-4 misses.
55
+ */
56
+ export declare function classifyDestination(agentId: string, ctx: DestinationContext): Destination;
57
+ /**
58
+ * True if `domain` equals, or is a subdomain of, any entry in `candidates`.
59
+ * Matching is case-insensitive. `mail.example.com` matches a candidate of
60
+ * `example.com`; `notexample.com` does not match `example.com`.
61
+ */
62
+ export declare function domainMatches(domain: string, candidates: string[] | undefined): boolean;
63
+ /**
64
+ * Detect domains claimed by both a federation peer and mail config. Federation
65
+ * wins (see classifyDestination), but callers should surface this at startup
66
+ * via a `mail.config.conflict` warning. Returns the conflicting domains.
67
+ */
68
+ export declare function findDomainConflicts(ctx: DestinationContext): string[];
69
+ //# sourceMappingURL=destination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACnE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,8EAA8E;IAC9E,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,2EAA2E;IAC3E,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,mFAAmF;AACnF,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAO5C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,kBAAkB,GACtB,WAAW,CA+Bb;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,GAC/B,OAAO,CAQT;AAaD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CASrE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Destination classification.
3
+ *
4
+ * Email addresses are syntactically identical to federation addresses
5
+ * (`bob@example.com` vs `bob@system-2`), so before routing we must classify a
6
+ * recipient as one of: local agent, federation peer, or external mail.
7
+ *
8
+ * Classification is explicit-list driven — nothing is guessed from "looks like
9
+ * a domain". An unknown `@x` is a hard error rather than a silent misroute.
10
+ * Federation peers may declare their own domains, in which case they win over
11
+ * mail config for that domain. See docs/MAIL-INTEROP-PLAN.md §1.
12
+ *
13
+ * This layer sits *above* `parseAddress`, which is left untouched.
14
+ */
15
+ import { parseAddress } from "../federation/address.js";
16
+ /** Thrown when a recipient matches neither a federation peer nor a mail domain. */
17
+ export class UnknownDestinationError extends Error {
18
+ agentId;
19
+ constructor(agentId) {
20
+ super(`Cannot classify destination "${agentId}": its domain is not a configured ` +
21
+ `federation peer or mail domain. Declare it explicitly to route it.`);
22
+ this.agentId = agentId;
23
+ this.name = "UnknownDestinationError";
24
+ }
25
+ }
26
+ /**
27
+ * Classify a recipient address into local / federation / mail.
28
+ *
29
+ * Priority order (deterministic):
30
+ * 1. No `@` → local
31
+ * 2. `@x` matches a peer systemId or domain → federation
32
+ * 3. `@x` (or parent domain) in mailDomains → mail
33
+ * 4. otherwise → throw UnknownDestinationError
34
+ *
35
+ * @throws UnknownDestinationError for rule-4 misses.
36
+ */
37
+ export function classifyDestination(agentId, ctx) {
38
+ const atIdx = agentId.indexOf("@");
39
+ // Rule 1: no @ — local agent (no domain to disambiguate).
40
+ if (atIdx === -1) {
41
+ return { class: "local", agentId };
42
+ }
43
+ const addr = parseAddress(agentId);
44
+ const system = addr.system; // the part after @ (before any /scope)
45
+ // Defensive: parseAddress yielded no system (e.g. trailing-only @) — treat
46
+ // the whole string as a local agent id rather than guessing a domain.
47
+ if (!system) {
48
+ return { class: "local", agentId };
49
+ }
50
+ // Rule 2: federation peer by systemId or declared domain (wins over mail).
51
+ for (const peer of ctx.federationPeers) {
52
+ if (peer.systemId === system || domainMatches(system, peer.domains)) {
53
+ return { class: "federation", agentId, address: addr };
54
+ }
55
+ }
56
+ // Rule 3: configured mail domain (exact or parent-domain suffix match).
57
+ if (domainMatches(system, ctx.mailDomains)) {
58
+ return { class: "mail", email: stripScope(agentId) };
59
+ }
60
+ // Rule 4: explicit-list miss — never guess.
61
+ throw new UnknownDestinationError(agentId);
62
+ }
63
+ /**
64
+ * True if `domain` equals, or is a subdomain of, any entry in `candidates`.
65
+ * Matching is case-insensitive. `mail.example.com` matches a candidate of
66
+ * `example.com`; `notexample.com` does not match `example.com`.
67
+ */
68
+ export function domainMatches(domain, candidates) {
69
+ if (!candidates || candidates.length === 0)
70
+ return false;
71
+ const d = domain.toLowerCase();
72
+ for (const c of candidates) {
73
+ const cand = c.toLowerCase();
74
+ if (d === cand || d.endsWith(`.${cand}`))
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ /**
80
+ * Drop a trailing `/scope` qualifier from an address, leaving a bare email.
81
+ * `bob@example.com/work` → `bob@example.com`.
82
+ */
83
+ function stripScope(agentId) {
84
+ const atIdx = agentId.indexOf("@");
85
+ if (atIdx === -1)
86
+ return agentId;
87
+ const slashIdx = agentId.indexOf("/", atIdx);
88
+ return slashIdx === -1 ? agentId : agentId.slice(0, slashIdx);
89
+ }
90
+ /**
91
+ * Detect domains claimed by both a federation peer and mail config. Federation
92
+ * wins (see classifyDestination), but callers should surface this at startup
93
+ * via a `mail.config.conflict` warning. Returns the conflicting domains.
94
+ */
95
+ export function findDomainConflicts(ctx) {
96
+ const mail = new Set(ctx.mailDomains.map((d) => d.toLowerCase()));
97
+ const conflicts = [];
98
+ for (const peer of ctx.federationPeers) {
99
+ for (const dom of peer.domains ?? []) {
100
+ if (mail.has(dom.toLowerCase()))
101
+ conflicts.push(dom);
102
+ }
103
+ }
104
+ return conflicts;
105
+ }
106
+ //# sourceMappingURL=destination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination.js","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,16 @@ import { EventEmitter } from "node:events";
2
2
  import type { Message, MessageContent, Recipient, RecipientKind, Importance } from "../types.js";
3
3
  import type { Storage } from "../storage/interface.js";
4
4
  import type { ConnectionManager } from "../federation/connection-manager.js";
5
+ /**
6
+ * Outbound mail sink. Implemented by MailGateway; kept as a local interface so
7
+ * the router does not depend on the mail module (avoids a cycle).
8
+ */
9
+ export interface MailEgress {
10
+ /** True if this recipient's domain is one the mail gateway routes for. */
11
+ ownsRecipient(agentId: string): boolean;
12
+ /** Render and deliver the mail-class recipients of a message. */
13
+ send(message: Message): Promise<void>;
14
+ }
5
15
  export interface SendOptions {
6
16
  from: string;
7
17
  to: string | string[] | {
@@ -22,11 +32,16 @@ export declare class MessageRouter {
22
32
  private events;
23
33
  private defaultScope;
24
34
  private federation;
35
+ private mail;
25
36
  constructor(storage: Storage, events: EventEmitter, defaultScope?: string);
26
37
  /**
27
38
  * Attach a federation connection manager for cross-system routing.
28
39
  */
29
40
  setFederation(federation: ConnectionManager): void;
41
+ /**
42
+ * Attach a mail gateway for routing to external email recipients.
43
+ */
44
+ setMail(mail: MailEgress): void;
30
45
  routeMessage(opts: SendOptions): Promise<Message>;
31
46
  markRead(messageId: string, agentId: string): boolean;
32
47
  markAcknowledged(messageId: string, agentId: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/router/message-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAG7E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,aAAa;IAItB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,UAAU,CAAkC;gBAG1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAkB;IAG1C;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAI5C,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAmEvD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAUrD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAU7D,iBAAiB,CACf,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,GACnE,SAAS,EAAE;IAed,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjC;;OAEG;IACH,aAAa,IAAI,iBAAiB,GAAG,IAAI;CAG1C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAajE"}
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/router/message-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAG7E;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,iEAAiE;IACjE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,aAAa;IAKtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IANtB,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,IAAI,CAA2B;gBAG7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAkB;IAG1C;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIzB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAqFvD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAUrD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAU7D,iBAAiB,CACf,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,GACnE,SAAS,EAAE;IAed,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjC;;OAEG;IACH,aAAa,IAAI,iBAAiB,GAAG,IAAI;CAG1C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAajE"}