agents 0.22.0 → 0.23.0

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 (186) hide show
  1. package/README.md +20 -1
  2. package/dist/{agent-routing-CnkaHb-v.d.ts → agent-routing-DE5zmCQ8.d.ts} +1038 -394
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +26 -26
  5. package/dist/{agent-tools-C0XJqWzB.d.ts → agent-tools-DtXMTDGM.d.ts} +7 -7
  6. package/dist/agent-tools.d.ts +21 -21
  7. package/dist/browser/ai.js +4 -1
  8. package/dist/browser/ai.js.map +1 -1
  9. package/dist/browser/tanstack-ai.js.map +1 -1
  10. package/dist/callable-decorator-DP__HhBA.d.ts +72 -0
  11. package/dist/callable-decorator.d.ts +18 -0
  12. package/dist/callable-decorator.js +71 -0
  13. package/dist/callable-decorator.js.map +1 -0
  14. package/dist/capability-BjSKYpzg.js.map +1 -1
  15. package/dist/capability-runner-Be_-PLR1.d.ts +459 -0
  16. package/dist/channel-Bnm4S7T2.d.ts +491 -0
  17. package/dist/channels/ai-sdk.d.ts +46 -0
  18. package/dist/channels/ai-sdk.js +120 -0
  19. package/dist/channels/ai-sdk.js.map +1 -0
  20. package/dist/channels/email.d.ts +95 -0
  21. package/dist/channels/email.js +323 -0
  22. package/dist/channels/email.js.map +1 -0
  23. package/dist/channels/index.d.ts +233 -0
  24. package/dist/channels/index.js +608 -0
  25. package/dist/channels/index.js.map +1 -0
  26. package/dist/channels/slack.d.ts +140 -0
  27. package/dist/channels/slack.js +614 -0
  28. package/dist/channels/slack.js.map +1 -0
  29. package/dist/channels/tanstack-ai.d.ts +39 -0
  30. package/dist/channels/tanstack-ai.js +17 -0
  31. package/dist/channels/tanstack-ai.js.map +1 -0
  32. package/dist/channels/telegram.d.ts +106 -0
  33. package/dist/channels/telegram.js +427 -0
  34. package/dist/channels/telegram.js.map +1 -0
  35. package/dist/channels/voice.d.ts +45 -0
  36. package/dist/channels/voice.js +122 -0
  37. package/dist/channels/voice.js.map +1 -0
  38. package/dist/chat/index.d.ts +2325 -2019
  39. package/dist/chat/index.js +888 -518
  40. package/dist/chat/index.js.map +1 -1
  41. package/dist/chat-sdk/index.d.ts +7 -7
  42. package/dist/chat-sdk/index.js +1 -1
  43. package/dist/client.d.ts +1 -1
  44. package/dist/context/index.d.ts +216 -0
  45. package/dist/context/index.js +454 -0
  46. package/dist/context/index.js.map +1 -0
  47. package/dist/{current-agent-CuMErtly.d.ts → current-agent-Da_C9a3b.d.ts} +90 -107
  48. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  49. package/dist/{diagnostics-CaBjfz4J.js → diagnostics-BzvaX2UT.js} +5 -1
  50. package/dist/diagnostics-BzvaX2UT.js.map +1 -0
  51. package/dist/diagnostics-C4jcz3VK.js +360 -0
  52. package/dist/diagnostics-C4jcz3VK.js.map +1 -0
  53. package/dist/index-BB0kqhIz.d.ts +101 -0
  54. package/dist/index-BVVgDSdq.d.ts +1 -0
  55. package/dist/index-XDkuQ7zm.d.ts +89 -0
  56. package/dist/{index-DcSAZKsB.d.ts → index-YSKgfgg9.d.ts} +3 -1
  57. package/dist/index.d.ts +91 -82
  58. package/dist/index.js +3 -2
  59. package/dist/ingress-BfetZbMO.js +83 -0
  60. package/dist/ingress-BfetZbMO.js.map +1 -0
  61. package/dist/internal-CYlgHl1l.js +59 -0
  62. package/dist/internal-CYlgHl1l.js.map +1 -0
  63. package/dist/internal_context.d.ts +1 -1
  64. package/dist/lifecycle/index.d.ts +35 -17
  65. package/dist/lifecycle/index.js +1 -1
  66. package/dist/lifecycle-CMRGjZdw.js +1299 -0
  67. package/dist/lifecycle-CMRGjZdw.js.map +1 -0
  68. package/dist/mcp/client/index.d.ts +20 -20
  69. package/dist/mcp/index.d.ts +35 -35
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/observability/index.d.ts +1 -1
  72. package/dist/observability/index.js +1 -1
  73. package/dist/react.d.ts +4 -4
  74. package/dist/{retries-CAvxtG9d.d.ts → retries-D9Ds-1lz.d.ts} +17 -6
  75. package/dist/retries.d.ts +8 -6
  76. package/dist/retries.js +13 -1
  77. package/dist/retries.js.map +1 -1
  78. package/dist/routing/index.d.ts +137 -0
  79. package/dist/routing/index.js +244 -0
  80. package/dist/routing/index.js.map +1 -0
  81. package/dist/sanitize-D9TujEK8.js +79 -0
  82. package/dist/sanitize-D9TujEK8.js.map +1 -0
  83. package/dist/scheduler-DD9NdYbF.js +665 -0
  84. package/dist/scheduler-DD9NdYbF.js.map +1 -0
  85. package/dist/{scheduler-DQoTGoAW.d.ts → scheduler-Dwh85ZGl.d.ts} +21 -22
  86. package/dist/schedules/index.d.ts +1 -1
  87. package/dist/schedules/index.js +1 -1
  88. package/dist/sentence-chunker-BAidJ4DA.d.ts +68 -0
  89. package/dist/serializable.d.ts +1 -1
  90. package/dist/sessions/index.d.ts +441 -0
  91. package/dist/sessions/index.js +2063 -0
  92. package/dist/sessions/index.js.map +1 -0
  93. package/dist/skills/index.d.ts +99 -0
  94. package/dist/skills/index.js +254 -5
  95. package/dist/skills/index.js.map +1 -1
  96. package/dist/{src-5W6JNKVb.js → src-DlSHshb2.js} +1460 -1110
  97. package/dist/src-DlSHshb2.js.map +1 -0
  98. package/dist/streams/index.d.ts +120 -0
  99. package/dist/streams/index.js +107 -0
  100. package/dist/streams/index.js.map +1 -0
  101. package/dist/streams-D6tJ0NN9.d.ts +370 -0
  102. package/dist/streams-DZKgAj9b.js +709 -0
  103. package/dist/streams-DZKgAj9b.js.map +1 -0
  104. package/dist/sub-routing.d.ts +12 -12
  105. package/dist/surface-bZZJqBka.js +17 -0
  106. package/dist/surface-bZZJqBka.js.map +1 -0
  107. package/dist/tasks/index.d.ts +64 -0
  108. package/dist/tasks/index.js +2 -0
  109. package/dist/tasks-BRJ5zgya.d.ts +517 -0
  110. package/dist/tasks-ylZgBjhj.js +1656 -0
  111. package/dist/tasks-ylZgBjhj.js.map +1 -0
  112. package/dist/text-segment-joiner-BtAFQSA_.js +57 -0
  113. package/dist/text-segment-joiner-BtAFQSA_.js.map +1 -0
  114. package/dist/text-stream-CpdiKrJB.js +272 -0
  115. package/dist/text-stream-CpdiKrJB.js.map +1 -0
  116. package/dist/tokens-nHAKcN6M.js +52 -0
  117. package/dist/tokens-nHAKcN6M.js.map +1 -0
  118. package/dist/tool-schema-CBjGPrsQ.js +31 -0
  119. package/dist/tool-schema-CBjGPrsQ.js.map +1 -0
  120. package/dist/types-B7LojTe4.d.ts +202 -0
  121. package/dist/types-_Faxb570.d.ts +439 -0
  122. package/dist/voice/client.d.ts +226 -0
  123. package/dist/voice/client.js +932 -0
  124. package/dist/voice/client.js.map +1 -0
  125. package/dist/voice/errors.d.ts +43 -0
  126. package/dist/voice/errors.js +41 -0
  127. package/dist/voice/errors.js.map +1 -0
  128. package/dist/voice/index.d.ts +271 -0
  129. package/dist/voice/index.js +1812 -0
  130. package/dist/voice/index.js.map +1 -0
  131. package/dist/voice/react.d.ts +167 -0
  132. package/dist/voice/react.js +234 -0
  133. package/dist/voice/react.js.map +1 -0
  134. package/dist/voice/sfu.d.ts +71 -0
  135. package/dist/voice/sfu.js +157 -0
  136. package/dist/voice/sfu.js.map +1 -0
  137. package/dist/voice/text.d.ts +6 -0
  138. package/dist/voice/text.js +2 -0
  139. package/dist/voice/types.d.ts +58 -0
  140. package/dist/voice/types.js +18 -0
  141. package/dist/voice/types.js.map +1 -0
  142. package/dist/voice/workers-ai.d.ts +136 -0
  143. package/dist/voice/workers-ai.js +568 -0
  144. package/dist/voice/workers-ai.js.map +1 -0
  145. package/dist/websockets/index.d.ts +192 -0
  146. package/dist/websockets/index.js +2 -0
  147. package/dist/websockets-DUfRHPRq.js +502 -0
  148. package/dist/websockets-DUfRHPRq.js.map +1 -0
  149. package/dist/workflow-types.d.ts +25 -25
  150. package/dist/workflows.d.ts +21 -21
  151. package/dist/workflows.js +1 -1
  152. package/docs/agent-class.md +2 -2
  153. package/docs/agent-tools.md +2 -1
  154. package/docs/channels.md +323 -0
  155. package/docs/chat-agents.md +6 -13
  156. package/docs/context.md +131 -0
  157. package/docs/index.md +15 -12
  158. package/docs/lifecycle.md +102 -55
  159. package/docs/long-running-agents.md +2 -2
  160. package/docs/mcp-servers.md +5 -1
  161. package/docs/resumable-streaming.md +1 -1
  162. package/docs/routing.md +105 -0
  163. package/docs/sessions.md +237 -871
  164. package/docs/streams.md +213 -0
  165. package/docs/sub-agents.md +184 -124
  166. package/docs/tasks.md +246 -0
  167. package/docs/voice.md +745 -0
  168. package/package.json +115 -13
  169. package/dist/capability-runner-CvHGZqUu.d.ts +0 -150
  170. package/dist/compaction-helpers-iiKMr2TQ.js +0 -340
  171. package/dist/compaction-helpers-iiKMr2TQ.js.map +0 -1
  172. package/dist/compaction-helpers-wUz6M3us.d.ts +0 -621
  173. package/dist/diagnostics-CaBjfz4J.js.map +0 -1
  174. package/dist/durable-object-lifecycle-D6nNQJJd.js +0 -862
  175. package/dist/durable-object-lifecycle-D6nNQJJd.js.map +0 -1
  176. package/dist/experimental/memory/session/index.d.ts +0 -671
  177. package/dist/experimental/memory/session/index.js +0 -2379
  178. package/dist/experimental/memory/session/index.js.map +0 -1
  179. package/dist/experimental/memory/utils/index.d.ts +0 -96
  180. package/dist/experimental/memory/utils/index.js +0 -79
  181. package/dist/experimental/memory/utils/index.js.map +0 -1
  182. package/dist/scheduler-CR9RHGos.js +0 -857
  183. package/dist/scheduler-CR9RHGos.js.map +0 -1
  184. package/dist/src-5W6JNKVb.js.map +0 -1
  185. package/dist/tool-output-truncation-CNnnGZQ3.js +0 -98
  186. package/dist/tool-output-truncation-CNnnGZQ3.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ import {
2
+ F as ChannelMessageSurface,
3
+ I as ChannelMessageSurfaceInput,
4
+ S as ChannelEmailIngress,
5
+ d as ChannelRoute,
6
+ n as Channel
7
+ } from "../channel-Bnm4S7T2.js";
8
+ import { Email } from "postal-mime";
9
+
10
+ //#region src/channels/adapters/email/email-surface.d.ts
11
+ type EmailSurfaceAddress =
12
+ | string
13
+ | {
14
+ email: string;
15
+ name: string;
16
+ };
17
+ type EmailSurfaceRecipients =
18
+ | EmailSurfaceAddress
19
+ | readonly EmailSurfaceAddress[];
20
+ type EmailMessageAddress = {
21
+ from: EmailSurfaceAddress;
22
+ to: EmailSurfaceRecipients;
23
+ replyTo?: EmailSurfaceAddress;
24
+ cc?: EmailSurfaceRecipients;
25
+ bcc?: EmailSurfaceRecipients;
26
+ headers?: Readonly<Record<string, string>>;
27
+ subject?: string;
28
+ inReplyTo?: string;
29
+ references?: readonly string[];
30
+ };
31
+ type EmailMessageSurface = ChannelMessageSurface<string, EmailMessageAddress>;
32
+ type EmailMessageSurfaceInput = ChannelMessageSurfaceInput<EmailMessageAddress>;
33
+ //#endregion
34
+ //#region src/channels/adapters/email/inbound-email.d.ts
35
+ /** Parsed, provider-specific email retained while selecting an application route. */
36
+ type InboundEmailRaw = Email;
37
+ type InboundEmailOptions = {
38
+ /** Only accept messages delivered to this address. */ to?: string /** Only accept these envelope senders. */;
39
+ from?:
40
+ | string
41
+ | readonly string[] /** Outbound sender to retain in normalized reply surfaces. */;
42
+ replyFrom?: EmailSurfaceAddress;
43
+ };
44
+ /** Parse Workers Email events into normalized Channel ingress events. */
45
+ declare function inboundEmail(
46
+ options?: InboundEmailOptions
47
+ ): ChannelEmailIngress<InboundEmailRaw>;
48
+ //#endregion
49
+ //#region src/channels/adapters/email/email.d.ts
50
+ type EmailAddress = EmailSurfaceAddress;
51
+ type EmailRecipients = EmailSurfaceRecipients;
52
+ type ChannelEmailMessage = {
53
+ from: EmailAddress;
54
+ to: EmailAddress | EmailAddress[];
55
+ subject: string;
56
+ text: string;
57
+ replyTo?: EmailAddress;
58
+ cc?: EmailAddress | EmailAddress[];
59
+ bcc?: EmailAddress | EmailAddress[];
60
+ headers?: Record<string, string>;
61
+ };
62
+ /** The structural subset of a Cloudflare Email Service binding used here. */
63
+ interface EmailSendBinding {
64
+ send(message: ChannelEmailMessage): Promise<{
65
+ messageId: string;
66
+ }>;
67
+ }
68
+ /** Configuration for an email Channel. */
69
+ type EmailChannelOptions = {
70
+ binding: EmailSendBinding;
71
+ from: EmailAddress /** Subject used when a message does not provide a title. */;
72
+ defaultTitle?: string /** Select an application route from the event, parsed email, and Host context. */;
73
+ route?: ChannelRoute<InboundEmailRaw> /** Override inferred Workers Email ingress addresses. */;
74
+ inbound?: InboundEmailOptions;
75
+ };
76
+ /** Create a configured email Channel. */
77
+ declare function email(options: EmailChannelOptions): Channel<InboundEmailRaw>;
78
+ //#endregion
79
+ export {
80
+ ChannelEmailMessage,
81
+ EmailAddress,
82
+ EmailChannelOptions,
83
+ EmailMessageAddress,
84
+ EmailMessageSurface,
85
+ EmailMessageSurfaceInput,
86
+ EmailRecipients,
87
+ EmailSendBinding,
88
+ EmailSurfaceAddress,
89
+ EmailSurfaceRecipients,
90
+ InboundEmailOptions,
91
+ InboundEmailRaw,
92
+ email,
93
+ inboundEmail
94
+ };
95
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1,323 @@
1
+ import { l as utf8ByteLength, o as renderInput } from "../internal-CYlgHl1l.js";
2
+ import PostalMime from "postal-mime";
3
+ //#region src/channels/adapters/email/inbound-email.ts
4
+ const EMAIL_HEADER_VALUE_LIMIT$1 = 2048;
5
+ function normalizeReference(value) {
6
+ return value?.trim().replace(/^<|>$/g, "") || void 0;
7
+ }
8
+ function emailReferences(value) {
9
+ return (value?.match(/<([^<>]+)>/g) ?? value?.trim().split(/\s+/) ?? []).flatMap((reference) => {
10
+ const normalized = normalizeReference(reference);
11
+ return normalized ? [normalized] : [];
12
+ });
13
+ }
14
+ function firstReference(value) {
15
+ return emailReferences(value)[0];
16
+ }
17
+ function boundedReferences(references) {
18
+ const unique = [...new Set(references.filter(Boolean))];
19
+ if (unique.length < 2) return unique;
20
+ const selected = [unique[0]];
21
+ for (let index = unique.length - 1; index > 0; index -= 1) {
22
+ const candidate = unique[index];
23
+ if (utf8ByteLength([...selected, candidate].map((reference) => `<${reference}>`).join(" ")) <= EMAIL_HEADER_VALUE_LIMIT$1) selected.splice(1, 0, candidate);
24
+ }
25
+ return selected;
26
+ }
27
+ function isAutoReply(headers) {
28
+ return headers.some((header) => {
29
+ const key = header.key.toLowerCase();
30
+ const value = header.value.trim().toLowerCase();
31
+ if (key === "auto-submitted") return value !== "no";
32
+ if (key === "x-auto-response-suppress") return true;
33
+ return key === "precedence" && (value === "bulk" || value === "junk" || value === "list");
34
+ });
35
+ }
36
+ function attachmentSize(content) {
37
+ return typeof content === "string" ? utf8ByteLength(content) : content.byteLength;
38
+ }
39
+ function normalizedAttachment(attachment) {
40
+ return {
41
+ ...normalizeReference(attachment.contentId) && { id: normalizeReference(attachment.contentId) },
42
+ mediaType: attachment.mimeType,
43
+ ...attachment.filename && { name: attachment.filename },
44
+ size: attachmentSize(attachment.content),
45
+ ...typeof attachment.content === "string" && attachment.mimeType.startsWith("text/") && { text: attachment.content }
46
+ };
47
+ }
48
+ function replyRecipients(replyTo) {
49
+ const recipients = (replyTo ?? []).flatMap((entry) => entry.address ? [{
50
+ email: entry.address,
51
+ name: entry.name
52
+ }] : (entry.group ?? []).map((mailbox) => ({
53
+ email: mailbox.address,
54
+ name: mailbox.name
55
+ })));
56
+ return recipients.length > 0 ? recipients : void 0;
57
+ }
58
+ function recipientLabel(recipients) {
59
+ return (Array.isArray(recipients) ? recipients : [recipients]).map((recipient) => typeof recipient === "string" ? recipient : recipient.name ? `${recipient.name} <${recipient.email}>` : recipient.email).join(", ");
60
+ }
61
+ function normalizedDate(value) {
62
+ if (!value) return void 0;
63
+ const timestamp = Date.parse(value);
64
+ return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : void 0;
65
+ }
66
+ async function rawEmail(email) {
67
+ if (email.getRaw) return email.getRaw();
68
+ if (email.raw) return new Uint8Array(await new Response(email.raw).arrayBuffer());
69
+ throw new Error("Inbound email must provide raw or getRaw()");
70
+ }
71
+ async function contentReference(content) {
72
+ const bytes = new Uint8Array(content.byteLength);
73
+ bytes.set(content);
74
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
75
+ return `sha256:${Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
76
+ }
77
+ /** Parse Workers Email events into normalized Channel ingress events. */
78
+ function inboundEmail(options = {}) {
79
+ const recipient = options.to?.toLowerCase();
80
+ const senders = new Set((typeof options.from === "string" ? [options.from] : options.from ?? []).map((sender) => sender.toLowerCase()));
81
+ return { async receive(email) {
82
+ if (!((!recipient || email.to.toLowerCase() === recipient) && (senders.size === 0 || senders.has(email.from.toLowerCase())))) return null;
83
+ const content = await rawEmail(email);
84
+ const parsed = await PostalMime.parse(content);
85
+ const text = parsed.text?.trim() ?? "";
86
+ const reference = normalizeReference(parsed.messageId) ?? await contentReference(content);
87
+ const replyReference = normalizeReference(parsed.inReplyTo);
88
+ const threadRoot = firstReference(parsed.references) ?? replyReference ?? reference;
89
+ const senderAddress = parsed.from?.address ?? email.from;
90
+ const sentAt = normalizedDate(parsed.date);
91
+ const references = boundedReferences([...emailReferences(parsed.references), reference]);
92
+ const replyTo = replyRecipients(parsed.replyTo) ?? senderAddress;
93
+ const replySurface = {
94
+ version: 1,
95
+ address: {
96
+ from: options.replyFrom ?? email.to,
97
+ to: replyTo,
98
+ ...parsed.subject && { subject: parsed.subject },
99
+ inReplyTo: reference,
100
+ references: [...new Set(references)]
101
+ },
102
+ label: `Email · ${recipientLabel(replyTo)}`
103
+ };
104
+ return { events: [{
105
+ event: {
106
+ type: "message",
107
+ eventId: reference,
108
+ thread: {
109
+ id: threadRoot,
110
+ isDirectMessage: "unknown"
111
+ },
112
+ replySurface,
113
+ actor: {
114
+ id: senderAddress,
115
+ identity: { subject: senderAddress.toLowerCase() },
116
+ ...parsed.from?.name && { fullName: parsed.from.name }
117
+ },
118
+ message: {
119
+ id: reference,
120
+ text,
121
+ ...parsed.subject && { title: parsed.subject },
122
+ attachments: parsed.attachments.map(normalizedAttachment),
123
+ ...replyReference && { reply: { id: replyReference } },
124
+ metadata: {
125
+ ...sentAt && { sentAt },
126
+ autoReply: isAutoReply(parsed.headers)
127
+ }
128
+ }
129
+ },
130
+ raw: parsed
131
+ }] };
132
+ } };
133
+ }
134
+ //#endregion
135
+ //#region src/channels/adapters/email/email.ts
136
+ const DEFAULT_EMAIL_TITLE = "Agent message";
137
+ const EMAIL_HEADER_VALUE_LIMIT = 2048;
138
+ function approvalLinksUnavailable(retryable = false) {
139
+ return {
140
+ status: "failed",
141
+ retryable,
142
+ error: {
143
+ code: "APPROVAL_LINKS_UNAVAILABLE",
144
+ message: "Email approval requests require caller-supplied approval links"
145
+ }
146
+ };
147
+ }
148
+ const PERMANENT_EMAIL_ERRORS = /* @__PURE__ */ new Set([
149
+ "E_VALIDATION_ERROR",
150
+ "E_FIELD_MISSING",
151
+ "E_TOO_MANY_RECIPIENTS",
152
+ "E_TOO_MANY_ATTACHMENTS",
153
+ "E_SENDER_NOT_VERIFIED",
154
+ "E_RECIPIENT_NOT_ALLOWED",
155
+ "E_RECIPIENT_SUPPRESSED",
156
+ "E_SENDER_DOMAIN_NOT_AVAILABLE",
157
+ "E_CONTENT_TOO_LARGE",
158
+ "E_DELIVERY_FAILED",
159
+ "E_HEADER_NOT_ALLOWED",
160
+ "E_HEADER_USE_API_FIELD",
161
+ "E_HEADER_VALUE_INVALID",
162
+ "E_HEADER_VALUE_TOO_LONG",
163
+ "E_HEADER_NAME_INVALID",
164
+ "E_HEADERS_TOO_LARGE",
165
+ "E_HEADERS_TOO_MANY"
166
+ ]);
167
+ const RETRYABLE_EMAIL_ERRORS = /* @__PURE__ */ new Set(["E_RATE_LIMIT_EXCEEDED", "E_DAILY_LIMIT_EXCEEDED"]);
168
+ const EMAIL_ERROR_MESSAGES = /* @__PURE__ */ new Map([["Email must have at least one recipient in \"to\", \"cc\", or \"bcc\".", "E_FIELD_MISSING"]]);
169
+ function emailFailure(error) {
170
+ if (error !== null && typeof error === "object") {
171
+ const value = error;
172
+ return {
173
+ code: typeof value.code === "string" ? value.code : "EMAIL_DELIVERY_ERROR",
174
+ message: typeof value.message === "string" ? value.message : "Email delivery failed"
175
+ };
176
+ }
177
+ return {
178
+ code: "EMAIL_DELIVERY_ERROR",
179
+ message: typeof error === "string" ? error : "Email delivery failed"
180
+ };
181
+ }
182
+ /** Classify an Email Service binding error as a model-visible result. */
183
+ function classifyEmailDeliveryError(error) {
184
+ const failure = emailFailure(error);
185
+ const inferredCode = EMAIL_ERROR_MESSAGES.get(failure.message);
186
+ if (inferredCode) return {
187
+ status: "failed",
188
+ retryable: false,
189
+ error: {
190
+ ...failure,
191
+ code: inferredCode
192
+ }
193
+ };
194
+ if (RETRYABLE_EMAIL_ERRORS.has(failure.code)) return {
195
+ status: "failed",
196
+ retryable: true,
197
+ error: failure
198
+ };
199
+ if (PERMANENT_EMAIL_ERRORS.has(failure.code)) return {
200
+ status: "failed",
201
+ retryable: false,
202
+ error: failure
203
+ };
204
+ return {
205
+ status: "uncertain",
206
+ error: failure
207
+ };
208
+ }
209
+ function emailSurface(surface) {
210
+ return surface;
211
+ }
212
+ function mutableRecipients(value) {
213
+ return Array.isArray(value) ? [...value] : value;
214
+ }
215
+ function replySubject(subject) {
216
+ if (!subject) return void 0;
217
+ return /^re:/i.test(subject) ? subject : `Re: ${subject}`;
218
+ }
219
+ function referenceHeader(references) {
220
+ const unique = [...new Set(references.filter(Boolean))];
221
+ if (unique.length === 0) return void 0;
222
+ const root = `<${unique[0]}>`;
223
+ if (utf8ByteLength(root) > EMAIL_HEADER_VALUE_LIMIT) return void 0;
224
+ const selected = [root];
225
+ for (let index = unique.length - 1; index > 0; index -= 1) {
226
+ const candidate = `<${unique[index]}>`;
227
+ if (utf8ByteLength([...selected, candidate].join(" ")) <= EMAIL_HEADER_VALUE_LIMIT) selected.splice(1, 0, candidate);
228
+ }
229
+ return selected.join(" ");
230
+ }
231
+ /** Create a configured email Channel. */
232
+ function email(options) {
233
+ if (!options.binding) throw new Error("binding is required to create an email channel");
234
+ async function send(destinationValue, title, text) {
235
+ const destination = emailSurface(destinationValue);
236
+ const inReplyTo = destination.address.inReplyTo;
237
+ const inReplyToHeader = inReplyTo ? `<${inReplyTo}>` : void 0;
238
+ if (inReplyToHeader && utf8ByteLength(inReplyToHeader) > EMAIL_HEADER_VALUE_LIMIT) return {
239
+ status: "failed",
240
+ retryable: false,
241
+ error: {
242
+ code: "EMAIL_SURFACE_INVALID",
243
+ message: "Email reply metadata exceeds provider header limits"
244
+ }
245
+ };
246
+ const references = destination.address.references;
247
+ const referencesHeader = references ? referenceHeader(references) : void 0;
248
+ if (references?.length && !referencesHeader) return {
249
+ status: "failed",
250
+ retryable: false,
251
+ error: {
252
+ code: "EMAIL_SURFACE_INVALID",
253
+ message: "Email reply metadata exceeds provider header limits"
254
+ }
255
+ };
256
+ const replyHeaders = {
257
+ ...inReplyToHeader && { "In-Reply-To": inReplyToHeader },
258
+ ...referencesHeader && { References: referencesHeader }
259
+ };
260
+ try {
261
+ return {
262
+ status: "delivered",
263
+ reference: (await options.binding.send({
264
+ from: destination.address.from,
265
+ to: mutableRecipients(destination.address.to),
266
+ subject: title ?? replySubject(destination.address.subject) ?? options.defaultTitle ?? DEFAULT_EMAIL_TITLE,
267
+ text,
268
+ replyTo: destination.address.replyTo,
269
+ cc: destination.address.cc === void 0 ? void 0 : mutableRecipients(destination.address.cc),
270
+ bcc: destination.address.bcc === void 0 ? void 0 : mutableRecipients(destination.address.bcc),
271
+ headers: {
272
+ ...destination.address.headers,
273
+ ...replyHeaders
274
+ }
275
+ })).messageId
276
+ };
277
+ } catch (error) {
278
+ return classifyEmailDeliveryError(error);
279
+ }
280
+ }
281
+ return {
282
+ ...options.route && { route: options.route },
283
+ emailIngress: inboundEmail({
284
+ to: options.inbound?.to,
285
+ from: options.inbound?.from,
286
+ replyFrom: options.from
287
+ }),
288
+ contactSurface(identity) {
289
+ if ((identity.scope ?? "default") !== "default") return null;
290
+ return {
291
+ version: 1,
292
+ address: {
293
+ from: options.from,
294
+ to: identity.subject
295
+ },
296
+ label: `Email · ${identity.subject}`
297
+ };
298
+ },
299
+ deliver(destination, message) {
300
+ return send(destination, message.title, message.markdown);
301
+ },
302
+ async requestApproval(destination, { request, getApprovalLinks }) {
303
+ if (!getApprovalLinks) return approvalLinksUnavailable();
304
+ let links;
305
+ try {
306
+ links = await getApprovalLinks();
307
+ } catch {
308
+ return approvalLinksUnavailable(true);
309
+ }
310
+ const text = [
311
+ request.summary,
312
+ `Input:\n${renderInput(request.input)}`,
313
+ `Approve: ${links.approve}`,
314
+ `Reject: ${links.reject}`
315
+ ].join("\n\n");
316
+ return send(destination, request.title, text);
317
+ }
318
+ };
319
+ }
320
+ //#endregion
321
+ export { email, inboundEmail };
322
+
323
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","names":["EMAIL_HEADER_VALUE_LIMIT"],"sources":["../../src/channels/adapters/email/inbound-email.ts","../../src/channels/adapters/email/email.ts"],"sourcesContent":["import PostalMime from \"postal-mime\";\nimport type {\n Attachment as PostalMimeAttachment,\n Email as PostalMimeEmail,\n Header as PostalMimeHeader\n} from \"postal-mime\";\nimport type {\n EmailMessageSurfaceInput,\n EmailSurfaceAddress,\n EmailSurfaceRecipients\n} from \"./email-surface\";\nimport { utf8ByteLength } from \"../../internal\";\nimport type {\n ChannelAttachment,\n ChannelEmailIngress,\n ChannelEmailInput,\n ChannelInboundMessageInput\n} from \"../../ingress\";\n\n/** Parsed, provider-specific email retained while selecting an application route. */\nexport type InboundEmailRaw = PostalMimeEmail;\n\nconst EMAIL_HEADER_VALUE_LIMIT = 2048;\n\nexport type InboundEmailOptions = {\n /** Only accept messages delivered to this address. */\n to?: string;\n /** Only accept these envelope senders. */\n from?: string | readonly string[];\n /** Outbound sender to retain in normalized reply surfaces. */\n replyFrom?: EmailSurfaceAddress;\n};\n\nfunction normalizeReference(value: string | undefined): string | undefined {\n const normalized = value?.trim().replace(/^<|>$/g, \"\");\n return normalized || undefined;\n}\n\nfunction emailReferences(value: string | undefined): string[] {\n const bracketed = value?.match(/<([^<>]+)>/g);\n const values = bracketed ?? value?.trim().split(/\\s+/) ?? [];\n return values.flatMap((reference) => {\n const normalized = normalizeReference(reference);\n return normalized ? [normalized] : [];\n });\n}\n\nfunction firstReference(value: string | undefined): string | undefined {\n return emailReferences(value)[0];\n}\n\nfunction boundedReferences(references: readonly string[]): string[] {\n const unique = [...new Set(references.filter(Boolean))];\n if (unique.length < 2) return unique;\n const selected = [unique[0]!];\n for (let index = unique.length - 1; index > 0; index -= 1) {\n const candidate = unique[index]!;\n const header = [...selected, candidate]\n .map((reference) => `<${reference}>`)\n .join(\" \");\n if (utf8ByteLength(header) <= EMAIL_HEADER_VALUE_LIMIT) {\n selected.splice(1, 0, candidate);\n }\n }\n return selected;\n}\n\nfunction isAutoReply(headers: readonly PostalMimeHeader[]): boolean {\n return headers.some((header) => {\n const key = header.key.toLowerCase();\n const value = header.value.trim().toLowerCase();\n if (key === \"auto-submitted\") return value !== \"no\";\n if (key === \"x-auto-response-suppress\") return true;\n return (\n key === \"precedence\" &&\n (value === \"bulk\" || value === \"junk\" || value === \"list\")\n );\n });\n}\n\nfunction attachmentSize(content: PostalMimeAttachment[\"content\"]): number {\n return typeof content === \"string\"\n ? utf8ByteLength(content)\n : content.byteLength;\n}\n\nfunction normalizedAttachment(\n attachment: PostalMimeAttachment\n): ChannelAttachment {\n return {\n ...(normalizeReference(attachment.contentId) && {\n id: normalizeReference(attachment.contentId)\n }),\n mediaType: attachment.mimeType,\n ...(attachment.filename && { name: attachment.filename }),\n size: attachmentSize(attachment.content),\n ...(typeof attachment.content === \"string\" &&\n attachment.mimeType.startsWith(\"text/\") && {\n text: attachment.content\n })\n };\n}\n\nfunction replyRecipients(\n replyTo: InboundEmailRaw[\"replyTo\"]\n): EmailSurfaceRecipients | undefined {\n const recipients = (replyTo ?? []).flatMap((entry) =>\n entry.address\n ? [{ email: entry.address, name: entry.name }]\n : (entry.group ?? []).map((mailbox) => ({\n email: mailbox.address,\n name: mailbox.name\n }))\n );\n return recipients.length > 0 ? recipients : undefined;\n}\n\nfunction recipientLabel(recipients: EmailSurfaceRecipients): string {\n const values = Array.isArray(recipients) ? recipients : [recipients];\n return values\n .map((recipient) =>\n typeof recipient === \"string\"\n ? recipient\n : recipient.name\n ? `${recipient.name} <${recipient.email}>`\n : recipient.email\n )\n .join(\", \");\n}\n\nfunction normalizedDate(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const timestamp = Date.parse(value);\n return Number.isFinite(timestamp)\n ? new Date(timestamp).toISOString()\n : undefined;\n}\n\nasync function rawEmail(email: ChannelEmailInput): Promise<Uint8Array> {\n if (email.getRaw) return email.getRaw();\n if (email.raw) {\n return new Uint8Array(await new Response(email.raw).arrayBuffer());\n }\n throw new Error(\"Inbound email must provide raw or getRaw()\");\n}\n\nasync function contentReference(content: Uint8Array): Promise<string> {\n const bytes = new Uint8Array(content.byteLength);\n bytes.set(content);\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n return `sha256:${Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\")\n ).join(\"\")}`;\n}\n\n/** Parse Workers Email events into normalized Channel ingress events. */\nexport function inboundEmail(\n options: InboundEmailOptions = {}\n): ChannelEmailIngress<InboundEmailRaw> {\n const recipient = options.to?.toLowerCase();\n const senders = new Set(\n (typeof options.from === \"string\"\n ? [options.from]\n : (options.from ?? [])\n ).map((sender) => sender.toLowerCase())\n );\n\n return {\n async receive(email) {\n const accepted =\n (!recipient || email.to.toLowerCase() === recipient) &&\n (senders.size === 0 || senders.has(email.from.toLowerCase()));\n if (!accepted) return null;\n\n const content = await rawEmail(email);\n const parsed = await PostalMime.parse(content);\n const text = parsed.text?.trim() ?? \"\";\n const reference =\n normalizeReference(parsed.messageId) ??\n (await contentReference(content));\n const replyReference = normalizeReference(parsed.inReplyTo);\n const threadRoot =\n firstReference(parsed.references) ?? replyReference ?? reference;\n const senderAddress = parsed.from?.address ?? email.from;\n const sentAt = normalizedDate(parsed.date);\n const references = boundedReferences([\n ...emailReferences(parsed.references),\n reference\n ]);\n const replyTo = replyRecipients(parsed.replyTo) ?? senderAddress;\n const replySurface: EmailMessageSurfaceInput = {\n version: 1,\n address: {\n from: options.replyFrom ?? email.to,\n to: replyTo,\n ...(parsed.subject && { subject: parsed.subject }),\n inReplyTo: reference,\n references: [...new Set(references)]\n },\n label: `Email · ${recipientLabel(replyTo)}`\n };\n\n const event: ChannelInboundMessageInput = {\n type: \"message\",\n eventId: reference,\n thread: {\n id: threadRoot,\n isDirectMessage: \"unknown\"\n },\n replySurface,\n actor: {\n id: senderAddress,\n identity: {\n subject: senderAddress.toLowerCase()\n },\n ...(parsed.from?.name && { fullName: parsed.from.name })\n },\n message: {\n id: reference,\n text,\n ...(parsed.subject && { title: parsed.subject }),\n attachments: parsed.attachments.map(normalizedAttachment),\n ...(replyReference && { reply: { id: replyReference } }),\n metadata: {\n ...(sentAt && { sentAt }),\n autoReply: isAutoReply(parsed.headers)\n }\n }\n };\n return { events: [{ event, raw: parsed }] };\n }\n };\n}\n","import type {\n Channel,\n ChannelApprovalLinks,\n ChannelRoute,\n DeliveryFailure,\n DeliveryResult\n} from \"../../channel\";\nimport type { ChannelIdentity } from \"../../identity\";\nimport type { ChannelMessageSurface } from \"../../surface\";\nimport type {\n EmailMessageSurface,\n EmailSurfaceAddress,\n EmailSurfaceRecipients\n} from \"./email-surface\";\nimport {\n inboundEmail,\n type InboundEmailOptions,\n type InboundEmailRaw\n} from \"./inbound-email\";\nimport { renderInput, utf8ByteLength } from \"../../internal\";\n\nexport type EmailAddress = EmailSurfaceAddress;\nexport type EmailRecipients = EmailSurfaceRecipients;\n\nexport type ChannelEmailMessage = {\n from: EmailAddress;\n to: EmailAddress | EmailAddress[];\n subject: string;\n text: string;\n replyTo?: EmailAddress;\n cc?: EmailAddress | EmailAddress[];\n bcc?: EmailAddress | EmailAddress[];\n headers?: Record<string, string>;\n};\n\n/** The structural subset of a Cloudflare Email Service binding used here. */\nexport interface EmailSendBinding {\n send(message: ChannelEmailMessage): Promise<{ messageId: string }>;\n}\n\n/** Configuration for an email Channel. */\nexport type EmailChannelOptions = {\n binding: EmailSendBinding;\n from: EmailAddress;\n /** Subject used when a message does not provide a title. */\n defaultTitle?: string;\n /** Select an application route from the event, parsed email, and Host context. */\n route?: ChannelRoute<InboundEmailRaw>;\n /** Override inferred Workers Email ingress addresses. */\n inbound?: InboundEmailOptions;\n};\n\nconst DEFAULT_EMAIL_TITLE = \"Agent message\";\nconst EMAIL_HEADER_VALUE_LIMIT = 2048;\n\nfunction approvalLinksUnavailable(retryable = false): DeliveryResult {\n return {\n status: \"failed\",\n retryable,\n error: {\n code: \"APPROVAL_LINKS_UNAVAILABLE\",\n message: \"Email approval requests require caller-supplied approval links\"\n }\n };\n}\n\nconst PERMANENT_EMAIL_ERRORS = new Set([\n \"E_VALIDATION_ERROR\",\n \"E_FIELD_MISSING\",\n \"E_TOO_MANY_RECIPIENTS\",\n \"E_TOO_MANY_ATTACHMENTS\",\n \"E_SENDER_NOT_VERIFIED\",\n \"E_RECIPIENT_NOT_ALLOWED\",\n \"E_RECIPIENT_SUPPRESSED\",\n \"E_SENDER_DOMAIN_NOT_AVAILABLE\",\n \"E_CONTENT_TOO_LARGE\",\n \"E_DELIVERY_FAILED\",\n \"E_HEADER_NOT_ALLOWED\",\n \"E_HEADER_USE_API_FIELD\",\n \"E_HEADER_VALUE_INVALID\",\n \"E_HEADER_VALUE_TOO_LONG\",\n \"E_HEADER_NAME_INVALID\",\n \"E_HEADERS_TOO_LARGE\",\n \"E_HEADERS_TOO_MANY\"\n]);\n\nconst RETRYABLE_EMAIL_ERRORS = new Set([\n \"E_RATE_LIMIT_EXCEEDED\",\n \"E_DAILY_LIMIT_EXCEEDED\"\n]);\n\nconst EMAIL_ERROR_MESSAGES = new Map<string, string>([\n [\n 'Email must have at least one recipient in \"to\", \"cc\", or \"bcc\".',\n \"E_FIELD_MISSING\"\n ]\n]);\n\nfunction emailFailure(error: unknown): DeliveryFailure {\n if (error !== null && typeof error === \"object\") {\n const value = error as { code?: unknown; message?: unknown };\n return {\n code:\n typeof value.code === \"string\" ? value.code : \"EMAIL_DELIVERY_ERROR\",\n message:\n typeof value.message === \"string\"\n ? value.message\n : \"Email delivery failed\"\n };\n }\n\n return {\n code: \"EMAIL_DELIVERY_ERROR\",\n message: typeof error === \"string\" ? error : \"Email delivery failed\"\n };\n}\n\n/** Classify an Email Service binding error as a model-visible result. */\nfunction classifyEmailDeliveryError(error: unknown): DeliveryResult {\n const failure = emailFailure(error);\n const inferredCode = EMAIL_ERROR_MESSAGES.get(failure.message);\n if (inferredCode) {\n return {\n status: \"failed\",\n retryable: false,\n error: { ...failure, code: inferredCode }\n };\n }\n\n if (RETRYABLE_EMAIL_ERRORS.has(failure.code)) {\n return { status: \"failed\", retryable: true, error: failure };\n }\n\n if (PERMANENT_EMAIL_ERRORS.has(failure.code)) {\n return { status: \"failed\", retryable: false, error: failure };\n }\n\n return { status: \"uncertain\", error: failure };\n}\n\nfunction emailSurface(surface: ChannelMessageSurface): EmailMessageSurface {\n return surface as EmailMessageSurface;\n}\n\nfunction mutableRecipients(\n value: EmailRecipients\n): EmailAddress | EmailAddress[] {\n return Array.isArray(value) ? [...value] : (value as EmailAddress);\n}\n\nfunction replySubject(subject: string | undefined): string | undefined {\n if (!subject) return undefined;\n return /^re:/i.test(subject) ? subject : `Re: ${subject}`;\n}\n\nfunction referenceHeader(references: readonly string[]): string | undefined {\n const unique = [...new Set(references.filter(Boolean))];\n if (unique.length === 0) return undefined;\n const root = `<${unique[0]}>`;\n if (utf8ByteLength(root) > EMAIL_HEADER_VALUE_LIMIT) return undefined;\n\n const selected = [root];\n for (let index = unique.length - 1; index > 0; index -= 1) {\n const candidate = `<${unique[index]}>`;\n if (\n utf8ByteLength([...selected, candidate].join(\" \")) <=\n EMAIL_HEADER_VALUE_LIMIT\n ) {\n selected.splice(1, 0, candidate);\n }\n }\n return selected.join(\" \");\n}\n\n/** Create a configured email Channel. */\nexport function email(options: EmailChannelOptions): Channel<InboundEmailRaw> {\n if (!options.binding) {\n throw new Error(\"binding is required to create an email channel\");\n }\n\n async function send(\n destinationValue: ChannelMessageSurface,\n title: string | undefined,\n text: string\n ): Promise<DeliveryResult> {\n const destination = emailSurface(destinationValue);\n const inReplyTo = destination.address.inReplyTo;\n const inReplyToHeader = inReplyTo ? `<${inReplyTo}>` : undefined;\n if (\n inReplyToHeader &&\n utf8ByteLength(inReplyToHeader) > EMAIL_HEADER_VALUE_LIMIT\n ) {\n return {\n status: \"failed\",\n retryable: false,\n error: {\n code: \"EMAIL_SURFACE_INVALID\",\n message: \"Email reply metadata exceeds provider header limits\"\n }\n };\n }\n const references = destination.address.references;\n const referencesHeader = references\n ? referenceHeader(references)\n : undefined;\n if (references?.length && !referencesHeader) {\n return {\n status: \"failed\",\n retryable: false,\n error: {\n code: \"EMAIL_SURFACE_INVALID\",\n message: \"Email reply metadata exceeds provider header limits\"\n }\n };\n }\n const replyHeaders = {\n ...(inReplyToHeader && { \"In-Reply-To\": inReplyToHeader }),\n ...(referencesHeader && { References: referencesHeader })\n };\n try {\n const result = await options.binding.send({\n from: destination.address.from,\n to: mutableRecipients(destination.address.to),\n subject:\n title ??\n replySubject(destination.address.subject) ??\n options.defaultTitle ??\n DEFAULT_EMAIL_TITLE,\n text,\n replyTo: destination.address.replyTo,\n cc:\n destination.address.cc === undefined\n ? undefined\n : mutableRecipients(destination.address.cc),\n bcc:\n destination.address.bcc === undefined\n ? undefined\n : mutableRecipients(destination.address.bcc),\n headers: {\n ...destination.address.headers,\n ...replyHeaders\n }\n });\n\n return { status: \"delivered\" as const, reference: result.messageId };\n } catch (error) {\n return classifyEmailDeliveryError(error);\n }\n }\n\n return {\n ...(options.route && { route: options.route }),\n emailIngress: inboundEmail({\n to: options.inbound?.to,\n from: options.inbound?.from,\n replyFrom: options.from\n }),\n contactSurface(identity: ChannelIdentity) {\n if ((identity.scope ?? \"default\") !== \"default\") return null;\n return {\n version: 1,\n address: { from: options.from, to: identity.subject },\n label: `Email · ${identity.subject}`\n };\n },\n deliver(destination, message) {\n return send(destination, message.title, message.markdown);\n },\n async requestApproval(destination, { request, getApprovalLinks }) {\n if (!getApprovalLinks) return approvalLinksUnavailable();\n\n let links: ChannelApprovalLinks;\n try {\n links = await getApprovalLinks();\n } catch {\n // No provider send was attempted, so retrying cannot duplicate email\n // delivery even when the caller-owned link lookup failed transiently.\n return approvalLinksUnavailable(true);\n }\n\n const text = [\n request.summary,\n `Input:\\n${renderInput(request.input)}`,\n `Approve: ${links.approve}`,\n `Reject: ${links.reject}`\n ].join(\"\\n\\n\");\n return send(destination, request.title, text);\n }\n };\n}\n"],"mappings":"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"}