@wildo-ai/external-connectors-models 1.1.5 → 1.1.6

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 (46) hide show
  1. package/dist/esm/.native.tsbuildinfo +1 -0
  2. package/dist/esm/core/commons.external-connectors-models.schemas.d.ts +10 -0
  3. package/dist/esm/core/commons.external-connectors-models.schemas.d.ts.map +1 -1
  4. package/dist/esm/core/commons.external-connectors-models.schemas.js +10 -0
  5. package/dist/esm/core/commons.external-connectors-models.schemas.js.map +1 -1
  6. package/dist/esm/index.d.ts +3 -0
  7. package/dist/esm/index.d.ts.map +1 -1
  8. package/dist/esm/index.js +3 -0
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/protocols/agent-client-protocol.external-connectors-models.schemas.d.ts +52 -0
  11. package/dist/esm/protocols/agent-client-protocol.external-connectors-models.schemas.d.ts.map +1 -1
  12. package/dist/esm/protocols/agent-client-protocol.external-connectors-models.schemas.js +58 -1
  13. package/dist/esm/protocols/agent-client-protocol.external-connectors-models.schemas.js.map +1 -1
  14. package/dist/esm/protocols/billing.standard-interface.schemas.d.ts +129 -4
  15. package/dist/esm/protocols/billing.standard-interface.schemas.d.ts.map +1 -1
  16. package/dist/esm/protocols/billing.standard-interface.schemas.js.map +1 -1
  17. package/dist/esm/protocols/document-extraction.external-connectors-models.schemas.d.ts +56 -1
  18. package/dist/esm/protocols/document-extraction.external-connectors-models.schemas.d.ts.map +1 -1
  19. package/dist/esm/protocols/document-extraction.external-connectors-models.schemas.js +25 -0
  20. package/dist/esm/protocols/document-extraction.external-connectors-models.schemas.js.map +1 -1
  21. package/dist/esm/protocols/email-inbound.standard-interface.schemas.d.ts +229 -0
  22. package/dist/esm/protocols/email-inbound.standard-interface.schemas.d.ts.map +1 -0
  23. package/dist/esm/protocols/email-inbound.standard-interface.schemas.js +160 -0
  24. package/dist/esm/protocols/email-inbound.standard-interface.schemas.js.map +1 -0
  25. package/dist/esm/protocols/file-storage.standard-interface.d.ts +179 -0
  26. package/dist/esm/protocols/file-storage.standard-interface.d.ts.map +1 -0
  27. package/dist/esm/protocols/file-storage.standard-interface.js +79 -0
  28. package/dist/esm/protocols/file-storage.standard-interface.js.map +1 -0
  29. package/dist/esm/protocols/hooks.external-connectors-models.schemas.d.ts +19 -1
  30. package/dist/esm/protocols/hooks.external-connectors-models.schemas.d.ts.map +1 -1
  31. package/dist/esm/protocols/hooks.external-connectors-models.schemas.js +11 -0
  32. package/dist/esm/protocols/hooks.external-connectors-models.schemas.js.map +1 -1
  33. package/dist/esm/protocols/llm.external-connectors-models.schemas.d.ts +8 -0
  34. package/dist/esm/protocols/llm.external-connectors-models.schemas.d.ts.map +1 -1
  35. package/dist/esm/protocols/llm.external-connectors-models.schemas.js +10 -0
  36. package/dist/esm/protocols/llm.external-connectors-models.schemas.js.map +1 -1
  37. package/dist/esm/protocols/provider-oauth2-token-endpoint-hosts.external-connectors-models.d.ts +39 -0
  38. package/dist/esm/protocols/provider-oauth2-token-endpoint-hosts.external-connectors-models.d.ts.map +1 -0
  39. package/dist/esm/protocols/provider-oauth2-token-endpoint-hosts.external-connectors-models.js +66 -0
  40. package/dist/esm/protocols/provider-oauth2-token-endpoint-hosts.external-connectors-models.js.map +1 -0
  41. package/dist/esm/protocols/rest-operations.external-connectors-models.schemas.d.ts +337 -5
  42. package/dist/esm/protocols/rest-operations.external-connectors-models.schemas.d.ts.map +1 -1
  43. package/dist/esm/protocols/rest-operations.external-connectors-models.schemas.js +324 -1
  44. package/dist/esm/protocols/rest-operations.external-connectors-models.schemas.js.map +1 -1
  45. package/dist/tsconfig.build.tsbuildinfo +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,229 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * One authentication method's result, as a receiving server records it in `Authentication-Results`.
