@contractspec/integration.providers-impls 1.44.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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/_virtual/rolldown_runtime.js +36 -0
  4. package/dist/calendar.d.ts +8 -0
  5. package/dist/calendar.d.ts.map +1 -0
  6. package/dist/calendar.js +3 -0
  7. package/dist/email.d.ts +8 -0
  8. package/dist/email.d.ts.map +1 -0
  9. package/dist/email.js +3 -0
  10. package/dist/embedding.d.ts +8 -0
  11. package/dist/embedding.d.ts.map +1 -0
  12. package/dist/embedding.js +3 -0
  13. package/dist/impls/elevenlabs-voice.d.ts +21 -0
  14. package/dist/impls/elevenlabs-voice.d.ts.map +1 -0
  15. package/dist/impls/elevenlabs-voice.js +93 -0
  16. package/dist/impls/elevenlabs-voice.js.map +1 -0
  17. package/dist/impls/gcs-storage.d.ts +25 -0
  18. package/dist/impls/gcs-storage.d.ts.map +1 -0
  19. package/dist/impls/gcs-storage.js +90 -0
  20. package/dist/impls/gcs-storage.js.map +1 -0
  21. package/dist/impls/gmail-inbound.d.ts +27 -0
  22. package/dist/impls/gmail-inbound.d.ts.map +1 -0
  23. package/dist/impls/gmail-inbound.js +201 -0
  24. package/dist/impls/gmail-inbound.js.map +1 -0
  25. package/dist/impls/gmail-outbound.d.ts +19 -0
  26. package/dist/impls/gmail-outbound.d.ts.map +1 -0
  27. package/dist/impls/gmail-outbound.js +106 -0
  28. package/dist/impls/gmail-outbound.js.map +1 -0
  29. package/dist/impls/google-calendar.d.ts +24 -0
  30. package/dist/impls/google-calendar.d.ts.map +1 -0
  31. package/dist/impls/google-calendar.js +155 -0
  32. package/dist/impls/google-calendar.js.map +1 -0
  33. package/dist/impls/index.d.ts +15 -0
  34. package/dist/impls/index.js +16 -0
  35. package/dist/impls/mistral-embedding.d.ts +24 -0
  36. package/dist/impls/mistral-embedding.d.ts.map +1 -0
  37. package/dist/impls/mistral-embedding.js +42 -0
  38. package/dist/impls/mistral-embedding.js.map +1 -0
  39. package/dist/impls/mistral-llm.d.ts +32 -0
  40. package/dist/impls/mistral-llm.d.ts.map +1 -0
  41. package/dist/impls/mistral-llm.js +248 -0
  42. package/dist/impls/mistral-llm.js.map +1 -0
  43. package/dist/impls/postmark-email.d.ts +20 -0
  44. package/dist/impls/postmark-email.d.ts.map +1 -0
  45. package/dist/impls/postmark-email.js +56 -0
  46. package/dist/impls/postmark-email.js.map +1 -0
  47. package/dist/impls/powens-client.d.ts +125 -0
  48. package/dist/impls/powens-client.d.ts.map +1 -0
  49. package/dist/impls/powens-client.js +172 -0
  50. package/dist/impls/powens-client.js.map +1 -0
  51. package/dist/impls/powens-openbanking.d.ts +28 -0
  52. package/dist/impls/powens-openbanking.d.ts.map +1 -0
  53. package/dist/impls/powens-openbanking.js +219 -0
  54. package/dist/impls/powens-openbanking.js.map +1 -0
  55. package/dist/impls/provider-factory.d.ts +27 -0
  56. package/dist/impls/provider-factory.d.ts.map +1 -0
  57. package/dist/impls/provider-factory.js +143 -0
  58. package/dist/impls/provider-factory.js.map +1 -0
  59. package/dist/impls/qdrant-vector.d.ts +25 -0
  60. package/dist/impls/qdrant-vector.d.ts.map +1 -0
  61. package/dist/impls/qdrant-vector.js +72 -0
  62. package/dist/impls/qdrant-vector.js.map +1 -0
  63. package/dist/impls/stripe-payments.d.ts +29 -0
  64. package/dist/impls/stripe-payments.d.ts.map +1 -0
  65. package/dist/impls/stripe-payments.js +203 -0
  66. package/dist/impls/stripe-payments.js.map +1 -0
  67. package/dist/impls/twilio-sms.d.ts +21 -0
  68. package/dist/impls/twilio-sms.d.ts.map +1 -0
  69. package/dist/impls/twilio-sms.js +59 -0
  70. package/dist/impls/twilio-sms.js.map +1 -0
  71. package/dist/index.d.ts +44 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +69 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/llm.d.ts +8 -0
  76. package/dist/llm.d.ts.map +1 -0
  77. package/dist/llm.js +3 -0
  78. package/dist/openbanking.d.ts +8 -0
  79. package/dist/openbanking.d.ts.map +1 -0
  80. package/dist/openbanking.js +3 -0
  81. package/dist/payments.d.ts +8 -0
  82. package/dist/payments.d.ts.map +1 -0
  83. package/dist/payments.js +3 -0
  84. package/dist/runtime.d.ts +2 -0
  85. package/dist/runtime.js +0 -0
  86. package/dist/secrets/provider.d.ts +2 -0
  87. package/dist/secrets/provider.js +3 -0
  88. package/dist/sms.d.ts +8 -0
  89. package/dist/sms.d.ts.map +1 -0
  90. package/dist/sms.js +3 -0
  91. package/dist/storage.d.ts +8 -0
  92. package/dist/storage.d.ts.map +1 -0
  93. package/dist/storage.js +3 -0
  94. package/dist/vector-store.d.ts +8 -0
  95. package/dist/vector-store.d.ts.map +1 -0
  96. package/dist/vector-store.js +3 -0
  97. package/dist/voice.d.ts +8 -0
  98. package/dist/voice.d.ts.map +1 -0
  99. package/dist/voice.js +3 -0
  100. package/package.json +118 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-inbound.js","names":["q: string[]","metadata: Record<string, string>","attachments: NonNullable<EmailMessage['attachments']>"],"sources":["../../src/impls/gmail-inbound.ts"],"sourcesContent":["import { google, type gmail_v1 } from 'googleapis';\n\nimport type {\n EmailInboundProvider,\n EmailMessagesSinceQuery,\n EmailMessage,\n EmailThread,\n EmailThreadListQuery,\n} from '../email';\n\nexport interface GmailInboundProviderOptions {\n auth: gmail_v1.Options['auth'];\n userId?: string;\n gmail?: gmail_v1.Gmail;\n includeSpamTrash?: boolean;\n}\n\nexport class GmailInboundProvider implements EmailInboundProvider {\n private readonly gmail: gmail_v1.Gmail;\n private readonly userId: string;\n private readonly includeSpamTrash: boolean;\n private readonly auth: gmail_v1.Options['auth'];\n\n constructor(options: GmailInboundProviderOptions) {\n this.auth = options.auth;\n this.gmail =\n options.gmail ??\n google.gmail({\n version: 'v1',\n auth: options.auth,\n });\n this.userId = options.userId ?? 'me';\n this.includeSpamTrash = options.includeSpamTrash ?? false;\n }\n\n async listThreads(query?: EmailThreadListQuery): Promise<EmailThread[]> {\n const response = await this.gmail.users.threads.list({\n userId: this.userId,\n maxResults: query?.pageSize,\n pageToken: query?.pageToken,\n q: query?.query,\n labelIds: query?.label ? [query.label] : undefined,\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const threads = await Promise.all(\n (response.data.threads ?? []).map(async (thread) => {\n if (!thread.id) return null;\n return this.getThread(thread.id);\n })\n );\n\n return threads.filter((thread): thread is EmailThread => thread !== null);\n }\n\n async getThread(threadId: string): Promise<EmailThread | null> {\n const response = await this.gmail.users.threads.get({\n id: threadId,\n userId: this.userId,\n format: 'full',\n auth: this.auth,\n });\n const thread = response.data;\n if (!thread) return null;\n\n const messages =\n thread.messages?.map((message) => this.transformMessage(message)) ?? [];\n\n const participants = dedupeAddresses(\n messages.flatMap((message) => [\n message.from,\n ...message.to,\n ...(message.cc ?? []),\n ])\n );\n\n const firstMessage = messages[0];\n const lastMessage = messages[messages.length - 1];\n const updatedAt =\n lastMessage?.receivedAt ??\n lastMessage?.sentAt ??\n firstMessage?.receivedAt ??\n firstMessage?.sentAt ??\n new Date();\n\n const labels = Array.from(\n new Set(\n messages\n .flatMap((message) => {\n const labelField = message.metadata?.labelIds;\n if (!labelField) return [];\n return labelField.split(',').map((label) => label.trim());\n })\n .filter((label): label is string => Boolean(label))\n )\n );\n\n return {\n id: thread.id ?? threadId,\n subject: messages[0]?.subject,\n snippet: thread.snippet ?? '',\n participants,\n messages,\n updatedAt,\n labels,\n metadata: thread.historyId ? { historyId: thread.historyId } : undefined,\n };\n }\n\n async listMessagesSince(query: EmailMessagesSinceQuery) {\n const after = query.since\n ? Math.floor(query.since.getTime() / 1000)\n : undefined;\n const q: string[] = [];\n if (after) {\n q.push(`after:${after}`);\n }\n const response = await this.gmail.users.messages.list({\n userId: this.userId,\n maxResults: query.pageSize,\n pageToken: query.pageToken,\n labelIds: query.label ? [query.label] : undefined,\n q: q.join(' '),\n includeSpamTrash: this.includeSpamTrash,\n auth: this.auth,\n });\n\n const messages = await Promise.all(\n (response.data.messages ?? []).map(async (item) => {\n if (!item.id) return null;\n const full = await this.gmail.users.messages.get({\n userId: this.userId,\n id: item.id,\n format: 'full',\n auth: this.auth,\n });\n if (!full.data) return null;\n return this.transformMessage(full.data);\n })\n );\n\n return {\n messages: messages.filter(\n (message): message is EmailMessage => message !== null\n ),\n nextPageToken: response.data.nextPageToken ?? undefined,\n };\n }\n\n private transformMessage(message: gmail_v1.Schema$Message): EmailMessage {\n const headers = message.payload?.headers ?? [];\n const subject = headerValue(headers, 'Subject') ?? '';\n const from =\n parseAddress(headerValue(headers, 'From')) ??\n inferFallbackAddress('from', message.id);\n const to = parseAddressList(headerValue(headers, 'To'));\n const cc = parseAddressList(headerValue(headers, 'Cc'));\n const bcc = parseAddressList(headerValue(headers, 'Bcc'));\n const replyTo = parseAddress(headerValue(headers, 'Reply-To'));\n\n const { text, html, attachments } = extractContent(message.payload);\n const timestamp = message.internalDate\n ? new Date(Number(message.internalDate))\n : new Date();\n\n const metadata: Record<string, string> = {\n ...(message.labelIds?.length\n ? { labelIds: message.labelIds.join(',') }\n : {}),\n ...(message.historyId ? { historyId: message.historyId } : {}),\n };\n\n return {\n id: message.id ?? '',\n threadId: message.threadId ?? '',\n subject,\n from,\n to,\n cc,\n bcc,\n replyTo: replyTo ?? undefined,\n sentAt: timestamp,\n receivedAt: timestamp,\n textBody: text ?? undefined,\n htmlBody: html ?? undefined,\n attachments,\n headers: Object.fromEntries(\n headers.map((header) => [header.name ?? '', header.value ?? ''])\n ),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n }\n}\n\nfunction headerValue(\n headers: gmail_v1.Schema$MessagePartHeader[],\n name: string\n): string | undefined {\n const header = headers.find(\n (candidate) => candidate.name?.toLowerCase() === name.toLowerCase()\n );\n const value = header?.value;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction parseAddress(\n header?: string\n): { email: string; name?: string } | null {\n const addresses = parseAddressList(header);\n if (addresses.length === 0) {\n return null;\n }\n const firstAddress = addresses[0];\n return firstAddress || null;\n}\n\nfunction inferFallbackAddress(\n field: string,\n messageId?: string | null\n): { email: string; name?: string } {\n const suffix = messageId\n ? messageId.replace(/[^\\w]/g, '').slice(-8) || 'unknown'\n : 'unknown';\n return {\n email: `${field}-${suffix}@mail.local`,\n };\n}\n\nfunction parseAddressList(header?: string): { email: string; name?: string }[] {\n if (!header) return [];\n return header\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((value) => {\n const match = value.match(/^(?:\"?([^\"]*)\"?\\s)?<?([^<>]+)>?$/);\n if (!match) {\n return { email: value };\n }\n const name = match[1]?.trim();\n const email = match[2]?.trim();\n if (!email) {\n return { email: value };\n }\n return name ? { email, name } : { email };\n });\n}\n\nfunction dedupeAddresses(\n addresses: (\n | ReturnType<typeof parseAddress>\n | { email: string; name?: string }\n )[]\n) {\n const map = new Map<string, { email: string; name?: string }>();\n for (const address of addresses) {\n if (!address) continue;\n map.set(address.email.toLowerCase(), address);\n }\n return Array.from(map.values());\n}\n\nfunction extractContent(payload?: gmail_v1.Schema$MessagePart): {\n text?: string;\n html?: string;\n attachments: EmailMessage['attachments'];\n} {\n if (!payload) {\n return { attachments: [] };\n }\n const attachments: NonNullable<EmailMessage['attachments']> = [];\n const visit = (\n part?: gmail_v1.Schema$MessagePart\n ): {\n text?: string;\n html?: string;\n } => {\n if (!part) return {};\n if (part.filename && part.body?.attachmentId) {\n attachments.push({\n id: part.body.attachmentId,\n filename: part.filename,\n contentType: part.mimeType ?? 'application/octet-stream',\n sizeBytes: part.body.size ?? undefined,\n });\n }\n const mimeType = part.mimeType ?? '';\n const data = part.body?.data;\n if (mimeType === 'text/plain' && data) {\n return { text: decodeBase64Url(data) };\n }\n if (mimeType === 'text/html' && data) {\n return { html: decodeBase64Url(data) };\n }\n if (part.parts?.length) {\n return part.parts.reduce<{ text?: string; html?: string }>(\n (acc, nested) => {\n const value = visit(nested);\n return {\n text: value.text ?? acc.text,\n html: value.html ?? acc.html,\n };\n },\n {}\n );\n }\n return {};\n };\n\n const { text, html } = visit(payload);\n return { text, html, attachments };\n}\n\nfunction decodeBase64Url(data: string): string {\n const normalized = data.replace(/-/g, '+').replace(/_/g, '/');\n const padding = normalized.length % 4;\n const padded =\n padding === 0 ? normalized : normalized + '='.repeat(4 - padding);\n return Buffer.from(padded, 'base64').toString('utf-8');\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { email_d_exports } from "../email.js";
2
+ import { gmail_v1 } from "googleapis";
3
+
4
+ //#region src/impls/gmail-outbound.d.ts
5
+ interface GmailOutboundProviderOptions {
6
+ auth: gmail_v1.Options['auth'];
7
+ userId?: string;
8
+ gmail?: gmail_v1.Gmail;
9
+ }
10
+ declare class GmailOutboundProvider implements email_d_exports.EmailOutboundProvider {
11
+ private readonly gmail;
12
+ private readonly userId;
13
+ private readonly auth;
14
+ constructor(options: GmailOutboundProviderOptions);
15
+ sendEmail(message: email_d_exports.EmailOutboundMessage): Promise<email_d_exports.EmailOutboundResult>;
16
+ }
17
+ //#endregion
18
+ export { GmailOutboundProvider, GmailOutboundProviderOptions };
19
+ //# sourceMappingURL=gmail-outbound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-outbound.d.ts","names":[],"sources":["../../src/impls/gmail-outbound.ts"],"sourcesContent":[],"mappings":";;;;UASiB,4BAAA;QACT,QAAA,CAAS;EADA,MAAA,CAAA,EAAA,MAAA;EAMJ,KAAA,CAAA,EAHH,QAAA,CAAS,KAGN;;AAgBc,cAhBd,qBAAA,YAAiC,eAAA,CAAA,qBAgBnB,CAAA;EAA+B,iBAAA,KAAA;EAAR,iBAAA,MAAA;EAhBJ,iBAAA,IAAA;EAAqB,WAAA,CAAA,OAAA,EAK5C,4BAL4C;qBAgBxC,eAAA,CAAA,uBAAuB,QAAQ,eAAA,CAAA"}
@@ -0,0 +1,106 @@
1
+ import { google } from "googleapis";
2
+
3
+ //#region src/impls/gmail-outbound.ts
4
+ var GmailOutboundProvider = class {
5
+ gmail;
6
+ userId;
7
+ auth;
8
+ constructor(options) {
9
+ this.auth = options.auth;
10
+ this.gmail = options.gmail ?? google.gmail({
11
+ version: "v1",
12
+ auth: options.auth
13
+ });
14
+ this.userId = options.userId ?? "me";
15
+ }
16
+ async sendEmail(message) {
17
+ const raw = encodeMessage(message);
18
+ const response = await this.gmail.users.messages.send({
19
+ userId: this.userId,
20
+ requestBody: { raw },
21
+ auth: this.auth
22
+ });
23
+ return {
24
+ id: response.data.id ?? "",
25
+ providerMessageId: response.data.id ?? void 0,
26
+ queuedAt: /* @__PURE__ */ new Date()
27
+ };
28
+ }
29
+ };
30
+ function encodeMessage(message) {
31
+ const headers = [
32
+ `From: ${formatAddress(message.from)}`,
33
+ `To: ${message.to.map(formatAddress).join(", ")}`,
34
+ `Subject: ${message.subject}`,
35
+ "MIME-Version: 1.0"
36
+ ];
37
+ if (message.cc?.length) headers.push(`Cc: ${message.cc.map(formatAddress).join(", ")}`);
38
+ if (message.replyTo) headers.push(`Reply-To: ${formatAddress(message.replyTo)}`);
39
+ Object.entries(message.headers ?? {}).forEach(([key, value]) => {
40
+ headers.push(`${key}: ${value}`);
41
+ });
42
+ const attachments = message.attachments ?? [];
43
+ const hasHtml = Boolean(message.htmlBody);
44
+ const hasText = Boolean(message.textBody);
45
+ const boundaryMain = `mixed_${Date.now()}`;
46
+ const boundaryAlt = `alt_${Date.now()}`;
47
+ let body = "";
48
+ if (attachments.length > 0) {
49
+ headers.push(`Content-Type: multipart/mixed; boundary="${boundaryMain}"`);
50
+ body += `\r\n--${boundaryMain}\r\n`;
51
+ body += buildAlternativePart(hasText, hasHtml, boundaryAlt, message);
52
+ attachments.forEach((attachment) => {
53
+ body += buildAttachmentPart(boundaryMain, attachment);
54
+ });
55
+ body += `\r\n--${boundaryMain}--`;
56
+ } else if (hasText && hasHtml) {
57
+ headers.push(`Content-Type: multipart/alternative; boundary="${boundaryAlt}"`);
58
+ body += `\r\n--${boundaryAlt}\r\n`;
59
+ body += buildTextPart("text/plain; charset=\"utf-8\"", message.textBody || "");
60
+ body += `\r\n--${boundaryAlt}\r\n`;
61
+ body += buildTextPart("text/html; charset=\"utf-8\"", message.htmlBody || "");
62
+ body += `\r\n--${boundaryAlt}--`;
63
+ } else if (hasHtml) {
64
+ headers.push("Content-Type: text/html; charset=\"utf-8\"");
65
+ body += `\r\n\r\n${message.htmlBody}`;
66
+ } else {
67
+ headers.push("Content-Type: text/plain; charset=\"utf-8\"");
68
+ body += `\r\n\r\n${message.textBody ?? ""}`;
69
+ }
70
+ const mime = `${headers.join("\r\n")}${body}`;
71
+ return Buffer.from(mime).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
72
+ }
73
+ function buildAlternativePart(hasText, hasHtml, boundary, message) {
74
+ let content = "";
75
+ content += `Content-Type: multipart/alternative; boundary="${boundary}"\r\n`;
76
+ content += "\r\n";
77
+ if (hasText) {
78
+ content += `--${boundary}\r\n`;
79
+ content += buildTextPart("text/plain; charset=\"utf-8\"", message.textBody || "");
80
+ }
81
+ if (hasHtml) {
82
+ content += `\r\n--${boundary}\r\n`;
83
+ content += buildTextPart("text/html; charset=\"utf-8\"", message.htmlBody || "");
84
+ }
85
+ content += `\r\n--${boundary}--`;
86
+ return content;
87
+ }
88
+ function buildTextPart(contentType, content) {
89
+ return `Content-Type: ${contentType}\r\nContent-Transfer-Encoding: 7bit\r
90
+ \r
91
+ ` + content;
92
+ }
93
+ function buildAttachmentPart(boundary, attachment) {
94
+ const data = attachment.data ?? new Uint8Array();
95
+ const encoded = data.byteLength > 0 ? Buffer.from(data).toString("base64") : "";
96
+ return `\r\n--${boundary}\r\nContent-Type: ${attachment.contentType}; name="${attachment.filename}"\r\nContent-Transfer-Encoding: base64\r
97
+ Content-Disposition: attachment; filename="${attachment.filename}"\r\n\r\n` + encoded;
98
+ }
99
+ function formatAddress(address) {
100
+ if (address.name) return `"${address.name}" <${address.email}>`;
101
+ return address.email;
102
+ }
103
+
104
+ //#endregion
105
+ export { GmailOutboundProvider };
106
+ //# sourceMappingURL=gmail-outbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-outbound.js","names":["headers: string[]"],"sources":["../../src/impls/gmail-outbound.ts"],"sourcesContent":["import { google, type gmail_v1 } from 'googleapis';\n\nimport type {\n EmailAttachment,\n EmailOutboundMessage,\n EmailOutboundProvider,\n EmailOutboundResult,\n} from '../email';\n\nexport interface GmailOutboundProviderOptions {\n auth: gmail_v1.Options['auth'];\n userId?: string;\n gmail?: gmail_v1.Gmail;\n}\n\nexport class GmailOutboundProvider implements EmailOutboundProvider {\n private readonly gmail: gmail_v1.Gmail;\n private readonly userId: string;\n private readonly auth: gmail_v1.Options['auth'];\n\n constructor(options: GmailOutboundProviderOptions) {\n this.auth = options.auth;\n this.gmail =\n options.gmail ??\n google.gmail({\n version: 'v1',\n auth: options.auth,\n });\n this.userId = options.userId ?? 'me';\n }\n\n async sendEmail(message: EmailOutboundMessage): Promise<EmailOutboundResult> {\n const raw = encodeMessage(message);\n const response = await this.gmail.users.messages.send({\n userId: this.userId,\n requestBody: {\n raw,\n },\n auth: this.auth,\n });\n\n const id = response.data.id ?? '';\n return {\n id,\n providerMessageId: response.data.id ?? undefined,\n queuedAt: new Date(),\n };\n }\n}\n\nfunction encodeMessage(message: EmailOutboundMessage): string {\n const headers: string[] = [\n `From: ${formatAddress(message.from)}`,\n `To: ${message.to.map(formatAddress).join(', ')}`,\n `Subject: ${message.subject}`,\n 'MIME-Version: 1.0',\n ];\n if (message.cc?.length) {\n headers.push(`Cc: ${message.cc.map(formatAddress).join(', ')}`);\n }\n if (message.replyTo) {\n headers.push(`Reply-To: ${formatAddress(message.replyTo)}`);\n }\n Object.entries(message.headers ?? {}).forEach(([key, value]) => {\n headers.push(`${key}: ${value}`);\n });\n\n const attachments = message.attachments ?? [];\n const hasHtml = Boolean(message.htmlBody);\n const hasText = Boolean(message.textBody);\n const boundaryMain = `mixed_${Date.now()}`;\n const boundaryAlt = `alt_${Date.now()}`;\n\n let body = '';\n if (attachments.length > 0) {\n headers.push(`Content-Type: multipart/mixed; boundary=\"${boundaryMain}\"`);\n body += `\\r\\n--${boundaryMain}\\r\\n`;\n body += buildAlternativePart(hasText, hasHtml, boundaryAlt, message);\n attachments.forEach((attachment) => {\n body += buildAttachmentPart(boundaryMain, attachment);\n });\n body += `\\r\\n--${boundaryMain}--`;\n } else if (hasText && hasHtml) {\n headers.push(\n `Content-Type: multipart/alternative; boundary=\"${boundaryAlt}\"`\n );\n body += `\\r\\n--${boundaryAlt}\\r\\n`;\n body += buildTextPart(\n 'text/plain; charset=\"utf-8\"',\n message.textBody || ''\n );\n body += `\\r\\n--${boundaryAlt}\\r\\n`;\n body += buildTextPart('text/html; charset=\"utf-8\"', message.htmlBody || '');\n body += `\\r\\n--${boundaryAlt}--`;\n } else if (hasHtml) {\n headers.push('Content-Type: text/html; charset=\"utf-8\"');\n body += `\\r\\n\\r\\n${message.htmlBody}`;\n } else {\n headers.push('Content-Type: text/plain; charset=\"utf-8\"');\n body += `\\r\\n\\r\\n${message.textBody ?? ''}`;\n }\n\n const mime = `${headers.join('\\r\\n')}${body}`;\n return Buffer.from(mime)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nfunction buildAlternativePart(\n hasText: boolean,\n hasHtml: boolean,\n boundary: string,\n message: EmailOutboundMessage\n) {\n let content = '';\n content += `Content-Type: multipart/alternative; boundary=\"${boundary}\"\\r\\n`;\n content += '\\r\\n';\n if (hasText) {\n content += `--${boundary}\\r\\n`;\n content += buildTextPart(\n 'text/plain; charset=\"utf-8\"',\n message.textBody || ''\n );\n }\n if (hasHtml) {\n content += `\\r\\n--${boundary}\\r\\n`;\n content += buildTextPart(\n 'text/html; charset=\"utf-8\"',\n message.htmlBody || ''\n );\n }\n content += `\\r\\n--${boundary}--`;\n return content;\n}\n\nfunction buildTextPart(contentType: string, content: string) {\n return (\n `Content-Type: ${contentType}\\r\\n` +\n 'Content-Transfer-Encoding: 7bit\\r\\n\\r\\n' +\n content\n );\n}\n\nfunction buildAttachmentPart(\n boundary: string,\n attachment: EmailAttachment\n): string {\n const data = attachment.data ?? new Uint8Array();\n const encoded =\n data.byteLength > 0 ? Buffer.from(data).toString('base64') : '';\n return (\n `\\r\\n--${boundary}\\r\\n` +\n `Content-Type: ${attachment.contentType}; name=\"${attachment.filename}\"\\r\\n` +\n 'Content-Transfer-Encoding: base64\\r\\n' +\n `Content-Disposition: attachment; filename=\"${attachment.filename}\"\\r\\n\\r\\n` +\n encoded\n );\n}\n\nfunction formatAddress(address: { email: string; name?: string }) {\n if (address.name) {\n return `\"${address.name}\" <${address.email}>`;\n }\n return address.email;\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { calendar_d_exports } from "../calendar.js";
2
+ import { calendar_v3 } from "googleapis";
3
+
4
+ //#region src/impls/google-calendar.d.ts
5
+ interface GoogleCalendarProviderOptions {
6
+ auth: calendar_v3.Options['auth'];
7
+ calendar?: calendar_v3.Calendar;
8
+ calendarId?: string;
9
+ }
10
+ declare class GoogleCalendarProvider implements calendar_d_exports.CalendarProvider {
11
+ private readonly calendar;
12
+ private readonly defaultCalendarId;
13
+ private readonly auth;
14
+ constructor(options: GoogleCalendarProviderOptions);
15
+ listEvents(query: calendar_d_exports.CalendarListEventsQuery): Promise<calendar_d_exports.CalendarListEventsResult>;
16
+ createEvent(input: calendar_d_exports.CalendarEventInput): Promise<calendar_d_exports.CalendarEvent>;
17
+ updateEvent(calendarId: string, eventId: string, input: calendar_d_exports.CalendarEventUpdateInput): Promise<calendar_d_exports.CalendarEvent>;
18
+ deleteEvent(calendarId: string, eventId: string): Promise<void>;
19
+ private fromGoogleEvent;
20
+ private toGoogleEvent;
21
+ }
22
+ //#endregion
23
+ export { GoogleCalendarProvider, GoogleCalendarProviderOptions };
24
+ //# sourceMappingURL=google-calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-calendar.d.ts","names":[],"sources":["../../src/impls/google-calendar.ts"],"sourcesContent":[],"mappings":";;;;UAWiB,6BAAA;QACT,WAAA,CAAY;EADH,QAAA,CAAA,EAEJ,WAAA,CAAY,QAFR;EAMJ,UAAA,CAAA,EAAA,MAAA;;AAiBF,cAjBE,sBAAA,YAAkC,kBAAA,CAAA,gBAiBpC,CAAA;EACE,iBAAA,QAAA;EAAR,iBAAA,iBAAA;EAuBsB,iBAAA,IAAA;EAA6B,WAAA,CAAA,OAAA,EApCjC,6BAoCiC;EAAR,UAAA,CAAA,KAAA,EAxBrC,kBAAA,CAAA,uBAwBqC,CAAA,EAvB3C,OAuB2C,CAvBnC,kBAAA,CAAA,wBAuBmC,CAAA;EAcrC,WAAA,CAAA,KAAA,EAdgB,kBAAA,CAAA,kBAchB,CAAA,EAdqC,OAcrC,CAd6C,kBAAA,CAAA,aAc7C,CAAA;EACE,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EADF,kBAAA,CAAA,wBACE,CAAA,EAAR,OAAQ,CAAA,kBAAA,CAAA,aAAA,CAAA;EAAR,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAWqD,OAXrD,CAAA,IAAA,CAAA;EAWqD,QAAA,eAAA;EAnEX,QAAA,aAAA"}
@@ -0,0 +1,155 @@
1
+ import { google } from "googleapis";
2
+
3
+ //#region src/impls/google-calendar.ts
4
+ var GoogleCalendarProvider = class {
5
+ calendar;
6
+ defaultCalendarId;
7
+ auth;
8
+ constructor(options) {
9
+ this.auth = options.auth;
10
+ this.calendar = options.calendar ?? google.calendar({
11
+ version: "v3",
12
+ auth: options.auth
13
+ });
14
+ this.defaultCalendarId = options.calendarId ?? "primary";
15
+ }
16
+ async listEvents(query) {
17
+ const response = await this.calendar.events.list({
18
+ calendarId: query.calendarId ?? this.defaultCalendarId,
19
+ timeMin: query.timeMin?.toISOString(),
20
+ timeMax: query.timeMax?.toISOString(),
21
+ maxResults: query.maxResults,
22
+ pageToken: query.pageToken,
23
+ singleEvents: true,
24
+ orderBy: "startTime",
25
+ auth: this.auth
26
+ });
27
+ return {
28
+ events: response.data.items?.map((item) => this.fromGoogleEvent(query.calendarId ?? this.defaultCalendarId, item)) ?? [],
29
+ nextPageToken: response.data.nextPageToken ?? void 0
30
+ };
31
+ }
32
+ async createEvent(input) {
33
+ const calendarId = input.calendarId ?? this.defaultCalendarId;
34
+ const response = await this.calendar.events.insert({
35
+ calendarId,
36
+ requestBody: this.toGoogleEvent(input),
37
+ conferenceDataVersion: input.conference?.create ? 1 : void 0,
38
+ auth: this.auth
39
+ });
40
+ return this.fromGoogleEvent(calendarId, response.data);
41
+ }
42
+ async updateEvent(calendarId, eventId, input) {
43
+ const response = await this.calendar.events.patch({
44
+ calendarId: calendarId ?? this.defaultCalendarId,
45
+ eventId,
46
+ requestBody: this.toGoogleEvent(input),
47
+ conferenceDataVersion: input.conference?.create ? 1 : void 0,
48
+ auth: this.auth
49
+ });
50
+ return this.fromGoogleEvent(calendarId, response.data);
51
+ }
52
+ async deleteEvent(calendarId, eventId) {
53
+ await this.calendar.events.delete({
54
+ calendarId: calendarId ?? this.defaultCalendarId,
55
+ eventId,
56
+ auth: this.auth
57
+ });
58
+ }
59
+ fromGoogleEvent(calendarId, event) {
60
+ const start = parseDateTime(event.start);
61
+ const end = parseDateTime(event.end);
62
+ const attendees = event.attendees?.map((attendee) => ({
63
+ email: attendee.email ?? "",
64
+ name: attendee.displayName ?? void 0,
65
+ optional: attendee.optional ?? void 0,
66
+ responseStatus: normalizeResponseStatus(attendee.responseStatus)
67
+ })) ?? [];
68
+ const reminders = event.reminders?.overrides?.map((reminder) => ({
69
+ method: reminder.method ?? "popup",
70
+ minutesBeforeStart: reminder.minutes ?? 0
71
+ })) ?? [];
72
+ const metadata = buildMetadata(event);
73
+ return {
74
+ id: event.id ?? "",
75
+ calendarId,
76
+ title: event.summary ?? "",
77
+ description: event.description ?? void 0,
78
+ location: event.location ?? void 0,
79
+ start,
80
+ end,
81
+ allDay: event.start?.date ? true : void 0,
82
+ attendees,
83
+ reminders,
84
+ conferenceLink: event.hangoutLink ?? event.conferenceData?.entryPoints?.find((entry) => entry.uri)?.uri ?? void 0,
85
+ metadata,
86
+ createdAt: event.created ? new Date(event.created) : void 0,
87
+ updatedAt: event.updated ? new Date(event.updated) : void 0
88
+ };
89
+ }
90
+ toGoogleEvent(input) {
91
+ const event = {};
92
+ if ("title" in input && input.title) event.summary = input.title;
93
+ if (input.description !== void 0) event.description = input.description;
94
+ if (input.location !== void 0) event.location = input.location;
95
+ if (input.start) event.start = formatDateTime(input.start, input.allDay);
96
+ if (input.end) event.end = formatDateTime(input.end, input.allDay);
97
+ if (input.attendees) event.attendees = input.attendees.map((attendee) => ({
98
+ email: attendee.email,
99
+ displayName: attendee.name,
100
+ optional: attendee.optional,
101
+ responseStatus: attendee.responseStatus
102
+ }));
103
+ if (input.reminders) event.reminders = {
104
+ useDefault: false,
105
+ overrides: input.reminders.map((reminder) => ({
106
+ method: reminder.method,
107
+ minutes: reminder.minutesBeforeStart
108
+ }))
109
+ };
110
+ if (input.conference?.create) event.conferenceData = { createRequest: { requestId: `conf-${Date.now()}` } };
111
+ if (input.metadata) event.extendedProperties = {
112
+ ...event.extendedProperties ?? {},
113
+ private: {
114
+ ...event.extendedProperties?.private ?? {},
115
+ ...input.metadata
116
+ }
117
+ };
118
+ return event;
119
+ }
120
+ };
121
+ function parseDateTime(time) {
122
+ if (!time) return /* @__PURE__ */ new Date();
123
+ if (time.dateTime) return new Date(time.dateTime);
124
+ if (time.date) return /* @__PURE__ */ new Date(`${time.date}T00:00:00`);
125
+ return /* @__PURE__ */ new Date();
126
+ }
127
+ function formatDateTime(date, allDay) {
128
+ if (allDay) return { date: date.toISOString().slice(0, 10) };
129
+ return { dateTime: date.toISOString() };
130
+ }
131
+ function normalizeResponseStatus(status) {
132
+ if (!status) return void 0;
133
+ return [
134
+ "needsAction",
135
+ "declined",
136
+ "tentative",
137
+ "accepted"
138
+ ].includes(status) ? status : void 0;
139
+ }
140
+ function buildMetadata(event) {
141
+ const metadata = {};
142
+ if (event.status) metadata.status = event.status;
143
+ if (event.htmlLink) metadata.htmlLink = event.htmlLink;
144
+ if (event.iCalUID) metadata.iCalUID = event.iCalUID;
145
+ if (event.etag) metadata.etag = event.etag;
146
+ if (event.conferenceData?.conferenceSolution?.name) metadata.conferenceSolution = event.conferenceData.conferenceSolution.name;
147
+ if (event.extendedProperties?.private) Object.entries(event.extendedProperties.private).forEach(([key, value]) => {
148
+ if (typeof value === "string") metadata[`extended.${key}`] = value;
149
+ });
150
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
151
+ }
152
+
153
+ //#endregion
154
+ export { GoogleCalendarProvider };
155
+ //# sourceMappingURL=google-calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-calendar.js","names":["event: calendar_v3.Schema$Event","metadata: Record<string, string>"],"sources":["../../src/impls/google-calendar.ts"],"sourcesContent":["import { google, type calendar_v3 } from 'googleapis';\n\nimport type {\n CalendarEvent,\n CalendarEventInput,\n CalendarEventUpdateInput,\n CalendarListEventsQuery,\n CalendarListEventsResult,\n CalendarProvider,\n} from '../calendar';\n\nexport interface GoogleCalendarProviderOptions {\n auth: calendar_v3.Options['auth'];\n calendar?: calendar_v3.Calendar;\n calendarId?: string;\n}\n\nexport class GoogleCalendarProvider implements CalendarProvider {\n private readonly calendar: calendar_v3.Calendar;\n private readonly defaultCalendarId: string;\n private readonly auth: calendar_v3.Options['auth'];\n\n constructor(options: GoogleCalendarProviderOptions) {\n this.auth = options.auth;\n this.calendar =\n options.calendar ??\n google.calendar({\n version: 'v3',\n auth: options.auth,\n });\n this.defaultCalendarId = options.calendarId ?? 'primary';\n }\n\n async listEvents(\n query: CalendarListEventsQuery\n ): Promise<CalendarListEventsResult> {\n const response = await this.calendar.events.list({\n calendarId: query.calendarId ?? this.defaultCalendarId,\n timeMin: query.timeMin?.toISOString(),\n timeMax: query.timeMax?.toISOString(),\n maxResults: query.maxResults,\n pageToken: query.pageToken,\n singleEvents: true,\n orderBy: 'startTime',\n auth: this.auth,\n });\n\n const events =\n response.data.items?.map((item) =>\n this.fromGoogleEvent(query.calendarId ?? this.defaultCalendarId, item)\n ) ?? [];\n\n return {\n events,\n nextPageToken: response.data.nextPageToken ?? undefined,\n };\n }\n\n async createEvent(input: CalendarEventInput): Promise<CalendarEvent> {\n const calendarId = input.calendarId ?? this.defaultCalendarId;\n const response = await this.calendar.events.insert({\n calendarId,\n requestBody: this.toGoogleEvent(input),\n conferenceDataVersion: input.conference?.create ? 1 : undefined,\n auth: this.auth,\n });\n return this.fromGoogleEvent(calendarId, response.data);\n }\n\n async updateEvent(\n calendarId: string,\n eventId: string,\n input: CalendarEventUpdateInput\n ): Promise<CalendarEvent> {\n const response = await this.calendar.events.patch({\n calendarId: calendarId ?? this.defaultCalendarId,\n eventId,\n requestBody: this.toGoogleEvent(input),\n conferenceDataVersion: input.conference?.create ? 1 : undefined,\n auth: this.auth,\n });\n return this.fromGoogleEvent(calendarId, response.data);\n }\n\n async deleteEvent(calendarId: string, eventId: string): Promise<void> {\n await this.calendar.events.delete({\n calendarId: calendarId ?? this.defaultCalendarId,\n eventId,\n auth: this.auth,\n });\n }\n\n private fromGoogleEvent(\n calendarId: string,\n event: calendar_v3.Schema$Event\n ): CalendarEvent {\n const start = parseDateTime(event.start);\n const end = parseDateTime(event.end);\n const attendees =\n event.attendees?.map((attendee) => ({\n email: attendee.email ?? '',\n name: attendee.displayName ?? undefined,\n optional: attendee.optional ?? undefined,\n responseStatus: normalizeResponseStatus(attendee.responseStatus),\n })) ?? [];\n const reminders =\n event.reminders?.overrides?.map((reminder) => ({\n method: (reminder.method as 'email' | 'popup') ?? 'popup',\n minutesBeforeStart: reminder.minutes ?? 0,\n })) ?? [];\n const metadata = buildMetadata(event);\n return {\n id: event.id ?? '',\n calendarId,\n title: event.summary ?? '',\n description: event.description ?? undefined,\n location: event.location ?? undefined,\n start,\n end,\n allDay: event.start?.date ? true : undefined,\n attendees,\n reminders,\n conferenceLink:\n event.hangoutLink ??\n event.conferenceData?.entryPoints?.find((entry) => entry.uri)?.uri ??\n undefined,\n metadata,\n createdAt: event.created ? new Date(event.created) : undefined,\n updatedAt: event.updated ? new Date(event.updated) : undefined,\n };\n }\n\n private toGoogleEvent(\n input: CalendarEventInput | CalendarEventUpdateInput\n ): calendar_v3.Schema$Event {\n const event: calendar_v3.Schema$Event = {};\n if ('title' in input && input.title) event.summary = input.title;\n if (input.description !== undefined) event.description = input.description;\n if (input.location !== undefined) event.location = input.location;\n if (input.start) {\n event.start = formatDateTime(input.start, input.allDay);\n }\n if (input.end) {\n event.end = formatDateTime(input.end, input.allDay);\n }\n if (input.attendees) {\n event.attendees = input.attendees.map((attendee) => ({\n email: attendee.email,\n displayName: attendee.name,\n optional: attendee.optional,\n responseStatus: attendee.responseStatus,\n }));\n }\n if (input.reminders) {\n event.reminders = {\n useDefault: false,\n overrides: input.reminders.map((reminder) => ({\n method: reminder.method,\n minutes: reminder.minutesBeforeStart,\n })),\n };\n }\n if (input.conference?.create) {\n event.conferenceData = {\n createRequest: {\n requestId: `conf-${Date.now()}`,\n },\n };\n }\n if (input.metadata) {\n event.extendedProperties = {\n ...(event.extendedProperties ?? {}),\n private: {\n ...(event.extendedProperties?.private ?? {}),\n ...input.metadata,\n },\n };\n }\n return event;\n }\n}\n\nfunction parseDateTime(time?: calendar_v3.Schema$EventDateTime | null): Date {\n if (!time) return new Date();\n if (time.dateTime) return new Date(time.dateTime);\n if (time.date) return new Date(`${time.date}T00:00:00`);\n return new Date();\n}\n\nfunction formatDateTime(\n date: Date,\n allDay?: boolean\n): calendar_v3.Schema$EventDateTime {\n if (allDay) {\n return { date: date.toISOString().slice(0, 10) };\n }\n return { dateTime: date.toISOString() };\n}\n\ntype CalendarResponseStatus =\n | 'needsAction'\n | 'declined'\n | 'tentative'\n | 'accepted';\n\nfunction normalizeResponseStatus(\n status?: string | null\n): CalendarResponseStatus | undefined {\n if (!status) return undefined;\n const allowed: CalendarResponseStatus[] = [\n 'needsAction',\n 'declined',\n 'tentative',\n 'accepted',\n ];\n return allowed.includes(status as CalendarResponseStatus)\n ? (status as CalendarResponseStatus)\n : undefined;\n}\n\nfunction buildMetadata(\n event: calendar_v3.Schema$Event\n): Record<string, string> | undefined {\n const metadata: Record<string, string> = {};\n if (event.status) metadata.status = event.status;\n if (event.htmlLink) metadata.htmlLink = event.htmlLink;\n if (event.iCalUID) metadata.iCalUID = event.iCalUID;\n if (event.etag) metadata.etag = event.etag;\n if (event.conferenceData?.conferenceSolution?.name) {\n metadata.conferenceSolution = event.conferenceData.conferenceSolution.name;\n }\n if (event.extendedProperties?.private) {\n Object.entries(event.extendedProperties.private).forEach(([key, value]) => {\n if (typeof value === 'string') {\n metadata[`extended.${key}`] = value;\n }\n });\n }\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n"],"mappings":";;;AAiBA,IAAa,yBAAb,MAAgE;CAC9D,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAwC;AAClD,OAAK,OAAO,QAAQ;AACpB,OAAK,WACH,QAAQ,YACR,OAAO,SAAS;GACd,SAAS;GACT,MAAM,QAAQ;GACf,CAAC;AACJ,OAAK,oBAAoB,QAAQ,cAAc;;CAGjD,MAAM,WACJ,OACmC;EACnC,MAAM,WAAW,MAAM,KAAK,SAAS,OAAO,KAAK;GAC/C,YAAY,MAAM,cAAc,KAAK;GACrC,SAAS,MAAM,SAAS,aAAa;GACrC,SAAS,MAAM,SAAS,aAAa;GACrC,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,cAAc;GACd,SAAS;GACT,MAAM,KAAK;GACZ,CAAC;AAOF,SAAO;GACL,QALA,SAAS,KAAK,OAAO,KAAK,SACxB,KAAK,gBAAgB,MAAM,cAAc,KAAK,mBAAmB,KAAK,CACvE,IAAI,EAAE;GAIP,eAAe,SAAS,KAAK,iBAAiB;GAC/C;;CAGH,MAAM,YAAY,OAAmD;EACnE,MAAM,aAAa,MAAM,cAAc,KAAK;EAC5C,MAAM,WAAW,MAAM,KAAK,SAAS,OAAO,OAAO;GACjD;GACA,aAAa,KAAK,cAAc,MAAM;GACtC,uBAAuB,MAAM,YAAY,SAAS,IAAI;GACtD,MAAM,KAAK;GACZ,CAAC;AACF,SAAO,KAAK,gBAAgB,YAAY,SAAS,KAAK;;CAGxD,MAAM,YACJ,YACA,SACA,OACwB;EACxB,MAAM,WAAW,MAAM,KAAK,SAAS,OAAO,MAAM;GAChD,YAAY,cAAc,KAAK;GAC/B;GACA,aAAa,KAAK,cAAc,MAAM;GACtC,uBAAuB,MAAM,YAAY,SAAS,IAAI;GACtD,MAAM,KAAK;GACZ,CAAC;AACF,SAAO,KAAK,gBAAgB,YAAY,SAAS,KAAK;;CAGxD,MAAM,YAAY,YAAoB,SAAgC;AACpE,QAAM,KAAK,SAAS,OAAO,OAAO;GAChC,YAAY,cAAc,KAAK;GAC/B;GACA,MAAM,KAAK;GACZ,CAAC;;CAGJ,AAAQ,gBACN,YACA,OACe;EACf,MAAM,QAAQ,cAAc,MAAM,MAAM;EACxC,MAAM,MAAM,cAAc,MAAM,IAAI;EACpC,MAAM,YACJ,MAAM,WAAW,KAAK,cAAc;GAClC,OAAO,SAAS,SAAS;GACzB,MAAM,SAAS,eAAe;GAC9B,UAAU,SAAS,YAAY;GAC/B,gBAAgB,wBAAwB,SAAS,eAAe;GACjE,EAAE,IAAI,EAAE;EACX,MAAM,YACJ,MAAM,WAAW,WAAW,KAAK,cAAc;GAC7C,QAAS,SAAS,UAAgC;GAClD,oBAAoB,SAAS,WAAW;GACzC,EAAE,IAAI,EAAE;EACX,MAAM,WAAW,cAAc,MAAM;AACrC,SAAO;GACL,IAAI,MAAM,MAAM;GAChB;GACA,OAAO,MAAM,WAAW;GACxB,aAAa,MAAM,eAAe;GAClC,UAAU,MAAM,YAAY;GAC5B;GACA;GACA,QAAQ,MAAM,OAAO,OAAO,OAAO;GACnC;GACA;GACA,gBACE,MAAM,eACN,MAAM,gBAAgB,aAAa,MAAM,UAAU,MAAM,IAAI,EAAE,OAC/D;GACF;GACA,WAAW,MAAM,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG;GACrD,WAAW,MAAM,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG;GACtD;;CAGH,AAAQ,cACN,OAC0B;EAC1B,MAAMA,QAAkC,EAAE;AAC1C,MAAI,WAAW,SAAS,MAAM,MAAO,OAAM,UAAU,MAAM;AAC3D,MAAI,MAAM,gBAAgB,OAAW,OAAM,cAAc,MAAM;AAC/D,MAAI,MAAM,aAAa,OAAW,OAAM,WAAW,MAAM;AACzD,MAAI,MAAM,MACR,OAAM,QAAQ,eAAe,MAAM,OAAO,MAAM,OAAO;AAEzD,MAAI,MAAM,IACR,OAAM,MAAM,eAAe,MAAM,KAAK,MAAM,OAAO;AAErD,MAAI,MAAM,UACR,OAAM,YAAY,MAAM,UAAU,KAAK,cAAc;GACnD,OAAO,SAAS;GAChB,aAAa,SAAS;GACtB,UAAU,SAAS;GACnB,gBAAgB,SAAS;GAC1B,EAAE;AAEL,MAAI,MAAM,UACR,OAAM,YAAY;GAChB,YAAY;GACZ,WAAW,MAAM,UAAU,KAAK,cAAc;IAC5C,QAAQ,SAAS;IACjB,SAAS,SAAS;IACnB,EAAE;GACJ;AAEH,MAAI,MAAM,YAAY,OACpB,OAAM,iBAAiB,EACrB,eAAe,EACb,WAAW,QAAQ,KAAK,KAAK,IAC9B,EACF;AAEH,MAAI,MAAM,SACR,OAAM,qBAAqB;GACzB,GAAI,MAAM,sBAAsB,EAAE;GAClC,SAAS;IACP,GAAI,MAAM,oBAAoB,WAAW,EAAE;IAC3C,GAAG,MAAM;IACV;GACF;AAEH,SAAO;;;AAIX,SAAS,cAAc,MAAsD;AAC3E,KAAI,CAAC,KAAM,wBAAO,IAAI,MAAM;AAC5B,KAAI,KAAK,SAAU,QAAO,IAAI,KAAK,KAAK,SAAS;AACjD,KAAI,KAAK,KAAM,wBAAO,IAAI,KAAK,GAAG,KAAK,KAAK,WAAW;AACvD,wBAAO,IAAI,MAAM;;AAGnB,SAAS,eACP,MACA,QACkC;AAClC,KAAI,OACF,QAAO,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;AAElD,QAAO,EAAE,UAAU,KAAK,aAAa,EAAE;;AASzC,SAAS,wBACP,QACoC;AACpC,KAAI,CAAC,OAAQ,QAAO;AAOpB,QAN0C;EACxC;EACA;EACA;EACA;EACD,CACc,SAAS,OAAiC,GACpD,SACD;;AAGN,SAAS,cACP,OACoC;CACpC,MAAMC,WAAmC,EAAE;AAC3C,KAAI,MAAM,OAAQ,UAAS,SAAS,MAAM;AAC1C,KAAI,MAAM,SAAU,UAAS,WAAW,MAAM;AAC9C,KAAI,MAAM,QAAS,UAAS,UAAU,MAAM;AAC5C,KAAI,MAAM,KAAM,UAAS,OAAO,MAAM;AACtC,KAAI,MAAM,gBAAgB,oBAAoB,KAC5C,UAAS,qBAAqB,MAAM,eAAe,mBAAmB;AAExE,KAAI,MAAM,oBAAoB,QAC5B,QAAO,QAAQ,MAAM,mBAAmB,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW;AACzE,MAAI,OAAO,UAAU,SACnB,UAAS,YAAY,SAAS;GAEhC;AAEJ,QAAO,OAAO,KAAK,SAAS,CAAC,SAAS,IAAI,WAAW"}
@@ -0,0 +1,15 @@
1
+ import { ElevenLabsVoiceProvider, ElevenLabsVoiceProviderOptions } from "./elevenlabs-voice.js";
2
+ import { GoogleCloudStorageProvider, GoogleCloudStorageProviderOptions } from "./gcs-storage.js";
3
+ import { GmailInboundProvider, GmailInboundProviderOptions } from "./gmail-inbound.js";
4
+ import { GmailOutboundProvider, GmailOutboundProviderOptions } from "./gmail-outbound.js";
5
+ import { GoogleCalendarProvider, GoogleCalendarProviderOptions } from "./google-calendar.js";
6
+ import { IntegrationProviderFactory } from "./provider-factory.js";
7
+ import { MistralLLMProvider, MistralLLMProviderOptions } from "./mistral-llm.js";
8
+ import { MistralEmbeddingProvider, MistralEmbeddingProviderOptions } from "./mistral-embedding.js";
9
+ import { QdrantVectorProvider, QdrantVectorProviderOptions } from "./qdrant-vector.js";
10
+ import { StripePaymentsProvider, StripePaymentsProviderOptions } from "./stripe-payments.js";
11
+ import { PostmarkEmailProvider, PostmarkEmailProviderOptions } from "./postmark-email.js";
12
+ import { TwilioSmsProvider, TwilioSmsProviderOptions } from "./twilio-sms.js";
13
+ import { PowensAccount, PowensAccountListResponse, PowensBalance, PowensClient, PowensClientError, PowensClientOptions, PowensConnectionStatusResponse, PowensEnvironment, PowensTransaction, PowensTransactionListResponse } from "./powens-client.js";
14
+ import { PowensOpenBankingProvider, PowensOpenBankingProviderOptions } from "./powens-openbanking.js";
15
+ export { ElevenLabsVoiceProvider, ElevenLabsVoiceProviderOptions, GmailInboundProvider, GmailInboundProviderOptions, GmailOutboundProvider, GmailOutboundProviderOptions, GoogleCalendarProvider, GoogleCalendarProviderOptions, GoogleCloudStorageProvider, GoogleCloudStorageProviderOptions, IntegrationProviderFactory, MistralEmbeddingProvider, MistralEmbeddingProviderOptions, MistralLLMProvider, MistralLLMProviderOptions, PostmarkEmailProvider, PostmarkEmailProviderOptions, PowensAccount, PowensAccountListResponse, PowensBalance, PowensClient, PowensClientError, PowensClientOptions, PowensConnectionStatusResponse, PowensEnvironment, PowensOpenBankingProvider, PowensOpenBankingProviderOptions, PowensTransaction, PowensTransactionListResponse, QdrantVectorProvider, QdrantVectorProviderOptions, StripePaymentsProvider, StripePaymentsProviderOptions, TwilioSmsProvider, TwilioSmsProviderOptions };
@@ -0,0 +1,16 @@
1
+ import { MistralLLMProvider } from "./mistral-llm.js";
2
+ import { MistralEmbeddingProvider } from "./mistral-embedding.js";
3
+ import { QdrantVectorProvider } from "./qdrant-vector.js";
4
+ import { GoogleCloudStorageProvider } from "./gcs-storage.js";
5
+ import { StripePaymentsProvider } from "./stripe-payments.js";
6
+ import { PostmarkEmailProvider } from "./postmark-email.js";
7
+ import { TwilioSmsProvider } from "./twilio-sms.js";
8
+ import { ElevenLabsVoiceProvider } from "./elevenlabs-voice.js";
9
+ import { PowensClient, PowensClientError } from "./powens-client.js";
10
+ import { PowensOpenBankingProvider } from "./powens-openbanking.js";
11
+ import { IntegrationProviderFactory } from "./provider-factory.js";
12
+ import { GmailInboundProvider } from "./gmail-inbound.js";
13
+ import { GmailOutboundProvider } from "./gmail-outbound.js";
14
+ import { GoogleCalendarProvider } from "./google-calendar.js";
15
+
16
+ export { ElevenLabsVoiceProvider, GmailInboundProvider, GmailOutboundProvider, GoogleCalendarProvider, GoogleCloudStorageProvider, IntegrationProviderFactory, MistralEmbeddingProvider, MistralLLMProvider, PostmarkEmailProvider, PowensClient, PowensClientError, PowensOpenBankingProvider, QdrantVectorProvider, StripePaymentsProvider, TwilioSmsProvider };
@@ -0,0 +1,24 @@
1
+ import { embedding_d_exports } from "../embedding.js";
2
+ import { Mistral } from "@mistralai/mistralai";
3
+
4
+ //#region src/impls/mistral-embedding.d.ts
5
+ interface MistralEmbeddingProviderOptions {
6
+ apiKey: string;
7
+ defaultModel?: string;
8
+ serverURL?: string;
9
+ client?: Mistral;
10
+ }
11
+ declare class MistralEmbeddingProvider implements embedding_d_exports.EmbeddingProvider {
12
+ private readonly client;
13
+ private readonly defaultModel;
14
+ constructor(options: MistralEmbeddingProviderOptions);
15
+ embedDocuments(documents: embedding_d_exports.EmbeddingDocument[], options?: {
16
+ model?: string;
17
+ }): Promise<embedding_d_exports.EmbeddingResult[]>;
18
+ embedQuery(query: string, options?: {
19
+ model?: string;
20
+ }): Promise<embedding_d_exports.EmbeddingResult>;
21
+ }
22
+ //#endregion
23
+ export { MistralEmbeddingProvider, MistralEmbeddingProviderOptions };
24
+ //# sourceMappingURL=mistral-embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral-embedding.d.ts","names":[],"sources":["../../src/impls/mistral-embedding.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,+BAAA;;EAAA,YAAA,CAAA,EAAA,MAAA;EAOJ,SAAA,CAAA,EAAA,MAAA;EAIU,MAAA,CAAA,EAPZ,OAOY;;AAiBV,cArBA,wBAAA,YAAoC,mBAAA,CAAA,iBAqBpC,CAAA;EAAR,iBAAA,MAAA;EA4BQ,iBAAA,YAAA;EAAR,WAAA,CAAA,OAAA,EA7CkB,+BA6ClB;EAjD4C,cAAA,CAAA,SAAA,EAmBlC,mBAAA,CAAA,iBAnBkC,EAAA,EAAA,QAAA,EAAA;IAAiB,KAAA,CAAA,EAAA,MAAA;MAqB7D,QAAQ,mBAAA,CAAA;;;MA4BR,QAAQ,mBAAA,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { Mistral } from "@mistralai/mistralai";
2
+
3
+ //#region src/impls/mistral-embedding.ts
4
+ var MistralEmbeddingProvider = class {
5
+ client;
6
+ defaultModel;
7
+ constructor(options) {
8
+ if (!options.apiKey) throw new Error("MistralEmbeddingProvider requires an apiKey");
9
+ this.client = options.client ?? new Mistral({
10
+ apiKey: options.apiKey,
11
+ serverURL: options.serverURL
12
+ });
13
+ this.defaultModel = options.defaultModel ?? "mistral-embed";
14
+ }
15
+ async embedDocuments(documents, options) {
16
+ if (documents.length === 0) return [];
17
+ const model = options?.model ?? this.defaultModel;
18
+ const response = await this.client.embeddings.create({
19
+ model,
20
+ inputs: documents.map((doc) => doc.text)
21
+ });
22
+ return response.data.map((item, index) => ({
23
+ id: documents[index]?.id ?? (item.index != null ? `embedding-${item.index}` : `embedding-${index}`),
24
+ vector: item.embedding ?? [],
25
+ dimensions: item.embedding?.length ?? 0,
26
+ model: response.model,
27
+ metadata: documents[index]?.metadata ? Object.fromEntries(Object.entries(documents[index]?.metadata ?? {}).map(([key, value]) => [key, String(value)])) : void 0
28
+ }));
29
+ }
30
+ async embedQuery(query, options) {
31
+ const [result] = await this.embedDocuments([{
32
+ id: "query",
33
+ text: query
34
+ }], options);
35
+ if (!result) throw new Error("Failed to compute embedding for query");
36
+ return result;
37
+ }
38
+ };
39
+
40
+ //#endregion
41
+ export { MistralEmbeddingProvider };
42
+ //# sourceMappingURL=mistral-embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral-embedding.js","names":[],"sources":["../../src/impls/mistral-embedding.ts"],"sourcesContent":["import { Mistral } from '@mistralai/mistralai';\n\nimport type {\n EmbeddingDocument,\n EmbeddingProvider,\n EmbeddingResult,\n} from '../embedding';\n\nexport interface MistralEmbeddingProviderOptions {\n apiKey: string;\n defaultModel?: string;\n serverURL?: string;\n client?: Mistral;\n}\n\nexport class MistralEmbeddingProvider implements EmbeddingProvider {\n private readonly client: Mistral;\n private readonly defaultModel: string;\n\n constructor(options: MistralEmbeddingProviderOptions) {\n if (!options.apiKey) {\n throw new Error('MistralEmbeddingProvider requires an apiKey');\n }\n\n this.client =\n options.client ??\n new Mistral({\n apiKey: options.apiKey,\n serverURL: options.serverURL,\n });\n this.defaultModel = options.defaultModel ?? 'mistral-embed';\n }\n\n async embedDocuments(\n documents: EmbeddingDocument[],\n options?: { model?: string }\n ): Promise<EmbeddingResult[]> {\n if (documents.length === 0) return [];\n const model = options?.model ?? this.defaultModel;\n const response = await this.client.embeddings.create({\n model,\n inputs: documents.map((doc) => doc.text),\n });\n\n return response.data.map((item, index) => ({\n id:\n documents[index]?.id ??\n (item.index != null ? `embedding-${item.index}` : `embedding-${index}`),\n vector: item.embedding ?? [],\n dimensions: item.embedding?.length ?? 0,\n model: response.model,\n metadata: documents[index]?.metadata\n ? Object.fromEntries(\n Object.entries(documents[index]?.metadata ?? {}).map(\n ([key, value]) => [key, String(value)]\n )\n )\n : undefined,\n }));\n }\n\n async embedQuery(\n query: string,\n options?: { model?: string }\n ): Promise<EmbeddingResult> {\n const [result] = await this.embedDocuments(\n [{ id: 'query', text: query }],\n options\n );\n if (!result) {\n throw new Error('Failed to compute embedding for query');\n }\n return result;\n }\n}\n"],"mappings":";;;AAeA,IAAa,2BAAb,MAAmE;CACjE,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAA0C;AACpD,MAAI,CAAC,QAAQ,OACX,OAAM,IAAI,MAAM,8CAA8C;AAGhE,OAAK,SACH,QAAQ,UACR,IAAI,QAAQ;GACV,QAAQ,QAAQ;GAChB,WAAW,QAAQ;GACpB,CAAC;AACJ,OAAK,eAAe,QAAQ,gBAAgB;;CAG9C,MAAM,eACJ,WACA,SAC4B;AAC5B,MAAI,UAAU,WAAW,EAAG,QAAO,EAAE;EACrC,MAAM,QAAQ,SAAS,SAAS,KAAK;EACrC,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;GACnD;GACA,QAAQ,UAAU,KAAK,QAAQ,IAAI,KAAK;GACzC,CAAC;AAEF,SAAO,SAAS,KAAK,KAAK,MAAM,WAAW;GACzC,IACE,UAAU,QAAQ,OACjB,KAAK,SAAS,OAAO,aAAa,KAAK,UAAU,aAAa;GACjE,QAAQ,KAAK,aAAa,EAAE;GAC5B,YAAY,KAAK,WAAW,UAAU;GACtC,OAAO,SAAS;GAChB,UAAU,UAAU,QAAQ,WACxB,OAAO,YACL,OAAO,QAAQ,UAAU,QAAQ,YAAY,EAAE,CAAC,CAAC,KAC9C,CAAC,KAAK,WAAW,CAAC,KAAK,OAAO,MAAM,CAAC,CACvC,CACF,GACD;GACL,EAAE;;CAGL,MAAM,WACJ,OACA,SAC0B;EAC1B,MAAM,CAAC,UAAU,MAAM,KAAK,eAC1B,CAAC;GAAE,IAAI;GAAS,MAAM;GAAO,CAAC,EAC9B,QACD;AACD,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,wCAAwC;AAE1D,SAAO"}
@@ -0,0 +1,32 @@
1
+ import { llm_d_exports } from "../llm.js";
2
+ import { Mistral } from "@mistralai/mistralai";
3
+
4
+ //#region src/impls/mistral-llm.d.ts
5
+ interface MistralLLMProviderOptions {
6
+ apiKey: string;
7
+ defaultModel?: string;
8
+ serverURL?: string;
9
+ client?: Mistral;
10
+ userAgentSuffix?: string;
11
+ }
12
+ declare class MistralLLMProvider implements llm_d_exports.LLMProvider {
13
+ private readonly client;
14
+ private readonly defaultModel;
15
+ constructor(options: MistralLLMProviderOptions);
16
+ chat(messages: llm_d_exports.LLMMessage[], options?: llm_d_exports.LLMChatOptions): Promise<llm_d_exports.LLMResponse>;
17
+ stream(messages: llm_d_exports.LLMMessage[], options?: llm_d_exports.LLMChatOptions): AsyncIterable<llm_d_exports.LLMStreamChunk>;
18
+ countTokens(_messages: llm_d_exports.LLMMessage[]): Promise<{
19
+ promptTokens: number;
20
+ }>;
21
+ private buildChatRequest;
22
+ private buildLLMResponse;
23
+ private fromUsage;
24
+ private fromAssistantMessage;
25
+ private fromMistralToolCall;
26
+ private toMistralMessage;
27
+ private extractText;
28
+ private extractToolCalls;
29
+ }
30
+ //#endregion
31
+ export { MistralLLMProvider, MistralLLMProviderOptions };
32
+ //# sourceMappingURL=mistral-llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral-llm.d.ts","names":[],"sources":["../../src/impls/mistral-llm.ts"],"sourcesContent":[],"mappings":";;;;UAciB,yBAAA;;EAAA,YAAA,CAAA,EAAA,MAAA;EAQJ,SAAA,CAAA,EAAA,MAAA;EAIU,MAAA,CAAA,EARZ,OAQY;EAkBT,eAAA,CAAA,EAAA,MAAA;;AAED,cAxBA,kBAAA,YAA8B,aAAA,CAAA,WAwB9B,CAAA;EAAR,iBAAA,MAAA;EAOS,iBAAA,YAAA;EACD,WAAA,CAAA,OAAA,EA5BU,yBA4BV;EACM,IAAA,CAAA,QAAA,EAXL,aAAA,CAAA,UAWK,EAAA,EAAA,OAAA,CAAA,EAVN,aAAA,CAAA,cAUM,CAAA,EATd,OASc,CATN,aAAA,CAAA,WASM,CAAA;EAAd,MAAA,CAAA,QAAA,EAFS,aAAA,CAAA,UAET,EAAA,EAAA,OAAA,CAAA,EADQ,aAAA,CAAA,cACR,CAAA,EAAA,aAAA,CAAc,aAAA,CAAA,cAAd,CAAA;EAuFU,WAAA,CAAA,SAAA,EAAA,aAAA,CAAA,UAAA,EAAA,CAAA,EACV,OADU,CAAA;IACV,YAAA,EAAA,MAAA;EAzHsC,CAAA,CAAA;EAAW,QAAA,gBAAA"}