4
+ *
5
+ * The union of the results the three methods define, so one vocabulary serves SPF, DKIM and DMARC.
6
+ * Two members go beyond what a DMARC result can be — `SOFTFAIL` (SPF only) and `POLICY` (DKIM and
7
+ * SPF) — and are here because mapping them onto a neighbour would record a result the receiver did
8
+ * not report: a softfail is neither a fail nor neutral.
9
+ *
10
+ * spec-cite: RFC 8601 §2.7.1 (DKIM results: none, pass, fail, policy, neutral, temperror, permerror)
11
+ * and §2.7.2 (SPF results: none, pass, fail, softfail, neutral, temperror, permerror, plus policy
12
+ * from §2.4); DMARC results per RFC 7489 §11.2 (none, pass, fail, temperror, permerror). Fetched 2026-09-27.
13
+ */
14
+ export declare enum EmailAuthenticationVerdict {
15
+ PASS = "pass",
16
+ FAIL = "fail",
17
+ SOFTFAIL = "softfail",
18
+ NEUTRAL = "neutral",
19
+ NONE = "none",
20
+ POLICY = "policy",
21
+ TEMPERROR = "temperror",
22
+ PERMERROR = "permerror"
23
+ }
24
+ /**
25
+ * What the receiving provider concluded about a message's origin.
26
+ *
27
+ * `dmarcAligned` is kept beside the DMARC verdict rather than folded into it because it is the fact
28
+ * sender assurance is built on: DMARC authenticates the `From` DOMAIN by requiring that it align with
29
+ * an identifier SPF or DKIM authenticated. A provider that reports DMARC `pass` has already required
30
+ * alignment, so for most vendors `dmarcAligned` equals `dmarc === PASS`; it is a separate field so a
31
+ * vendor that reports the two independently is not forced to invent one from the other.
32
+ */
33
+ export declare const StandardInboundEmail_AuthenticationSchema: z.ZodObject<{
34
+ spf: z.ZodEnum<typeof EmailAuthenticationVerdict>;
35
+ dkim: z.ZodEnum<typeof EmailAuthenticationVerdict>;
36
+ dmarc: z.ZodEnum<typeof EmailAuthenticationVerdict>;
37
+ dmarcAligned: z.ZodBoolean;
38
+ }, z.core.$strip>;
39
+ export type StandardInboundEmail_Authentication = z.infer<typeof StandardInboundEmail_AuthenticationSchema>;
40
+ export declare const StandardInboundEmail_AddressSchema: z.ZodObject<{
41
+ address: z.ZodString;
42
+ name: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strip>;
44
+ export type StandardInboundEmail_Address = z.infer<typeof StandardInboundEmail_AddressSchema>;
45
+ /** How a MIME part asks to be presented (`Content-Disposition`). spec-cite: RFC 2183 §2.1 (`inline`) and §2.2 (`attachment`). */
46
+ export declare enum EmailAttachmentDisposition {
47
+ ATTACHMENT = "attachment",
48
+ INLINE = "inline"
49
+ }
50
+ /** One attachment as the provider describes it. The bytes are fetched through `openAttachment`, never inlined. */
51
+ export declare const StandardInboundEmail_AttachmentSchema: z.ZodObject<{
52
+ ref: z.ZodString;
53
+ filename: z.ZodString;
54
+ contentType: z.ZodString;
55
+ sizeBytes: z.ZodNumber;
56
+ contentId: z.ZodOptional<z.ZodString>;
57
+ disposition: z.ZodOptional<z.ZodEnum<typeof EmailAttachmentDisposition>>;
58
+ }, z.core.$strip>;
59
+ export type StandardInboundEmail_Attachment = z.infer<typeof StandardInboundEmail_AttachmentSchema>;
60
+ /**
61
+ * What a provider's notification says, parsed. Small on purpose: a notification tells the engine
62
+ * THAT a message arrived and where to fetch it, and nothing past this point trusts it for more.
63
+ */
64
+ export declare const StandardInboundEmail_NotificationSchema: z.ZodObject<{
65
+ providerMessageId: z.ZodString;
66
+ receivedFor: z.ZodArray<z.ZodString>;
67
+ receivedAt: z.ZodCoercedDate<unknown>;
68
+ }, z.core.$strip>;
69
+ export type StandardInboundEmail_Notification = z.infer<typeof StandardInboundEmail_NotificationSchema>;
70
+ /**
71
+ * One received message, provider-neutral.
72
+ *
73
+ * The threading headers are separated out because the engine correlates threads from them;
74
+ * `headers` carries the rest, for a channel record that chooses to keep an allow-listed subset.
75
+ */
76
+ export declare const StandardInboundEmail_MessageSchema: z.ZodObject<{
77
+ providerMessageId: z.ZodString;
78
+ messageId: z.ZodOptional<z.ZodString>;
79
+ inReplyTo: z.ZodOptional<z.ZodString>;
80
+ references: z.ZodDefault<z.ZodArray<z.ZodString>>;
81
+ from: z.ZodObject<{
82
+ address: z.ZodString;
83
+ name: z.ZodOptional<z.ZodString>;
84
+ }, z.core.$strip>;
85
+ to: z.ZodDefault<z.ZodArray<z.ZodObject<{
86
+ address: z.ZodString;
87
+ name: z.ZodOptional<z.ZodString>;
88
+ }, z.core.$strip>>>;
89
+ cc: z.ZodDefault<z.ZodArray<z.ZodObject<{
90
+ address: z.ZodString;
91
+ name: z.ZodOptional<z.ZodString>;
92
+ }, z.core.$strip>>>;
93
+ replyTo: z.ZodOptional<z.ZodObject<{
94
+ address: z.ZodString;
95
+ name: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strip>>;
97
+ receivedFor: z.ZodArray<z.ZodString>;
98
+ subject: z.ZodDefault<z.ZodString>;
99
+ textBody: z.ZodOptional<z.ZodString>;
100
+ htmlBody: z.ZodOptional<z.ZodString>;
101
+ headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
102
+ authentication: z.ZodObject<{
103
+ spf: z.ZodEnum<typeof EmailAuthenticationVerdict>;
104
+ dkim: z.ZodEnum<typeof EmailAuthenticationVerdict>;
105
+ dmarc: z.ZodEnum<typeof EmailAuthenticationVerdict>;
106
+ dmarcAligned: z.ZodBoolean;
107
+ }, z.core.$strip>;
108
+ attachments: z.ZodDefault<z.ZodArray<z.ZodObject<{
109
+ ref: z.ZodString;
110
+ filename: z.ZodString;
111
+ contentType: z.ZodString;
112
+ sizeBytes: z.ZodNumber;
113
+ contentId: z.ZodOptional<z.ZodString>;
114
+ disposition: z.ZodOptional<z.ZodEnum<typeof EmailAttachmentDisposition>>;
115
+ }, z.core.$strip>>>;
116
+ sizeBytes: z.ZodOptional<z.ZodNumber>;
117
+ receivedAt: z.ZodCoercedDate<unknown>;
118
+ rawRef: z.ZodOptional<z.ZodString>;
119
+ }, z.core.$strip>;
120
+ export type StandardInboundEmail_Message = z.infer<typeof StandardInboundEmail_MessageSchema>;
121
+ /** The bytes of one attachment. */
122
+ export interface StandardInboundEmail_OpenedAttachment {
123
+ readonly bytes: Uint8Array;
124
+ readonly contentType: string;
125
+ readonly filename: string;
126
+ }
127
+ /** The original bytes of a message, exactly as the provider serves them. */
128
+ export interface StandardInboundEmail_OpenedRaw {
129
+ readonly bytes: Uint8Array;
130
+ }
131
+ /** Where a domain stands AT THE PROVIDER — distinct from the organization's own status, which also records ownership proof. */
132
+ export declare enum EmailProviderDomainStatus {
133
+ /** The provider has not verified the domain's records yet (not started, pending, or a temporary failure it will retry). */
134
+ PENDING = "pending",
135
+ /** The provider verified the domain's records. */
136
+ VERIFIED = "verified",
137
+ /** The provider gave up verifying the records. */
138
+ FAILED = "failed"
139
+ }
140
+ /** One DNS record the provider asks to be published. */
141
+ export declare const StandardEmailDomain_DnsRecordSchema: z.ZodObject<{
142
+ purpose: z.ZodString;
143
+ type: z.ZodString;
144
+ name: z.ZodString;
145
+ value: z.ZodString;
146
+ priority: z.ZodOptional<z.ZodNumber>;
147
+ status: z.ZodOptional<z.ZodString>;
148
+ }, z.core.$strip>;
149
+ export type StandardEmailDomain_DnsRecord = z.infer<typeof StandardEmailDomain_DnsRecordSchema>;
150
+ /** A domain as the provider describes it. */
151
+ export declare const StandardEmailDomainSchema: z.ZodObject<{
152
+ providerDomainId: z.ZodString;
153
+ name: z.ZodString;
154
+ status: z.ZodEnum<typeof EmailProviderDomainStatus>;
155
+ sending: z.ZodBoolean;
156
+ receiving: z.ZodBoolean;
157
+ records: z.ZodDefault<z.ZodArray<z.ZodObject<{
158
+ purpose: z.ZodString;
159
+ type: z.ZodString;
160
+ name: z.ZodString;
161
+ value: z.ZodString;
162
+ priority: z.ZodOptional<z.ZodNumber>;
163
+ status: z.ZodOptional<z.ZodString>;
164
+ }, z.core.$strip>>>;
165
+ }, z.core.$strip>;
166
+ export type StandardEmailDomain = z.infer<typeof StandardEmailDomainSchema>;
167
+ /**
168
+ * What an EMAIL_INBOUND provider implements to host an organization's own domain. Every tenant shares one
169
+ * provider account, so the ENGINE proves the organization owns the domain before it ever calls `createDomain`.
170
+ */
171
+ export interface StandardEmailDomains_Interface {
172
+ createDomain(input: {
173
+ readonly name: string;
174
+ readonly sending: boolean;
175
+ readonly receiving: boolean;
176
+ }): Promise<StandardEmailDomain>;
177
+ getDomain(providerDomainId: string): Promise<StandardEmailDomain | null>;
178
+ /** Start the provider's (asynchronous) verification. */
179
+ verifyDomain(providerDomainId: string): Promise<void>;
180
+ deleteDomain(providerDomainId: string): Promise<void>;
181
+ }
182
+ /**
183
+ * What an EMAIL_INBOUND provider implements. Built by the provider module's adapter factory with the
184
+ * credential the engine resolved, exactly as a billing adapter is — the module never reads a secret
185
+ * itself.
186
+ */
187
+ export interface StandardInboundEmail_Interface {
188
+ /** Map the verified notification body onto the standard notification. Pure; refuses an unknown shape by throwing. */
189
+ parseNotification(body: unknown): StandardInboundEmail_Notification;
190
+ /** Fetch the whole message the notification announced. */
191
+ fetchMessage(providerMessageId: string): Promise<StandardInboundEmail_Message>;
192
+ /** Fetch one attachment's bytes, by the `ref` the message listed. */
193
+ openAttachment(ref: string): Promise<StandardInboundEmail_OpenedAttachment>;
194
+ /** Fetch the original message bytes, by the message's `rawRef`. */
195
+ openRaw(rawRef: string): Promise<StandardInboundEmail_OpenedRaw>;
196
+ }
197
+ /**
198
+ * One request a provider module asks the engine to make on its behalf.
199
+ *
200
+ * `path` is appended to the contract's `baseUrl`. A provider that serves bytes from ANOTHER host (a
201
+ * signed download URL) returns `url` instead, and the engine admits it only against the hosts the
202
+ * contract declares — a provider-supplied URL is never fetched merely because a provider named it.
203
+ */
204
+ export type InboundEmailProviderRequest = {
205
+ readonly path: string;
206
+ readonly method?: EmailProviderHttpMethod;
207
+ readonly jsonBody?: unknown;
208
+ readonly headers?: Readonly<Record<string, string>>;
209
+ } | {
210
+ readonly url: string;
211
+ readonly headers?: Readonly<Record<string, string>>;
212
+ };
213
+ /**
214
+ * The methods a provider's `path` request may use. A `url` request (a signed download link) is always a GET.
215
+ * Absent means GET.
216
+ */
217
+ export declare enum EmailProviderHttpMethod {
218
+ GET = "GET",
219
+ POST = "POST",
220
+ PATCH = "PATCH",
221
+ DELETE = "DELETE"
222
+ }
223
+ /** A provider's HTTP answer, as the engine hands it to the provider's parser. */
224
+ export interface InboundEmailProviderResponseInput {
225
+ readonly status: number;
226
+ /** The JSON body, or `undefined` when the answer was not JSON. */
227
+ readonly body: unknown;
228
+ }
229
+ //# sourceMappingURL=email-inbound.standard-interface.schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-inbound.standard-interface.schemas.d.ts","sourceRoot":"","sources":["../../../../src/protocols/email-inbound.standard-interface.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB;;;;;;;;;;;GAWG;AACH,oBAAY,0BAA0B;IACpC,IAAI,SAAS;IACb,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,SAAS,cAAc;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,yCAAyC;;;;;iBAKpD,CAAC;AAEH,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yCAAyC,CAAC,CAAC;AAE5G,eAAO,MAAM,kCAAkC;;;iBAG7C,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAE9F,iIAAiI;AACjI,oBAAY,0BAA0B;IACpC,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,kHAAkH;AAClH,eAAO,MAAM,qCAAqC;;;;;;;iBAShD,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qCAAqC,CAAC,CAAC;AAEpG;;;GAGG;AACH,eAAO,MAAM,uCAAuC;;;;iBAMlD,CAAC;AAEH,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;AAExG;;;;;GAKG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwB7C,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAE9F,mCAAmC;AACnC,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAMD,+HAA+H;AAC/H,oBAAY,yBAAyB;IACnC,2HAA2H;IAC3H,OAAO,YAAY;IACnB,kDAAkD;IAClD,QAAQ,aAAa;IACrB,kDAAkD;IAClD,MAAM,WAAW;CAClB;AAED,wDAAwD;AACxD,eAAO,MAAM,mCAAmC;;;;;;;iBAQ9C,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAC;AAEhG,6CAA6C;AAC7C,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAOpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,YAAY,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrI,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACzE,wDAAwD;IACxD,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,qHAAqH;IACrH,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,iCAAiC,CAAC;IACpE,0DAA0D;IAC1D,YAAY,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC/E,qEAAqE;IACrE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC5E,mEAAmE;IACnE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAClE;AAMD;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GACtJ;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAElF;;;GAGG;AACH,oBAAY,uBAAuB;IACjC,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,iFAAiF;AACjF,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,160 @@
1
+ import { z } from "zod";
2
+ // ===============================================================
3
+ // Standard Inbound Email Interface (#1630)
4
+ // --------
5
+ // The canonical shape of a message an EMAIL_INBOUND provider RECEIVED for the application, and the
6
+ // three calls the engine makes on the provider to get it. Provider-agnostic: a vendor's module maps
7
+ // its own notification and message payloads onto these schemas, and nothing past that mapping ever
8
+ // sees a vendor field.
9
+ //
10
+ // There is deliberately NO `verify` here. The notification reaches the application through the
11
+ // provider's `WEBHOOK_ORIGINATOR` endpoint (the `inbound-email` key, capability `EMAIL_INBOUND`), and
12
+ // that endpoint is verified by the ENGINE-owned scheme its `signatureConfig` names (#1596). A
13
+ // provider that verified its own notifications would put the one fail-closed decision of the inbound
14
+ // path in vendor code, where nothing checks it.
15
+ // ===============================================================
16
+ /**
17
+ * One authentication method's result, as a receiving server records it in `Authentication-Results`.
18
+ *
19
+ * The union of the results the three methods define, so one vocabulary serves SPF, DKIM and DMARC.
20
+ * Two members go beyond what a DMARC result can be — `SOFTFAIL` (SPF only) and `POLICY` (DKIM and
21
+ * SPF) — and are here because mapping them onto a neighbour would record a result the receiver did
22
+ * not report: a softfail is neither a fail nor neutral.
23
+ *
24
+ * spec-cite: RFC 8601 §2.7.1 (DKIM results: none, pass, fail, policy, neutral, temperror, permerror)
25
+ * and §2.7.2 (SPF results: none, pass, fail, softfail, neutral, temperror, permerror, plus policy
26
+ * from §2.4); DMARC results per RFC 7489 §11.2 (none, pass, fail, temperror, permerror). Fetched 2026-09-27.
27
+ */
28
+ export var EmailAuthenticationVerdict;
29
+ (function (EmailAuthenticationVerdict) {
30
+ EmailAuthenticationVerdict["PASS"] = "pass";
31
+ EmailAuthenticationVerdict["FAIL"] = "fail";
32
+ EmailAuthenticationVerdict["SOFTFAIL"] = "softfail";
33
+ EmailAuthenticationVerdict["NEUTRAL"] = "neutral";
34
+ EmailAuthenticationVerdict["NONE"] = "none";
35
+ EmailAuthenticationVerdict["POLICY"] = "policy";
36
+ EmailAuthenticationVerdict["TEMPERROR"] = "temperror";
37
+ EmailAuthenticationVerdict["PERMERROR"] = "permerror";
38
+ })(EmailAuthenticationVerdict || (EmailAuthenticationVerdict = {}));
39
+ /**
40
+ * What the receiving provider concluded about a message's origin.
41
+ *
42
+ * `dmarcAligned` is kept beside the DMARC verdict rather than folded into it because it is the fact
43
+ * sender assurance is built on: DMARC authenticates the `From` DOMAIN by requiring that it align with
44
+ * an identifier SPF or DKIM authenticated. A provider that reports DMARC `pass` has already required
45
+ * alignment, so for most vendors `dmarcAligned` equals `dmarc === PASS`; it is a separate field so a
46
+ * vendor that reports the two independently is not forced to invent one from the other.
47
+ */
48
+ export const StandardInboundEmail_AuthenticationSchema = z.object({
49
+ spf: z.enum(EmailAuthenticationVerdict),
50
+ dkim: z.enum(EmailAuthenticationVerdict),
51
+ dmarc: z.enum(EmailAuthenticationVerdict),
52
+ dmarcAligned: z.boolean(),
53
+ });
54
+ export const StandardInboundEmail_AddressSchema = z.object({
55
+ address: z.string().min(1),
56
+ name: z.string().optional(),
57
+ });
58
+ /** How a MIME part asks to be presented (`Content-Disposition`). spec-cite: RFC 2183 §2.1 (`inline`) and §2.2 (`attachment`). */
59
+ export var EmailAttachmentDisposition;
60
+ (function (EmailAttachmentDisposition) {
61
+ EmailAttachmentDisposition["ATTACHMENT"] = "attachment";
62
+ EmailAttachmentDisposition["INLINE"] = "inline";
63
+ })(EmailAttachmentDisposition || (EmailAttachmentDisposition = {}));
64
+ /** One attachment as the provider describes it. The bytes are fetched through `openAttachment`, never inlined. */
65
+ export const StandardInboundEmail_AttachmentSchema = z.object({
66
+ /** Opaque to the engine; handed back to `openAttachment`. */
67
+ ref: z.string().min(1),
68
+ filename: z.string(),
69
+ contentType: z.string(),
70
+ sizeBytes: z.number().int().nonnegative(),
71
+ /** The `Content-ID` of an inline part, without angle brackets. */
72
+ contentId: z.string().optional(),
73
+ disposition: z.enum(EmailAttachmentDisposition).optional(),
74
+ });
75
+ /**
76
+ * What a provider's notification says, parsed. Small on purpose: a notification tells the engine
77
+ * THAT a message arrived and where to fetch it, and nothing past this point trusts it for more.
78
+ */
79
+ export const StandardInboundEmail_NotificationSchema = z.object({
80
+ /** The provider's id for the message — what `fetchMessage` takes, and the dedup key of the channel delivery. */
81
+ providerMessageId: z.string().min(1),
82
+ /** The addresses the message was delivered FOR (the SMTP envelope recipients), which routing reads. */
83
+ receivedFor: z.array(z.string().min(1)).min(1),
84
+ receivedAt: z.coerce.date(),
85
+ });
86
+ /**
87
+ * One received message, provider-neutral.
88
+ *
89
+ * The threading headers are separated out because the engine correlates threads from them;
90
+ * `headers` carries the rest, for a channel record that chooses to keep an allow-listed subset.
91
+ */
92
+ export const StandardInboundEmail_MessageSchema = z.object({
93
+ providerMessageId: z.string().min(1),
94
+ /** The RFC 5322 `Message-ID`, angle brackets included, or absent when the sender set none. */
95
+ messageId: z.string().optional(),
96
+ inReplyTo: z.string().optional(),
97
+ references: z.array(z.string()).default([]),
98
+ from: StandardInboundEmail_AddressSchema,
99
+ to: z.array(StandardInboundEmail_AddressSchema).default([]),
100
+ cc: z.array(StandardInboundEmail_AddressSchema).default([]),
101
+ replyTo: StandardInboundEmail_AddressSchema.optional(),
102
+ receivedFor: z.array(z.string().min(1)).min(1),
103
+ subject: z.string().default(""),
104
+ textBody: z.string().optional(),
105
+ htmlBody: z.string().optional(),
106
+ headers: z.record(z.string(), z.string()).default({}),
107
+ authentication: StandardInboundEmail_AuthenticationSchema,
108
+ attachments: z.array(StandardInboundEmail_AttachmentSchema).default([]),
109
+ sizeBytes: z.number().int().nonnegative().optional(),
110
+ receivedAt: z.coerce.date(),
111
+ /**
112
+ * Where the ORIGINAL message bytes are, when the provider keeps them (#1600). Opaque to the engine; handed
113
+ * to `openRaw`. Absent when the provider offers no raw copy — the engine then keeps no raw MIME.
114
+ */
115
+ rawRef: z.string().min(1).optional(),
116
+ });
117
+ // ===============================================================
118
+ // Receiving domains (#1600)
119
+ // ===============================================================
120
+ /** Where a domain stands AT THE PROVIDER — distinct from the organization's own status, which also records ownership proof. */
121
+ export var EmailProviderDomainStatus;
122
+ (function (EmailProviderDomainStatus) {
123
+ /** The provider has not verified the domain's records yet (not started, pending, or a temporary failure it will retry). */
124
+ EmailProviderDomainStatus["PENDING"] = "pending";
125
+ /** The provider verified the domain's records. */
126
+ EmailProviderDomainStatus["VERIFIED"] = "verified";
127
+ /** The provider gave up verifying the records. */
128
+ EmailProviderDomainStatus["FAILED"] = "failed";
129
+ })(EmailProviderDomainStatus || (EmailProviderDomainStatus = {}));
130
+ /** One DNS record the provider asks to be published. */
131
+ export const StandardEmailDomain_DnsRecordSchema = z.object({
132
+ /** What it is for, as the provider names it (DKIM, SPF, MX, Receiving…). */
133
+ purpose: z.string(),
134
+ type: z.string(),
135
+ name: z.string(),
136
+ value: z.string(),
137
+ priority: z.number().int().optional(),
138
+ status: z.string().optional(),
139
+ });
140
+ /** A domain as the provider describes it. */
141
+ export const StandardEmailDomainSchema = z.object({
142
+ providerDomainId: z.string().min(1),
143
+ name: z.string().min(1),
144
+ status: z.enum(EmailProviderDomainStatus),
145
+ sending: z.boolean(),
146
+ receiving: z.boolean(),
147
+ records: z.array(StandardEmailDomain_DnsRecordSchema).default([]),
148
+ });
149
+ /**
150
+ * The methods a provider's `path` request may use. A `url` request (a signed download link) is always a GET.
151
+ * Absent means GET.
152
+ */
153
+ export var EmailProviderHttpMethod;
154
+ (function (EmailProviderHttpMethod) {
155
+ EmailProviderHttpMethod["GET"] = "GET";
156
+ EmailProviderHttpMethod["POST"] = "POST";
157
+ EmailProviderHttpMethod["PATCH"] = "PATCH";
158
+ EmailProviderHttpMethod["DELETE"] = "DELETE";
159
+ })(EmailProviderHttpMethod || (EmailProviderHttpMethod = {}));
160
+ //# sourceMappingURL=email-inbound.standard-interface.schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-inbound.standard-interface.schemas.js","sourceRoot":"","sources":["../../../../src/protocols/email-inbound.standard-interface.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\n// ===============================================================\n// Standard Inbound Email Interface (#1630)\n// --------\n// The canonical shape of a message an EMAIL_INBOUND provider RECEIVED for the application, and the\n// three calls the engine makes on the provider to get it. Provider-agnostic: a vendor's module maps\n// its own notification and message payloads onto these schemas, and nothing past that mapping ever\n// sees a vendor field.\n//\n// There is deliberately NO `verify` here. The notification reaches the application through the\n// provider's `WEBHOOK_ORIGINATOR` endpoint (the `inbound-email` key, capability `EMAIL_INBOUND`), and\n// that endpoint is verified by the ENGINE-owned scheme its `signatureConfig` names (#1596). A\n// provider that verified its own notifications would put the one fail-closed decision of the inbound\n// path in vendor code, where nothing checks it.\n// ===============================================================\n\n/**\n * One authentication method's result, as a receiving server records it in `Authentication-Results`.\n *\n * The union of the results the three methods define, so one vocabulary serves SPF, DKIM and DMARC.\n * Two members go beyond what a DMARC result can be — `SOFTFAIL` (SPF only) and `POLICY` (DKIM and\n * SPF) — and are here because mapping them onto a neighbour would record a result the receiver did\n * not report: a softfail is neither a fail nor neutral.\n *\n * spec-cite: RFC 8601 §2.7.1 (DKIM results: none, pass, fail, policy, neutral, temperror, permerror)\n * and §2.7.2 (SPF results: none, pass, fail, softfail, neutral, temperror, permerror, plus policy\n * from §2.4); DMARC results per RFC 7489 §11.2 (none, pass, fail, temperror, permerror). Fetched 2026-09-27.\n */\nexport enum EmailAuthenticationVerdict {\n PASS = \"pass\",\n FAIL = \"fail\",\n SOFTFAIL = \"softfail\",\n NEUTRAL = \"neutral\",\n NONE = \"none\",\n POLICY = \"policy\",\n TEMPERROR = \"temperror\",\n PERMERROR = \"permerror\",\n}\n\n/**\n * What the receiving provider concluded about a message's origin.\n *\n * `dmarcAligned` is kept beside the DMARC verdict rather than folded into it because it is the fact\n * sender assurance is built on: DMARC authenticates the `From` DOMAIN by requiring that it align with\n * an identifier SPF or DKIM authenticated. A provider that reports DMARC `pass` has already required\n * alignment, so for most vendors `dmarcAligned` equals `dmarc === PASS`; it is a separate field so a\n * vendor that reports the two independently is not forced to invent one from the other.\n */\nexport const StandardInboundEmail_AuthenticationSchema = z.object({\n spf: z.enum(EmailAuthenticationVerdict),\n dkim: z.enum(EmailAuthenticationVerdict),\n dmarc: z.enum(EmailAuthenticationVerdict),\n dmarcAligned: z.boolean(),\n});\n\nexport type StandardInboundEmail_Authentication = z.infer<typeof StandardInboundEmail_AuthenticationSchema>;\n\nexport const StandardInboundEmail_AddressSchema = z.object({\n address: z.string().min(1),\n name: z.string().optional(),\n});\n\nexport type StandardInboundEmail_Address = z.infer<typeof StandardInboundEmail_AddressSchema>;\n\n/** How a MIME part asks to be presented (`Content-Disposition`). spec-cite: RFC 2183 §2.1 (`inline`) and §2.2 (`attachment`). */\nexport enum EmailAttachmentDisposition {\n ATTACHMENT = \"attachment\",\n INLINE = \"inline\",\n}\n\n/** One attachment as the provider describes it. The bytes are fetched through `openAttachment`, never inlined. */\nexport const StandardInboundEmail_AttachmentSchema = z.object({\n /** Opaque to the engine; handed back to `openAttachment`. */\n ref: z.string().min(1),\n filename: z.string(),\n contentType: z.string(),\n sizeBytes: z.number().int().nonnegative(),\n /** The `Content-ID` of an inline part, without angle brackets. */\n contentId: z.string().optional(),\n disposition: z.enum(EmailAttachmentDisposition).optional(),\n});\n\nexport type StandardInboundEmail_Attachment = z.infer<typeof StandardInboundEmail_AttachmentSchema>;\n\n/**\n * What a provider's notification says, parsed. Small on purpose: a notification tells the engine\n * THAT a message arrived and where to fetch it, and nothing past this point trusts it for more.\n */\nexport const StandardInboundEmail_NotificationSchema = z.object({\n /** The provider's id for the message — what `fetchMessage` takes, and the dedup key of the channel delivery. */\n providerMessageId: z.string().min(1),\n /** The addresses the message was delivered FOR (the SMTP envelope recipients), which routing reads. */\n receivedFor: z.array(z.string().min(1)).min(1),\n receivedAt: z.coerce.date(),\n});\n\nexport type StandardInboundEmail_Notification = z.infer<typeof StandardInboundEmail_NotificationSchema>;\n\n/**\n * One received message, provider-neutral.\n *\n * The threading headers are separated out because the engine correlates threads from them;\n * `headers` carries the rest, for a channel record that chooses to keep an allow-listed subset.\n */\nexport const StandardInboundEmail_MessageSchema = z.object({\n providerMessageId: z.string().min(1),\n /** The RFC 5322 `Message-ID`, angle brackets included, or absent when the sender set none. */\n messageId: z.string().optional(),\n inReplyTo: z.string().optional(),\n references: z.array(z.string()).default([]),\n from: StandardInboundEmail_AddressSchema,\n to: z.array(StandardInboundEmail_AddressSchema).default([]),\n cc: z.array(StandardInboundEmail_AddressSchema).default([]),\n replyTo: StandardInboundEmail_AddressSchema.optional(),\n receivedFor: z.array(z.string().min(1)).min(1),\n subject: z.string().default(\"\"),\n textBody: z.string().optional(),\n htmlBody: z.string().optional(),\n headers: z.record(z.string(), z.string()).default({}),\n authentication: StandardInboundEmail_AuthenticationSchema,\n attachments: z.array(StandardInboundEmail_AttachmentSchema).default([]),\n sizeBytes: z.number().int().nonnegative().optional(),\n receivedAt: z.coerce.date(),\n /**\n * Where the ORIGINAL message bytes are, when the provider keeps them (#1600). Opaque to the engine; handed\n * to `openRaw`. Absent when the provider offers no raw copy — the engine then keeps no raw MIME.\n */\n rawRef: z.string().min(1).optional(),\n});\n\nexport type StandardInboundEmail_Message = z.infer<typeof StandardInboundEmail_MessageSchema>;\n\n/** The bytes of one attachment. */\nexport interface StandardInboundEmail_OpenedAttachment {\n readonly bytes: Uint8Array;\n readonly contentType: string;\n readonly filename: string;\n}\n\n/** The original bytes of a message, exactly as the provider serves them. */\nexport interface StandardInboundEmail_OpenedRaw {\n readonly bytes: Uint8Array;\n}\n\n// ===============================================================\n// Receiving domains (#1600)\n// ===============================================================\n\n/** Where a domain stands AT THE PROVIDER — distinct from the organization's own status, which also records ownership proof. */\nexport enum EmailProviderDomainStatus {\n /** The provider has not verified the domain's records yet (not started, pending, or a temporary failure it will retry). */\n PENDING = \"pending\",\n /** The provider verified the domain's records. */\n VERIFIED = \"verified\",\n /** The provider gave up verifying the records. */\n FAILED = \"failed\",\n}\n\n/** One DNS record the provider asks to be published. */\nexport const StandardEmailDomain_DnsRecordSchema = z.object({\n /** What it is for, as the provider names it (DKIM, SPF, MX, Receiving…). */\n purpose: z.string(),\n type: z.string(),\n name: z.string(),\n value: z.string(),\n priority: z.number().int().optional(),\n status: z.string().optional(),\n});\n\nexport type StandardEmailDomain_DnsRecord = z.infer<typeof StandardEmailDomain_DnsRecordSchema>;\n\n/** A domain as the provider describes it. */\nexport const StandardEmailDomainSchema = z.object({\n providerDomainId: z.string().min(1),\n name: z.string().min(1),\n status: z.enum(EmailProviderDomainStatus),\n sending: z.boolean(),\n receiving: z.boolean(),\n records: z.array(StandardEmailDomain_DnsRecordSchema).default([]),\n});\n\nexport type StandardEmailDomain = z.infer<typeof StandardEmailDomainSchema>;\n\n/**\n * What an EMAIL_INBOUND provider implements to host an organization's own domain. Every tenant shares one\n * provider account, so the ENGINE proves the organization owns the domain before it ever calls `createDomain`.\n */\nexport interface StandardEmailDomains_Interface {\n createDomain(input: { readonly name: string; readonly sending: boolean; readonly receiving: boolean }): Promise<StandardEmailDomain>;\n getDomain(providerDomainId: string): Promise<StandardEmailDomain | null>;\n /** Start the provider's (asynchronous) verification. */\n verifyDomain(providerDomainId: string): Promise<void>;\n deleteDomain(providerDomainId: string): Promise<void>;\n}\n\n/**\n * What an EMAIL_INBOUND provider implements. Built by the provider module's adapter factory with the\n * credential the engine resolved, exactly as a billing adapter is — the module never reads a secret\n * itself.\n */\nexport interface StandardInboundEmail_Interface {\n /** Map the verified notification body onto the standard notification. Pure; refuses an unknown shape by throwing. */\n parseNotification(body: unknown): StandardInboundEmail_Notification;\n /** Fetch the whole message the notification announced. */\n fetchMessage(providerMessageId: string): Promise<StandardInboundEmail_Message>;\n /** Fetch one attachment's bytes, by the `ref` the message listed. */\n openAttachment(ref: string): Promise<StandardInboundEmail_OpenedAttachment>;\n /** Fetch the original message bytes, by the message's `rawRef`. */\n openRaw(rawRef: string): Promise<StandardInboundEmail_OpenedRaw>;\n}\n\n// ===============================================================\n// What a provider module DECLARES (pure functions; the engine owns the transport)\n// ===============================================================\n\n/**\n * One request a provider module asks the engine to make on its behalf.\n *\n * `path` is appended to the contract's `baseUrl`. A provider that serves bytes from ANOTHER host (a\n * signed download URL) returns `url` instead, and the engine admits it only against the hosts the\n * contract declares — a provider-supplied URL is never fetched merely because a provider named it.\n */\nexport type InboundEmailProviderRequest =\n | { readonly path: string; readonly method?: EmailProviderHttpMethod; readonly jsonBody?: unknown; readonly headers?: Readonly<Record<string, string>> }\n | { readonly url: string; readonly headers?: Readonly<Record<string, string>> };\n\n/**\n * The methods a provider's `path` request may use. A `url` request (a signed download link) is always a GET.\n * Absent means GET.\n */\nexport enum EmailProviderHttpMethod {\n GET = \"GET\",\n POST = \"POST\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n}\n\n/** A provider's HTTP answer, as the engine hands it to the provider's parser. */\nexport interface InboundEmailProviderResponseInput {\n readonly status: number;\n /** The JSON body, or `undefined` when the answer was not JSON. */\n readonly body: unknown;\n}\n"]}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Standard File Storage Adapter Interface (#1674)
3
+ * --------
4
+ * The contract a PROVIDER implements so a file storage whose bytes live at a vendor — a person's
5
+ * OneDrive, an organization's SharePoint library, a Dropbox folder — can be contributed by a package
6
+ * instead of being wired into the engine.
7
+ *
8
+ * ## Why it lives here, below the backend library
9
+ *
10
+ * The engine's storage contract (`IFileStorageProvider` in `@wildo-ai/saas-backend-lib`) takes the
11
+ * backend library's `ExecutionContext`. A provider package depends on
12
+ * `@wildo-ai/external-connectors-private`, which `saas-backend-lib` itself depends on, so a package
13
+ * could not implement that interface without a dependency edge pointing the wrong way — the same
14
+ * constraint billing met in #336. This contract sits in `@wildo-ai/external-connectors-models`, below
15
+ * both sides, and deliberately knows nothing about execution contexts, tenants or stored credentials:
16
+ * an adapter receives the ACCESS the engine resolved for one call and the file identifiers, and does
17
+ * the vendor's half of the work.
18
+ *
19
+ * The engine wraps every contributed adapter in its own `IFileStorageProvider`, which keeps everything
20
+ * an adapter must not decide for itself: which grant a file is read through (the person who linked or
21
+ * uploaded it, or the file's organization), the recorded credential use naming the connection and the
22
+ * contributing package, input validation and size limits, and the mapping of a vendor failure onto the
23
+ * application's error vocabulary.
24
+ *
25
+ * ## What it rejects, on purpose
26
+ *
27
+ * Supersedes #336's decision D10 ("file storage stays a separate registry, revisited when a storage
28
+ * vendor package is actually wanted"): Microsoft storage is now wanted from a package. The rejected
29
+ * alternative was #336's billing pattern — a registry of ENGINE-shipped adapters keyed by a declared
30
+ * name — because it keeps the implementation in the engine and so can never admit a package's adapter.
31
+ *
32
+ * The storage VOCABULARY stays closed. An adapter serves a member of `FileStorageAccepted` the engine
33
+ * already declares; it never adds a member. A declared member nothing serves remains a startup refusal.
34
+ */
35
+ import type { FileStorageAccepted } from '@wildo-ai/zod-decorators';
36
+ import type { ExternalProvider_Connection_OwnerScope } from '../core/security.external-connectors-models.schemas';
37
+ /** @wildo_source:part:start external-connectors.models.file-storage-adapter facet:kind:api facet:audience:app-developer */
38
+ /**
39
+ * WHOSE grant a file in this storage is read and written through. A subset of the connection owner
40
+ * vocabulary, not a new one: a vendor storage is reachable through a person's connection or an
41
+ * organization's, never through the application's own account (the application's own bytes live in the
42
+ * framework's storages).
43
+ *
44
+ * - `USER` — the person who LINKED or UPLOADED the file (the row's `uploadedBy`). Another reader still
45
+ * reads it: the application authorizes the ROW, and the storage reads the BYTES as that person.
46
+ * - `ORGANIZATION` — the organization the file belongs to (the row's `organizationId`, which only an
47
+ * organization-scoped file carries).
48
+ *
49
+ * Both are already on the file row, which is what lets erasure and retention reach a file held in
50
+ * someone's own drive.
51
+ */
52
+ export type ProviderFileStorageGrantOwner = ExternalProvider_Connection_OwnerScope.USER | ExternalProvider_Connection_OwnerScope.ORGANIZATION;
53
+ /** What removing a file's row does to the bytes at the vendor. */
54
+ export declare enum ProviderFileStorageDeleteBehavior {
55
+ /** The bytes are the application's, kept at the vendor on its behalf: `delete` removes them. */
56
+ REMOVES_BYTES = "REMOVES_BYTES",
57
+ /**
58
+ * The bytes are the owner's own document (a person's file they linked): `delete` forgets the
59
+ * reference and never calls the vendor. Deleting someone's document because an application row went
60
+ * away is an irreversible act that needs a deliberate door of its own.
61
+ */
62
+ FORGETS_REFERENCE = "FORGETS_REFERENCE"
63
+ }
64
+ /** Why an adapter could not do what it was asked. The engine maps each to its own error type. */
65
+ export declare enum ProviderFileStorageFailureKind {
66
+ /** The vendor knows no such file for this grant. */
67
+ NOT_FOUND = "NOT_FOUND",
68
+ /** The vendor refused the grant for this file (revoked, insufficient scope, not shared with the owner). */
69
+ ACCESS_DENIED = "ACCESS_DENIED",
70
+ /** The reference cannot be a file here (a folder, a vendor-native document with no bytes, a malformed id). */
71
+ INVALID_REFERENCE = "INVALID_REFERENCE",
72
+ /** The vendor failed or could not be reached. */
73
+ VENDOR_FAILURE = "VENDOR_FAILURE"
74
+ }
75
+ /**
76
+ * The failure an adapter throws. Anything else an adapter throws is treated as `VENDOR_FAILURE`, so a
77
+ * vendor SDK's own error never reaches a person as an unexplained 500.
78
+ */
79
+ export declare class ProviderFileStorageFailure extends Error {
80
+ readonly kind: ProviderFileStorageFailureKind;
81
+ /**
82
+ * The HTTP status the vendor answered with, when it answered. Recorded on the outbound record, so a reviewer
83
+ * can tell a vendor that refused from one that never answered. Leave it out when nothing came back.
84
+ */
85
+ readonly status?: number;
86
+ constructor(kind: ProviderFileStorageFailureKind, message: string, options?: {
87
+ readonly status?: number;
88
+ });
89
+ }
90
+ /**
91
+ * The access the engine resolved for ONE call: the delegated token of the grant the file lives under.
92
+ * Resolved, recorded as a credential use and handed over per call, so an adapter never holds a
93
+ * credential between calls and never chooses whose it is.
94
+ */
95
+ export interface ProviderFileStorageAccess {
96
+ readonly accessToken: string;
97
+ }
98
+ /** What the vendor says about one file. */
99
+ export interface ProviderFileStorageDescription {
100
+ /** The vendor's display name for the file. */
101
+ readonly name: string;
102
+ readonly contentType: string;
103
+ /** Size in bytes. A vendor-native document with no bytes cannot be described: throw `INVALID_REFERENCE`. */
104
+ readonly size: number;
105
+ readonly etag?: string;
106
+ readonly lastModified?: Date;
107
+ }
108
+ export interface ProviderFileStorageUploadRequest {
109
+ readonly access: ProviderFileStorageAccess;
110
+ /** The application's id for the file — stable, never shown to a person. */
111
+ readonly fileId: string;
112
+ /** The name to give the file at the vendor. */
113
+ readonly fileName: string;
114
+ readonly contentType: string;
115
+ /** The size the engine already validated against the application's limit. */
116
+ readonly size: number;
117
+ /** The bytes, streamed. Already bounded by the engine. */
118
+ readonly body: AsyncIterable<Uint8Array>;
119
+ }
120
+ export interface ProviderFileStorageReferenceRequest {
121
+ readonly access: ProviderFileStorageAccess;
122
+ /** The vendor's id for the file, as `upload` returned it or a picker linked it. */
123
+ readonly storageRef: string;
124
+ }
125
+ export interface ProviderFileStorageDownload {
126
+ readonly body: AsyncIterable<Uint8Array>;
127
+ readonly contentType: string;
128
+ readonly size: number;
129
+ readonly etag?: string;
130
+ readonly lastModified?: Date;
131
+ }
132
+ /**
133
+ * A file storage a provider contributes. Declared on the provider's backend module
134
+ * (`fileStorageAdapters`); the grant it spends is ITS OWN provider's connection — a module cannot
135
+ * point an adapter at another provider's grant — so a package whose ref belongs to a declared shared
136
+ * connection (`microsoft`, #1725) stores through that one connection.
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * export const oneDriveStorage: ProviderFileStorageAdapter = {
141
+ * storage: FileStorageAccepted.ONEDRIVE,
142
+ * grantOwner: ExternalProvider_Connection_OwnerScope.USER,
143
+ * deleteBehavior: ProviderFileStorageDeleteBehavior.FORGETS_REFERENCE,
144
+ * acceptsRemoteReferences: true,
145
+ * upload: async ({ access, fileName, body }) => ({ storageRef: await putDriveItem(access, fileName, body) }),
146
+ * download: async ({ access, storageRef }) => getDriveItemContent(access, storageRef),
147
+ * describe: async ({ access, storageRef }) => getDriveItem(access, storageRef),
148
+ * delete: async () => undefined,
149
+ * };
150
+ * ```
151
+ */
152
+ export interface ProviderFileStorageAdapter {
153
+ /**
154
+ * The declared storage member this adapter serves. Exactly one adapter may serve a member.
155
+ *
156
+ * Typed as the member's VALUE (`'onedrive'`) rather than the `@wildo-ai/zod-decorators` enum, so a provider package
157
+ * names it through the vocabulary it can already reach — `FileStorageAccepted.ONEDRIVE` from `@wildo-ai/saas-models`,
158
+ * whose members are held equal to the enum's — without taking a dependency on the decorator package. The set stays
159
+ * closed: the engine refuses a value that is not a member when it admits the adapter.
160
+ */
161
+ readonly storage: `${FileStorageAccepted}`;
162
+ readonly grantOwner: ProviderFileStorageGrantOwner;
163
+ readonly deleteBehavior: ProviderFileStorageDeleteBehavior;
164
+ /**
165
+ * Whether a person may LINK a file that already exists at the vendor (a picker's
166
+ * `REMOTE_REFERENCE`). When true, the engine describes the reference through the linker's grant
167
+ * before a row is created — which is also the proof the reference is real and reachable by them.
168
+ */
169
+ readonly acceptsRemoteReferences: boolean;
170
+ upload(request: ProviderFileStorageUploadRequest): Promise<{
171
+ readonly storageRef: string;
172
+ }>;
173
+ download(request: ProviderFileStorageReferenceRequest): Promise<ProviderFileStorageDownload>;
174
+ describe(request: ProviderFileStorageReferenceRequest): Promise<ProviderFileStorageDescription>;
175
+ /** Called only when `deleteBehavior` is `REMOVES_BYTES`. */
176
+ delete(request: ProviderFileStorageReferenceRequest): Promise<void>;
177
+ }
178
+ /** @wildo_source:part:end external-connectors.models.file-storage-adapter */
179
+ //# sourceMappingURL=file-storage.standard-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage.standard-interface.d.ts","sourceRoot":"","sources":["../../../../src/protocols/file-storage.standard-interface.ts"],"names":[],"mappings":"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"}