@corsair-dev/gmail 0.1.2 → 0.1.3
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.
|
@@ -10,7 +10,7 @@ export declare const MessagesEndpoints: {
|
|
|
10
10
|
get: (ctx: import("..").GmailContext, args: {
|
|
11
11
|
id: string;
|
|
12
12
|
userId?: string | undefined;
|
|
13
|
-
format?: "
|
|
13
|
+
format?: "raw" | "minimal" | "full" | "metadata" | undefined;
|
|
14
14
|
metadataHeaders?: string[] | undefined;
|
|
15
15
|
}) => Promise<import("..").Message>;
|
|
16
16
|
send: (ctx: import("..").GmailContext, args: {
|
|
@@ -91,26 +91,26 @@ export declare const DraftsEndpoints: {
|
|
|
91
91
|
get: (ctx: import("..").GmailContext, args: {
|
|
92
92
|
id: string;
|
|
93
93
|
userId?: string | undefined;
|
|
94
|
-
format?: "
|
|
94
|
+
format?: "raw" | "minimal" | "full" | "metadata" | undefined;
|
|
95
95
|
}) => Promise<import("..").Draft>;
|
|
96
96
|
create: (ctx: import("..").GmailContext, args: {
|
|
97
|
-
|
|
97
|
+
userId?: string | undefined;
|
|
98
|
+
draft?: {
|
|
98
99
|
message?: {
|
|
99
100
|
raw?: string | undefined;
|
|
100
101
|
threadId?: string | undefined;
|
|
101
102
|
} | undefined;
|
|
102
|
-
};
|
|
103
|
-
userId?: string | undefined;
|
|
103
|
+
} | undefined;
|
|
104
104
|
}) => Promise<import("..").Draft>;
|
|
105
105
|
update: (ctx: import("..").GmailContext, args: {
|
|
106
106
|
id: string;
|
|
107
|
-
|
|
107
|
+
userId?: string | undefined;
|
|
108
|
+
draft?: {
|
|
108
109
|
message?: {
|
|
109
110
|
raw?: string | undefined;
|
|
110
111
|
threadId?: string | undefined;
|
|
111
112
|
} | undefined;
|
|
112
|
-
};
|
|
113
|
-
userId?: string | undefined;
|
|
113
|
+
} | undefined;
|
|
114
114
|
}) => Promise<import("..").Draft>;
|
|
115
115
|
delete: (ctx: import("..").GmailContext, args: {
|
|
116
116
|
id: string;
|
|
@@ -13,9 +13,9 @@ export declare const GmailEndpointInputSchemas: {
|
|
|
13
13
|
userId: z.ZodOptional<z.ZodString>;
|
|
14
14
|
id: z.ZodString;
|
|
15
15
|
format: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
raw: "raw";
|
|
16
17
|
minimal: "minimal";
|
|
17
18
|
full: "full";
|
|
18
|
-
raw: "raw";
|
|
19
19
|
metadata: "metadata";
|
|
20
20
|
}>>;
|
|
21
21
|
metadataHeaders: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -109,30 +109,30 @@ export declare const GmailEndpointInputSchemas: {
|
|
|
109
109
|
userId: z.ZodOptional<z.ZodString>;
|
|
110
110
|
id: z.ZodString;
|
|
111
111
|
format: z.ZodOptional<z.ZodEnum<{
|
|
112
|
+
raw: "raw";
|
|
112
113
|
minimal: "minimal";
|
|
113
114
|
full: "full";
|
|
114
|
-
raw: "raw";
|
|
115
115
|
metadata: "metadata";
|
|
116
116
|
}>>;
|
|
117
117
|
}, z.core.$strip>;
|
|
118
118
|
readonly draftsCreate: z.ZodObject<{
|
|
119
119
|
userId: z.ZodOptional<z.ZodString>;
|
|
120
|
-
draft: z.ZodObject<{
|
|
120
|
+
draft: z.ZodOptional<z.ZodObject<{
|
|
121
121
|
message: z.ZodOptional<z.ZodObject<{
|
|
122
122
|
raw: z.ZodOptional<z.ZodString>;
|
|
123
123
|
threadId: z.ZodOptional<z.ZodString>;
|
|
124
124
|
}, z.core.$strip>>;
|
|
125
|
-
}, z.core.$strip
|
|
125
|
+
}, z.core.$strip>>;
|
|
126
126
|
}, z.core.$strip>;
|
|
127
127
|
readonly draftsUpdate: z.ZodObject<{
|
|
128
128
|
userId: z.ZodOptional<z.ZodString>;
|
|
129
129
|
id: z.ZodString;
|
|
130
|
-
draft: z.ZodObject<{
|
|
130
|
+
draft: z.ZodOptional<z.ZodObject<{
|
|
131
131
|
message: z.ZodOptional<z.ZodObject<{
|
|
132
132
|
raw: z.ZodOptional<z.ZodString>;
|
|
133
133
|
threadId: z.ZodOptional<z.ZodString>;
|
|
134
134
|
}, z.core.$strip>>;
|
|
135
|
-
}, z.core.$strip
|
|
135
|
+
}, z.core.$strip>>;
|
|
136
136
|
}, z.core.$strip>;
|
|
137
137
|
readonly draftsDelete: z.ZodObject<{
|
|
138
138
|
userId: z.ZodOptional<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../endpoints/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACX,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,iBAAiB,EACjB,OAAO,EACP,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../endpoints/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACX,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,iBAAiB,EACjB,OAAO,EACP,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,MAAM,UAAU,CAAC;AA4MlB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B5B,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG;KAChC,CAAC,IAAI,MAAM,OAAO,yBAAyB,GAAG,CAAC,CAAC,KAAK,CACrD,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,CACrC;CACD,CAAC;AAqBF,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;iBAMzB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAAG;IACtE,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC3B,CAAC;AAiGF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B7B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG;IAClC,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,IAAI,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,YAAY,EAAE,KAAK,CAAC;IACpB,YAAY,EAAE,KAAK,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,YAAY,EAAE,KAAK,CAAC;IACpB,YAAY,EAAE,KAAK,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CACzB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -114,9 +114,9 @@ export declare const gmailEndpointSchemas: {
|
|
|
114
114
|
userId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
115
115
|
id: import("zod").ZodString;
|
|
116
116
|
format: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
117
|
+
raw: "raw";
|
|
117
118
|
minimal: "minimal";
|
|
118
119
|
full: "full";
|
|
119
|
-
raw: "raw";
|
|
120
120
|
metadata: "metadata";
|
|
121
121
|
}>>;
|
|
122
122
|
metadataHeaders: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
@@ -414,9 +414,9 @@ export declare const gmailEndpointSchemas: {
|
|
|
414
414
|
userId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
415
415
|
id: import("zod").ZodString;
|
|
416
416
|
format: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
417
|
+
raw: "raw";
|
|
417
418
|
minimal: "minimal";
|
|
418
419
|
full: "full";
|
|
419
|
-
raw: "raw";
|
|
420
420
|
metadata: "metadata";
|
|
421
421
|
}>>;
|
|
422
422
|
}, import("zod/v4/core").$strip>;
|
|
@@ -438,12 +438,12 @@ export declare const gmailEndpointSchemas: {
|
|
|
438
438
|
readonly 'drafts.create': {
|
|
439
439
|
readonly input: import("zod").ZodObject<{
|
|
440
440
|
userId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
441
|
-
draft: import("zod").ZodObject<{
|
|
441
|
+
draft: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
442
442
|
message: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
443
443
|
raw: import("zod").ZodOptional<import("zod").ZodString>;
|
|
444
444
|
threadId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
445
445
|
}, import("zod/v4/core").$strip>>;
|
|
446
|
-
}, import("zod/v4/core").$strip
|
|
446
|
+
}, import("zod/v4/core").$strip>>;
|
|
447
447
|
}, import("zod/v4/core").$strip>;
|
|
448
448
|
readonly output: import("zod").ZodObject<{
|
|
449
449
|
id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -464,12 +464,12 @@ export declare const gmailEndpointSchemas: {
|
|
|
464
464
|
readonly input: import("zod").ZodObject<{
|
|
465
465
|
userId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
466
466
|
id: import("zod").ZodString;
|
|
467
|
-
draft: import("zod").ZodObject<{
|
|
467
|
+
draft: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
468
468
|
message: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
469
469
|
raw: import("zod").ZodOptional<import("zod").ZodString>;
|
|
470
470
|
threadId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
471
471
|
}, import("zod/v4/core").$strip>>;
|
|
472
|
-
}, import("zod/v4/core").$strip
|
|
472
|
+
}, import("zod/v4/core").$strip>>;
|
|
473
473
|
}, import("zod/v4/core").$strip>;
|
|
474
474
|
readonly output: import("zod").ZodObject<{
|
|
475
475
|
id: import("zod").ZodOptional<import("zod").ZodString>;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{request as xe}from"corsair/http";var j=class extends Error{constructor(a,o){super(a);this.code=o;this.name="GmailAPIError"}},Re="https://gmail.googleapis.com/gmail/v1";async function Ae(e,t,a){let o=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e,client_secret:t,refresh_token:a,grant_type:"refresh_token"})});if(!o.ok){let i=await o.text();throw new j(`Failed to refresh access token: ${i}`,o.status)}return await o.json()}async function B({accessToken:e,expiresAt:t,clientId:a,clientSecret:o,refreshToken:n,forceRefresh:i=!1}){let d=Math.floor(Date.now()/1e3);if(!i&&e&&t&&Number(t)>d+300)return{accessToken:e,expiresAt:Number(t),refreshed:!1};let p=await Ae(a,o,n);return{accessToken:p.access_token,expiresAt:d+p.expires_in,refreshed:!0}}async function y(e,t,a={}){let{method:o="GET",body:n,query:i}=a;return await xe({BASE:Re,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:t,HEADERS:{"Content-Type":"application/json"}},{method:o,url:e,body:o==="POST"||o==="PUT"||o==="PATCH"?n:void 0,mediaType:"application/json",query:o==="GET"?i:void 0})}function Oe(e){return e instanceof Error&&"status"in e&&e.status===401}async function c(e,t,a={}){try{return await y(e,t.key,a)}catch(o){if(Oe(o)&&t._refreshAuth){let n=await t._refreshAuth();return await y(e,n,a)}throw o}}import{logEventFromContext as M}from"corsair/core";var z=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts`,e,{method:"GET",query:{maxResults:t.maxResults,pageToken:t.pageToken,q:t.q}});if(a.drafts&&e.db.drafts)try{for(let o of a.drafts)o.id&&await e.db.drafts.upsertByEntityId(o.id,{...o,id:o.id,messageId:o.message?.id,createdAt:new Date})}catch(o){console.warn("Failed to save drafts to database:",o)}return await M(e,"gmail.drafts.list",{...t},"completed"),a},F=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"GET",query:{format:t.format}});if(a.id&&e.db.drafts)try{await e.db.drafts.upsertByEntityId(a.id,{...a,id:a.id,messageId:a.message?.id,createdAt:new Date})}catch(o){console.warn("Failed to save draft to database:",o)}return await M(e,"gmail.drafts.get",{...t},"completed"),a},V=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts`,e,{method:"POST",body:t.draft});return a.id&&await e.endpoints.drafts.get({id:a.id,userId:t.userId}),await M(e,"gmail.drafts.create",{...t},"completed"),a},K=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"PUT",body:t.draft});return a.id&&await e.endpoints.drafts.get({id:a.id,userId:t.userId}),await M(e,"gmail.drafts.update",{...t},"completed"),a},Y=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"DELETE"}),e.db.drafts)try{await e.db.drafts.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete draft from database:",a)}await M(e,"gmail.drafts.delete",{...t},"completed")},Z=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/send`,e,{method:"POST",body:{id:t.id,message:t.message}});return await M(e,"gmail.drafts.send",{...t},"completed"),a};import{logEventFromContext as v}from"corsair/core";var J=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels`,e,{method:"GET"});if(a.labels&&e.db.labels)try{for(let o of a.labels)o.id&&await e.db.labels.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save labels to database:",o)}return await v(e,"gmail.labels.list",{...t},"completed"),a},X=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"GET"});if(a.id&&e.db.labels)try{await e.db.labels.upsertByEntityId(a.id,{id:a.id,name:a.name,messageListVisibility:a.messageListVisibility,labelListVisibility:a.labelListVisibility,type:a.type,messagesTotal:a.messagesTotal,messagesUnread:a.messagesUnread,threadsTotal:a.threadsTotal,threadsUnread:a.threadsUnread,createdAt:new Date})}catch(o){console.warn("Failed to save label to database:",o)}return await v(e,"gmail.labels.get",{...t},"completed"),a},Q=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels`,e,{method:"POST",body:t.label});return a.id&&await e.endpoints.labels.get({id:a.id,userId:t.userId}),await v(e,"gmail.labels.create",{...t},"completed"),a},ee=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"PUT",body:t.label});return a.id&&await e.endpoints.labels.get({id:a.id,userId:t.userId}),await v(e,"gmail.labels.update",{...t},"completed"),a},te=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"DELETE"}),e.db.labels)try{await e.db.labels.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete label from database:",a)}await v(e,"gmail.labels.delete",{...t},"completed")};import{logEventFromContext as I}from"corsair/core";function U(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function Ue(e){if(e.payload)return U(e.payload,"Subject")}function $e(e){if(e.payload)return U(e.payload,"From")}function _e(e){if(e.payload)return U(e.payload,"To")}function se(e){if(!e)return;let t,a;if(e.body?.data)try{let o=Buffer.from(e.body.data,"base64").toString("utf-8");e.mimeType==="text/plain"?t=o:e.mimeType==="text/html"&&(a=o)}catch{}if(e.parts&&e.parts.length>0)for(let o of e.parts){let n=se(o);n&&(o.mimeType==="text/plain"?t=n:o.mimeType==="text/html"&&!t&&(a=n))}return t||a}function Ne(e){if(e.payload)return se(e.payload)}var ae=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages`,e,{method:"GET",query:{q:t.q,maxResults:t.maxResults,pageToken:t.pageToken,labelIds:t.labelIds?.join(","),includeSpamTrash:t.includeSpamTrash}});if(a.messages&&e.db.messages)try{for(let o of a.messages)o.id&&await e.db.messages.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save messages to database:",o)}return await I(e,"gmail.messages.list",{...t},"completed"),a},oe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}`,e,{method:"GET",query:{format:t.format,metadataHeaders:t.metadataHeaders?.join(",")}});if(a.id&&e.db.messages)try{let o=Ue(a),n=Ne(a),i=$e(a),d=_e(a);await e.db.messages.upsertByEntityId(a.id,{...a,subject:o,body:n,from:i,to:d,id:a.id,createdAt:new Date})}catch(o){console.warn("Failed to save message to database:",o)}return await I(e,"gmail.messages.get",{...t},"completed"),a},ie=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/send`,e,{method:"POST",body:{raw:t.raw,threadId:t.threadId}});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.send",{...t},"completed"),a},ne=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/messages/${t.id}`,e,{method:"DELETE"}),e.db.messages)try{await e.db.messages.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete message from database:",a)}await I(e,"gmail.messages.delete",{...t},"completed")},re=async(e,t)=>{let a={};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds);let o=await c(`/users/${t.userId||"me"}/messages/${t.id}/modify`,e,{method:"POST",body:a});return o.id&&await e.endpoints.messages.get({id:o.id,userId:t.userId}),await I(e,"gmail.messages.modify",{...t},"completed"),o},de=async(e,t)=>{let a={ids:t.ids};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds),await c(`/users/${t.userId||"me"}/messages/batchModify`,e,{method:"POST",body:a}),await I(e,"gmail.messages.batchModify",{...t},"completed")},le=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}/trash`,e,{method:"POST"});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.trash",{...t},"completed"),a},me=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}/untrash`,e,{method:"POST"});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.untrash",{...t},"completed"),a};import{logEventFromContext as L}from"corsair/core";var pe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads`,e,{method:"GET",query:{q:t.q,maxResults:t.maxResults,pageToken:t.pageToken,labelIds:t.labelIds?.join(","),includeSpamTrash:t.includeSpamTrash}});if(a.threads&&e.db.threads)try{for(let o of a.threads)o.id&&await e.db.threads.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save threads to database:",o)}return await L(e,"gmail.threads.list",{...t},"completed"),a},ge=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}`,e,{method:"GET",query:{format:t.format,metadataHeaders:t.metadataHeaders?.join(",")}});if(a.id&&e.db.threads)try{await e.db.threads.upsertByEntityId(a.id,{...a,id:a.id,createdAt:new Date})}catch(o){console.warn("Failed to save thread to database:",o)}return await L(e,"gmail.threads.get",{...t},"completed"),a},ce=async(e,t)=>{let a={};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds);let o=await c(`/users/${t.userId||"me"}/threads/${t.id}/modify`,e,{method:"POST",body:a});return o.id&&await e.endpoints.threads.get({id:o.id,userId:t.userId}),await L(e,"gmail.threads.modify",{...t},"completed"),o},ue=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/threads/${t.id}`,e,{method:"DELETE"}),e.db.threads)try{await e.db.threads.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete thread from database:",a)}await L(e,"gmail.threads.delete",{...t},"completed")},he=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}/trash`,e,{method:"POST"});return a.id&&await e.endpoints.threads.get({id:a.id,userId:t.userId}),await L(e,"gmail.threads.trash",{...t},"completed"),a},fe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}/untrash`,e,{method:"POST"});return a.id&&await e.endpoints.threads.get({id:a.id,userId:t.userId}),await L(e,"gmail.threads.untrash",{...t},"completed"),a};import{z as s}from"zod";var He=s.object({userId:s.string().optional(),q:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),labelIds:s.array(s.string()).optional(),includeSpamTrash:s.boolean().optional()}),ze=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),Fe=s.object({userId:s.string().optional(),raw:s.string(),threadId:s.string().optional()}),Ve=s.object({userId:s.string().optional(),id:s.string()}),Ke=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),Ye=s.object({userId:s.string().optional(),ids:s.array(s.string()).optional(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),Ze=s.object({userId:s.string().optional(),id:s.string()}),Je=s.object({userId:s.string().optional(),id:s.string()}),Xe=s.object({userId:s.string().optional()}),Qe=s.object({userId:s.string().optional(),id:s.string()}),et=s.object({userId:s.string().optional(),label:s.object({name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),color:s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}).optional()})}),tt=s.object({userId:s.string().optional(),id:s.string(),label:s.object({name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),color:s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}).optional()})}),st=s.object({userId:s.string().optional(),id:s.string()}),at=s.object({userId:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),q:s.string().optional()}),ot=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional()}),it=s.object({userId:s.string().optional(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),nt=s.object({userId:s.string().optional(),id:s.string(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),rt=s.object({userId:s.string().optional(),id:s.string()}),dt=s.object({userId:s.string().optional(),id:s.string().optional(),message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()}),lt=s.object({userId:s.string().optional(),q:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),labelIds:s.array(s.string()).optional(),includeSpamTrash:s.boolean().optional()}),mt=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),pt=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),gt=s.object({userId:s.string().optional(),id:s.string()}),ct=s.object({userId:s.string().optional(),id:s.string()}),ut=s.object({userId:s.string().optional(),id:s.string()}),ht=s.object({userId:s.string().optional()}),u={messagesList:He,messagesGet:ze,messagesSend:Fe,messagesDelete:Ve,messagesModify:Ke,messagesBatchModify:Ye,messagesTrash:Ze,messagesUntrash:Je,labelsList:Xe,labelsGet:Qe,labelsCreate:et,labelsUpdate:tt,labelsDelete:st,draftsList:at,draftsGet:ot,draftsCreate:it,draftsUpdate:nt,draftsDelete:rt,draftsSend:dt,threadsList:lt,threadsGet:mt,threadsModify:pt,threadsDelete:gt,threadsTrash:ct,threadsUntrash:ut,usersGetProfile:ht},ft=s.object({name:s.string().optional(),value:s.string().optional()}),bt=s.object({attachmentId:s.string().optional(),size:s.number().optional(),data:s.string().optional()}),yt=s.object({partId:s.string().optional(),mimeType:s.string().optional(),filename:s.string().optional(),headers:s.array(ft).optional(),body:bt.optional()}),be=yt.extend({parts:s.lazy(()=>s.array(be).optional())}),E=s.object({id:s.string().optional(),threadId:s.string().optional(),labelIds:s.array(s.string()).optional(),snippet:s.string().optional(),historyId:s.string().optional(),internalDate:s.union([s.string(),s.number(),s.date()]).transform(e=>{if(e instanceof Date)return e;if(typeof e=="number")return new Date(e);if(typeof e=="string"){let t=Number(e);return isNaN(t)?null:new Date(t)}return null}).nullable().optional(),sizeEstimate:s.number().optional(),payload:be.optional(),raw:s.string().optional()}),Et=s.object({messages:s.array(E).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),Gt=s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}),x=s.object({id:s.string().optional(),name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),type:s.enum(["system","user"]).optional(),messagesTotal:s.number().optional(),messagesUnread:s.number().optional(),threadsTotal:s.number().optional(),threadsUnread:s.number().optional(),color:Gt.optional()}),It=s.object({labels:s.array(x).optional()}),R=s.object({id:s.string().optional(),message:E.optional()}),wt=s.object({drafts:s.array(R).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),P=s.object({id:s.string().optional(),snippet:s.string().optional(),historyId:s.string().optional(),messages:s.array(E).optional()}),Tt=s.object({threads:s.array(P).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),Mt=s.object({emailAddress:s.string().optional(),messagesTotal:s.number().optional(),threadsTotal:s.number().optional(),historyId:s.string().optional()}),h={messagesList:Et,messagesGet:E,messagesSend:E,messagesDelete:s.void(),messagesModify:E,messagesBatchModify:s.void(),messagesTrash:E,messagesUntrash:E,labelsList:It,labelsGet:x,labelsCreate:x,labelsUpdate:x,labelsDelete:s.void(),draftsList:wt,draftsGet:R,draftsCreate:R,draftsUpdate:R,draftsDelete:s.void(),draftsSend:E,threadsList:Tt,threadsGet:P,threadsModify:P,threadsDelete:s.void(),threadsTrash:P,threadsUntrash:P,usersGetProfile:Mt};var G={list:ae,get:oe,send:ie,delete:ne,modify:re,batchModify:de,trash:le,untrash:me},S={list:J,get:X,create:Q,update:ee,delete:te},w={list:z,get:F,create:V,update:K,delete:Y,send:Z},T={list:pe,get:ge,modify:ce,delete:ue,trash:he,untrash:fe};import{z as C}from"zod";import{z as r}from"zod";var Lt=r.object({name:r.string().optional(),value:r.string().optional()}),St=r.object({attachmentId:r.string().optional(),size:r.number().optional(),data:r.string().optional()}),ye=r.lazy(()=>r.object({partId:r.string().optional(),mimeType:r.string().optional(),filename:r.string().optional(),headers:r.array(Lt).optional(),body:St.optional(),parts:r.array(ye).optional()})),Ee=r.object({id:r.string(),threadId:r.string().optional(),labelIds:r.array(r.string()).optional(),snippet:r.string().optional(),historyId:r.string().optional(),internalDate:r.string().optional(),sizeEstimate:r.number().optional(),payload:ye.optional(),raw:r.string().optional(),subject:r.string().optional(),body:r.string().optional(),from:r.string().optional(),to:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),Ge=r.object({id:r.string(),name:r.string().optional(),messageListVisibility:r.enum(["show","hide"]).optional(),labelListVisibility:r.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),type:r.enum(["system","user"]).optional(),messagesTotal:r.number().optional(),messagesUnread:r.number().optional(),threadsTotal:r.number().optional(),threadsUnread:r.number().optional(),createdAt:r.coerce.date().nullable().optional()}),Ie=r.object({id:r.string(),messageId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),we=r.object({id:r.string(),snippet:r.string().optional(),historyId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()});var us=C.object({clientId:C.string(),clientSecret:C.string(),accessToken:C.string(),refreshToken:C.string()}),$={version:"1.0.0",entities:{messages:Ee,labels:Ge,drafts:Ie,threads:we}};import{logEventFromContext as D}from"corsair/core";import{z as l}from"zod";var kt=l.object({data:l.string().optional(),attributes:l.record(l.string(),l.string()).optional(),messageId:l.string().optional(),publishTime:l.string().optional()}),Te=l.object({message:kt.optional(),subscription:l.string().optional(),event:l.unknown().optional()}),bs=l.object({emailAddress:l.string().optional(),historyId:l.string().optional()}),vt=l.object({type:l.literal("messageReceived"),emailAddress:l.string(),historyId:l.string(),message:l.custom()}),Pt=l.object({type:l.literal("messageDeleted"),emailAddress:l.string(),historyId:l.string(),message:l.custom()}),Ct=l.object({type:l.literal("messageLabelChanged"),emailAddress:l.string(),historyId:l.string(),message:l.custom(),labelsAdded:l.array(l.string()).optional(),labelsRemoved:l.array(l.string()).optional()}),Me=l.union([vt,Pt,Ct]);function k(e){let t=Buffer.from(e,"base64").toString("utf-8");return JSON.parse(t)}function _(e){return t=>{let a=t.body;if(!a.message?.data)return!1;try{let o=k(a.message.data);return!!o.historyId&&!!o.emailAddress}catch{return!1}}}var Dt=100,xt=10,Rt=10;function N(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function At(e){if(e.payload)return N(e.payload,"Subject")}function Ot(e){if(e.payload)return N(e.payload,"From")}function jt(e){if(e.payload)return N(e.payload,"To")}function ke(e){if(!e)return;let t,a;if(e.body?.data)try{let o=Buffer.from(e.body.data,"base64").toString("utf-8");e.mimeType==="text/plain"?t=o:e.mimeType==="text/html"&&(a=o)}catch{}if(e.parts&&e.parts.length>0)for(let o of e.parts){let n=ke(o);n&&(o.mimeType==="text/plain"?t=n:o.mimeType==="text/html"&&!t&&(a=n))}return t||a}function Bt(e){if(e.payload)return ke(e.payload)}function Ut(e){let t=[],a=[],o=[];if(!e)return{added:t,deleted:a,modified:o};for(let n of e){if(n.messagesAdded)for(let i of n.messagesAdded)i.message?.id&&t.push(i.message.id);if(n.messagesDeleted)for(let i of n.messagesDeleted)i.message?.id&&a.push(i.message.id);if(n.labelsAdded||n.labelsRemoved){if(n.labelsAdded)for(let i of n.labelsAdded)i.message?.id&&o.push(i.message.id);if(n.labelsRemoved)for(let i of n.labelsRemoved)i.message?.id&&o.push(i.message.id)}}return{added:[...new Set(t)],deleted:[...new Set(a)],modified:[...new Set(o)]}}async function q(e,t,a){let[o,n]=await Promise.all([y(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"full"}}),y(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"raw"}}).catch(()=>null)]);return{...o,raw:n?.raw}}async function $t(e,t,a,o){return y(`/users/${t}/messages/${a}/attachments/${o}`,e,{method:"GET"})}async function ve(e,t,a){if(!a.payload)return a;let o=async i=>{if(!i)return i;if(i.body?.attachmentId)try{let d=await $t(e,t,a.id,i.body.attachmentId);return{...i,body:{...i.body,data:d.data,size:d.size}}}catch(d){return console.warn(`Failed to fetch attachment ${i.body.attachmentId} for message ${a.id}:`,d),i}if(i.parts&&i.parts.length>0){let d=await Promise.all(i.parts.map(o));return{...i,parts:d.filter(m=>m!==void 0)}}return i},n=await o(a.payload);return{...a,payload:n}}function _t(e){let t=Number(e);return t>1?String(t-1):e}async function Pe(e,t){return!e.db?.messages||!t.id?"":(await e.db.messages.upsertByEntityId(t.id,{...t,id:t.id,subject:At(t),body:Bt(t),from:Ot(t),to:jt(t),createdAt:new Date}))?.id??""}async function Nt(e,t,a,o){let n=await y(`/users/${a}/messages`,t,{method:"GET",query:{maxResults:xt}}),i=[],d=[];if(!n.messages?.length)return{added:i,modified:d};let m=Number(o);for(let p of n.messages)if(p.id)try{let g=await q(t,a,p.id);(g.historyId?Number(g.historyId):0)>=m-Rt&&(e.db?.messages&&await e.db.messages.findByEntityId(p.id)?d.push(p.id):i.push(p.id))}catch{}return{added:i,modified:d}}async function Le(e,t,a,o){let n=null,i="";for(let d of o)try{let m=await q(t,a,d),p=await ve(t,a,m);n||(n=p);try{let g=await Pe(e,p);!i&&g&&(i=g)}catch(g){throw console.error(`Failed to save message ${p.id} to database:`,g),g}}catch(m){console.warn(`Failed to process message ${d}:`,m)}return{message:n,corsairEntityId:i}}async function qt(e,t,a,o){let n=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let m=null;try{m=await y(`/users/${a}/messages/${d}`,t,{method:"GET",query:{format:"full"}})}catch(p){if(p?.statusCode===404)continue}if(!n&&m&&(n=m),!i){let p=await e.db.messages.findByEntityId(d);p&&(i=p.id)}await e.db.messages.deleteByEntityId(d)}catch(m){console.warn(`Failed to delete message ${d} from database:`,m)}return{message:n,corsairEntityId:i}}async function Se(e,t,a,o){let n=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let m=await q(t,a,d),p=await ve(t,a,m);n||(n=p);try{let g=await Pe(e,p);!i&&g&&(i=g)}catch(g){throw console.error(`Failed to update message ${p.id} in database:`,g),g}}catch(m){console.warn(`Failed to process message ${d}:`,m)}return{message:n,corsairEntityId:i}}var Ce={match:_("messageChanged"),handler:async(e,t)=>{let a=t.payload;if(!a.message?.data)return{success:!1,error:"No message data in notification"};let o=k(a.message.data);if(!o.historyId||!o.emailAddress)return{success:!1,error:"Invalid push notification format"};let n=e.key,i=o.emailAddress,d=o.historyId;try{let m=_t(d),p=await y(`/users/${i}/history`,n,{method:"GET",query:{startHistoryId:m,maxResults:Dt}}),{added:g,deleted:A,modified:O}=Ut(p.history);if(O.length>0){let f=await Se(e,n,i,O),b={type:"messageLabelChanged",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageLabelChanged",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(g.length>0){let f=await Le(e,n,i,g),b={type:"messageReceived",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageReceived",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(A.length>0){let f=await qt(e,n,i,A),b={type:"messageDeleted",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageDeleted",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}let{added:W,modified:H}=await Nt(e,n,i,d);if(H.length>0){let f=await Se(e,n,i,H),b={type:"messageLabelChanged",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageLabelChanged",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(W.length>0){let f=await Le(e,n,i,W),b={type:"messageReceived",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageReceived",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}return{success:!0,corsairEntityId:"",data:{type:"messageReceived",emailAddress:i,historyId:d,message:{}}}}catch(m){return console.error("Failed to process Gmail webhook:",m),{success:!1,error:`Failed to process message: ${m instanceof Error?m.message:"Unknown error"}`}}}};var De={messageChanged:Ce};var Wt={oauth_2:{integration:["topic_id"]}},Ht={messages:{list:G.list,get:G.get,send:G.send,delete:G.delete,modify:G.modify,batchModify:G.batchModify,trash:G.trash,untrash:G.untrash},labels:{list:S.list,get:S.get,create:S.create,update:S.update,delete:S.delete},drafts:{list:w.list,get:w.get,create:w.create,update:w.update,delete:w.delete,send:w.send},threads:{list:T.list,get:T.get,modify:T.modify,delete:T.delete,trash:T.trash,untrash:T.untrash}},zt={"messages.list":{input:u.messagesList,output:h.messagesList},"messages.get":{input:u.messagesGet,output:h.messagesGet},"messages.send":{input:u.messagesSend,output:h.messagesSend},"messages.delete":{input:u.messagesDelete,output:h.messagesDelete},"messages.modify":{input:u.messagesModify,output:h.messagesModify},"messages.batchModify":{input:u.messagesBatchModify,output:h.messagesBatchModify},"messages.trash":{input:u.messagesTrash,output:h.messagesTrash},"messages.untrash":{input:u.messagesUntrash,output:h.messagesUntrash},"labels.list":{input:u.labelsList,output:h.labelsList},"labels.get":{input:u.labelsGet,output:h.labelsGet},"labels.create":{input:u.labelsCreate,output:h.labelsCreate},"labels.update":{input:u.labelsUpdate,output:h.labelsUpdate},"labels.delete":{input:u.labelsDelete,output:h.labelsDelete},"drafts.list":{input:u.draftsList,output:h.draftsList},"drafts.get":{input:u.draftsGet,output:h.draftsGet},"drafts.create":{input:u.draftsCreate,output:h.draftsCreate},"drafts.update":{input:u.draftsUpdate,output:h.draftsUpdate},"drafts.delete":{input:u.draftsDelete,output:h.draftsDelete},"drafts.send":{input:u.draftsSend,output:h.draftsSend},"threads.list":{input:u.threadsList,output:h.threadsList},"threads.get":{input:u.threadsGet,output:h.threadsGet},"threads.modify":{input:u.threadsModify,output:h.threadsModify},"threads.delete":{input:u.threadsDelete,output:h.threadsDelete},"threads.trash":{input:u.threadsTrash,output:h.threadsTrash},"threads.untrash":{input:u.threadsUntrash,output:h.threadsUntrash}},Ft={messageChanged:De.messageChanged},Vt={messageChanged:{description:"A Gmail message was received, deleted, or had its labels changed",payload:Te,response:Me}},Kt="oauth_2",Yt={"messages.list":{riskLevel:"read",description:"List messages in a mailbox"},"messages.get":{riskLevel:"read",description:"Get a specific message"},"messages.send":{riskLevel:"write",description:"Send an email to one or more recipients"},"messages.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a message [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"messages.modify":{riskLevel:"write",description:"Add or remove labels from a message"},"messages.batchModify":{riskLevel:"write",description:"Add or remove labels from multiple messages in bulk"},"messages.trash":{riskLevel:"write",description:"Move a message to the trash"},"messages.untrash":{riskLevel:"write",description:"Restore a message from the trash"},"labels.list":{riskLevel:"read",description:"List all labels in the mailbox"},"labels.get":{riskLevel:"read",description:"Get a specific label"},"labels.create":{riskLevel:"write",description:"Create a new label"},"labels.update":{riskLevel:"write",description:"Update an existing label"},"labels.delete":{riskLevel:"destructive",description:"Delete a label [DESTRUCTIVE]"},"drafts.list":{riskLevel:"read",description:"List drafts in the mailbox"},"drafts.get":{riskLevel:"read",description:"Get a specific draft"},"drafts.create":{riskLevel:"write",description:"Create a new draft"},"drafts.update":{riskLevel:"write",description:"Update an existing draft"},"drafts.delete":{riskLevel:"destructive",description:"Delete a draft [DESTRUCTIVE]"},"drafts.send":{riskLevel:"write",description:"Send a draft as an email"},"threads.list":{riskLevel:"read",description:"List threads in the mailbox"},"threads.get":{riskLevel:"read",description:"Get a specific thread"},"threads.modify":{riskLevel:"write",description:"Add or remove labels from a thread"},"threads.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a thread [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"threads.trash":{riskLevel:"write",description:"Move a thread to the trash"},"threads.untrash":{riskLevel:"write",description:"Restore a thread from the trash"}};function xs(e={}){let t={...e,authType:e.authType??Kt};return{id:"gmail",schema:$,options:t,authConfig:Wt,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/gmail.modify","https://www.googleapis.com/auth/gmail.labels","https://www.googleapis.com/auth/gmail.send","https://www.googleapis.com/auth/gmail.compose"],authParams:{access_type:"offline",prompt:"consent"}},hooks:t.hooks,webhookHooks:t.webhookHooks,endpoints:Ht,webhooks:Ft,endpointMeta:Yt,endpointSchemas:zt,webhookSchemas:Vt,keyBuilder:async a=>{let o=a.authType;if(t.key)return t.key;if(a.authType==="oauth_2"){let[n,i,d]=await Promise.all([a.keys.get_access_token(),a.keys.get_expires_at(),a.keys.get_refresh_token()]);if(!d)throw new Error("[auth-missing:gmail:refresh_token]: Gmail refresh token is missing");let m=await a.keys.get_integration_credentials();if(!m.client_id||!m.client_secret)throw new Error("[auth-missing:gmail:client_credentials]: Gmail client credentials are missing");let p;try{p=await B({accessToken:n,expiresAt:i,refreshToken:d,clientId:m.client_id,clientSecret:m.client_secret})}catch(g){throw new Error(`[corsair:gmail] Failed to obtain valid access token: ${g instanceof Error?g.message:String(g)}`)}if(p.refreshed)try{await a.keys.set_access_token(p.accessToken),await a.keys.set_expires_at(String(p.expiresAt))}catch(g){throw new Error(`[corsair:gmail] Token was refreshed but failed to persist new credentials: ${g instanceof Error?g.message:String(g)}`)}return a._refreshAuth=async()=>{let g=await B({accessToken:null,expiresAt:null,refreshToken:d,clientId:m.client_id,clientSecret:m.client_secret,forceRefresh:!0});return await a.keys.set_access_token(g.accessToken),await a.keys.set_expires_at(String(g.expiresAt)),g.accessToken},p.accessToken}throw new Error(`[auth-missing:gmail:${o}]: Gmail key is missing`)},pluginWebhookMatcher:a=>{let o=a.headers;if(!(o.from==="noreply@google.com"||typeof o["user-agent"]=="string"&&o["user-agent"].includes("APIs-Google")))return!1;let i=a.body;if(!i?.message?.data)return!1;try{let d=k(i.message.data);return!!d.emailAddress&&!!d.historyId}catch{return!1}}}}export{$ as GmailSchema,_ as createGmailWebhookMatcher,k as decodePubSubMessage,xs as gmail,Wt as gmailAuthConfig,zt as gmailEndpointSchemas,Ht as gmailEndpointsNested,Ft as gmailWebhooksNested};
|
|
1
|
+
import{request as Ae}from"corsair/http";var j=class extends Error{constructor(a,o){super(a);this.code=o;this.name="GmailAPIError"}},Oe="https://gmail.googleapis.com/gmail/v1";async function je(e,t,a){let o=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e,client_secret:t,refresh_token:a,grant_type:"refresh_token"})});if(!o.ok){let i=await o.text();throw new j(`Failed to refresh access token: ${i}`,o.status)}return await o.json()}async function B({accessToken:e,expiresAt:t,clientId:a,clientSecret:o,refreshToken:n,forceRefresh:i=!1}){let d=Math.floor(Date.now()/1e3);if(!i&&e&&t&&Number(t)>d+300)return{accessToken:e,expiresAt:Number(t),refreshed:!1};let p=await je(a,o,n);return{accessToken:p.access_token,expiresAt:d+p.expires_in,refreshed:!0}}async function y(e,t,a={}){let{method:o="GET",body:n,query:i}=a;return await Ae({BASE:Oe,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:t,HEADERS:{"Content-Type":"application/json"}},{method:o,url:e,body:o==="POST"||o==="PUT"||o==="PATCH"?n:void 0,mediaType:"application/json",query:o==="GET"?i:void 0})}function Be(e){return e instanceof Error&&"status"in e&&e.status===401}async function c(e,t,a={}){try{return await y(e,t.key,a)}catch(o){if(Be(o)&&t._refreshAuth){let n=await t._refreshAuth();return await y(e,n,a)}throw o}}import{logEventFromContext as M}from"corsair/core";var z=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts`,e,{method:"GET",query:{maxResults:t.maxResults,pageToken:t.pageToken,q:t.q}});if(a.drafts&&e.db.drafts)try{for(let o of a.drafts)o.id&&await e.db.drafts.upsertByEntityId(o.id,{...o,id:o.id,messageId:o.message?.id,createdAt:new Date})}catch(o){console.warn("Failed to save drafts to database:",o)}return await M(e,"gmail.drafts.list",{...t},"completed"),a},V=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"GET",query:{format:t.format}});if(a.id&&e.db.drafts)try{await e.db.drafts.upsertByEntityId(a.id,{...a,id:a.id,messageId:a.message?.id,createdAt:new Date})}catch(o){console.warn("Failed to save draft to database:",o)}return await M(e,"gmail.drafts.get",{...t},"completed"),a},K=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts`,e,{method:"POST",body:t.draft});return a.id&&await e.endpoints.drafts.get({id:a.id,userId:t.userId}),await M(e,"gmail.drafts.create",{...t},"completed"),a},Y=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"PUT",body:t.draft});return a.id&&await e.endpoints.drafts.get({id:a.id,userId:t.userId}),await M(e,"gmail.drafts.update",{...t},"completed"),a},Z=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/drafts/${t.id}`,e,{method:"DELETE"}),e.db.drafts)try{await e.db.drafts.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete draft from database:",a)}await M(e,"gmail.drafts.delete",{...t},"completed")},J=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/drafts/send`,e,{method:"POST",body:{id:t.id,message:t.message}});return await M(e,"gmail.drafts.send",{...t},"completed"),a};import{logEventFromContext as v}from"corsair/core";var X=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels`,e,{method:"GET"});if(a.labels&&e.db.labels)try{for(let o of a.labels)o.id&&await e.db.labels.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save labels to database:",o)}return await v(e,"gmail.labels.list",{...t},"completed"),a},Q=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"GET"});if(a.id&&e.db.labels)try{await e.db.labels.upsertByEntityId(a.id,{id:a.id,name:a.name,messageListVisibility:a.messageListVisibility,labelListVisibility:a.labelListVisibility,type:a.type,messagesTotal:a.messagesTotal,messagesUnread:a.messagesUnread,threadsTotal:a.threadsTotal,threadsUnread:a.threadsUnread,createdAt:new Date})}catch(o){console.warn("Failed to save label to database:",o)}return await v(e,"gmail.labels.get",{...t},"completed"),a},ee=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels`,e,{method:"POST",body:t.label});return a.id&&await e.endpoints.labels.get({id:a.id,userId:t.userId}),await v(e,"gmail.labels.create",{...t},"completed"),a},te=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"PUT",body:t.label});return a.id&&await e.endpoints.labels.get({id:a.id,userId:t.userId}),await v(e,"gmail.labels.update",{...t},"completed"),a},se=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/labels/${t.id}`,e,{method:"DELETE"}),e.db.labels)try{await e.db.labels.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete label from database:",a)}await v(e,"gmail.labels.delete",{...t},"completed")};import{logEventFromContext as I}from"corsair/core";function U(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function _e(e){if(e.payload)return U(e.payload,"Subject")}function Ne(e){if(e.payload)return U(e.payload,"From")}function We(e){if(e.payload)return U(e.payload,"To")}function ae(e){if(!e)return;let t,a;if(e.body?.data)try{let o=Buffer.from(e.body.data,"base64").toString("utf-8");e.mimeType==="text/plain"?t=o:e.mimeType==="text/html"&&(a=o)}catch{}if(e.parts&&e.parts.length>0)for(let o of e.parts){let n=ae(o);n&&(o.mimeType==="text/plain"?t=n:o.mimeType==="text/html"&&!t&&(a=n))}return t||a}function qe(e){if(e.payload)return ae(e.payload)}var oe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages`,e,{method:"GET",query:{q:t.q,maxResults:t.maxResults,pageToken:t.pageToken,labelIds:t.labelIds?.join(","),includeSpamTrash:t.includeSpamTrash}});if(a.messages&&e.db.messages)try{for(let o of a.messages)o.id&&await e.db.messages.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save messages to database:",o)}return await I(e,"gmail.messages.list",{...t},"completed"),a},ie=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}`,e,{method:"GET",query:{format:t.format,metadataHeaders:t.metadataHeaders?.join(",")}});if(a.id&&e.db.messages)try{let o=_e(a),n=qe(a),i=Ne(a),d=We(a);await e.db.messages.upsertByEntityId(a.id,{...a,subject:o,body:n,from:i,to:d,id:a.id,createdAt:new Date})}catch(o){console.warn("Failed to save message to database:",o)}return await I(e,"gmail.messages.get",{...t},"completed"),a},ne=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/send`,e,{method:"POST",body:{raw:t.raw,threadId:t.threadId}});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.send",{...t},"completed"),a},re=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/messages/${t.id}`,e,{method:"DELETE"}),e.db.messages)try{await e.db.messages.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete message from database:",a)}await I(e,"gmail.messages.delete",{...t},"completed")},de=async(e,t)=>{let a={};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds);let o=await c(`/users/${t.userId||"me"}/messages/${t.id}/modify`,e,{method:"POST",body:a});return o.id&&await e.endpoints.messages.get({id:o.id,userId:t.userId}),await I(e,"gmail.messages.modify",{...t},"completed"),o},le=async(e,t)=>{let a={ids:t.ids};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds),await c(`/users/${t.userId||"me"}/messages/batchModify`,e,{method:"POST",body:a}),await I(e,"gmail.messages.batchModify",{...t},"completed")},me=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}/trash`,e,{method:"POST"});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.trash",{...t},"completed"),a},pe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/messages/${t.id}/untrash`,e,{method:"POST"});return a.id&&await e.endpoints.messages.get({id:a.id,userId:t.userId}),await I(e,"gmail.messages.untrash",{...t},"completed"),a};import{logEventFromContext as S}from"corsair/core";var ge=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads`,e,{method:"GET",query:{q:t.q,maxResults:t.maxResults,pageToken:t.pageToken,labelIds:t.labelIds?.join(","),includeSpamTrash:t.includeSpamTrash}});if(a.threads&&e.db.threads)try{for(let o of a.threads)o.id&&await e.db.threads.upsertByEntityId(o.id,{...o,id:o.id,createdAt:new Date})}catch(o){console.warn("Failed to save threads to database:",o)}return await S(e,"gmail.threads.list",{...t},"completed"),a},ce=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}`,e,{method:"GET",query:{format:t.format,metadataHeaders:t.metadataHeaders?.join(",")}});if(a.id&&e.db.threads)try{await e.db.threads.upsertByEntityId(a.id,{...a,id:a.id,createdAt:new Date})}catch(o){console.warn("Failed to save thread to database:",o)}return await S(e,"gmail.threads.get",{...t},"completed"),a},ue=async(e,t)=>{let a={};t.addLabelIds&&t.addLabelIds.length>0&&(a.addLabelIds=t.addLabelIds),t.removeLabelIds&&t.removeLabelIds.length>0&&(a.removeLabelIds=t.removeLabelIds);let o=await c(`/users/${t.userId||"me"}/threads/${t.id}/modify`,e,{method:"POST",body:a});return o.id&&await e.endpoints.threads.get({id:o.id,userId:t.userId}),await S(e,"gmail.threads.modify",{...t},"completed"),o},he=async(e,t)=>{if(await c(`/users/${t.userId||"me"}/threads/${t.id}`,e,{method:"DELETE"}),e.db.threads)try{await e.db.threads.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete thread from database:",a)}await S(e,"gmail.threads.delete",{...t},"completed")},fe=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}/trash`,e,{method:"POST"});return a.id&&await e.endpoints.threads.get({id:a.id,userId:t.userId}),await S(e,"gmail.threads.trash",{...t},"completed"),a},be=async(e,t)=>{let a=await c(`/users/${t.userId||"me"}/threads/${t.id}/untrash`,e,{method:"POST"});return a.id&&await e.endpoints.threads.get({id:a.id,userId:t.userId}),await S(e,"gmail.threads.untrash",{...t},"completed"),a};import{z as s}from"zod";var ye="Base64url-encoded RFC 2822 email \u2014 do NOT pass plain email text. Build the MIME message (From, To, Subject, Content-Type headers, blank line, body; lines separated by \\r\\n), then base64url-encode: standard base64, replace + with -, / with _, remove trailing =.",$=s.object({raw:s.string().optional().describe(ye),threadId:s.string().optional()}),ze=s.object({userId:s.string().optional(),q:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),labelIds:s.array(s.string()).optional(),includeSpamTrash:s.boolean().optional()}),Ve=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),Ke=s.object({userId:s.string().optional(),raw:s.string().describe(ye),threadId:s.string().optional()}),Ye=s.object({userId:s.string().optional(),id:s.string()}),Ze=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),Je=s.object({userId:s.string().optional(),ids:s.array(s.string()).optional(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),Xe=s.object({userId:s.string().optional(),id:s.string()}),Qe=s.object({userId:s.string().optional(),id:s.string()}),et=s.object({userId:s.string().optional()}),tt=s.object({userId:s.string().optional(),id:s.string()}),st=s.object({userId:s.string().optional(),label:s.object({name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),color:s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}).optional()})}),at=s.object({userId:s.string().optional(),id:s.string(),label:s.object({name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),color:s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}).optional()})}),ot=s.object({userId:s.string().optional(),id:s.string()}),it=s.object({userId:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),q:s.string().optional()}),nt=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional()}),rt=s.object({userId:s.string().optional(),draft:s.object({message:$.optional()}).optional().describe("Draft payload. message.raw must be a base64url-encoded RFC 2822 email, not plain text.")}),dt=s.object({userId:s.string().optional(),id:s.string(),draft:s.object({message:$.optional()}).optional().describe("Updated draft payload. message.raw must be a base64url-encoded RFC 2822 email, not plain text.")}),lt=s.object({userId:s.string().optional(),id:s.string()}),mt=s.object({userId:s.string().optional(),id:s.string().optional(),message:$.optional().describe("Optional message body when sending without a draft id. raw must be base64url-encoded RFC 2822, not plain text.")}),pt=s.object({userId:s.string().optional(),q:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),labelIds:s.array(s.string()).optional(),includeSpamTrash:s.boolean().optional()}),gt=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),ct=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),ut=s.object({userId:s.string().optional(),id:s.string()}),ht=s.object({userId:s.string().optional(),id:s.string()}),ft=s.object({userId:s.string().optional(),id:s.string()}),bt=s.object({userId:s.string().optional()}),u={messagesList:ze,messagesGet:Ve,messagesSend:Ke,messagesDelete:Ye,messagesModify:Ze,messagesBatchModify:Je,messagesTrash:Xe,messagesUntrash:Qe,labelsList:et,labelsGet:tt,labelsCreate:st,labelsUpdate:at,labelsDelete:ot,draftsList:it,draftsGet:nt,draftsCreate:rt,draftsUpdate:dt,draftsDelete:lt,draftsSend:mt,threadsList:pt,threadsGet:gt,threadsModify:ct,threadsDelete:ut,threadsTrash:ht,threadsUntrash:ft,usersGetProfile:bt},yt=s.object({name:s.string().optional(),value:s.string().optional()}),Et=s.object({attachmentId:s.string().optional(),size:s.number().optional(),data:s.string().optional()}),Gt=s.object({partId:s.string().optional(),mimeType:s.string().optional(),filename:s.string().optional(),headers:s.array(yt).optional(),body:Et.optional()}),Ee=Gt.extend({parts:s.lazy(()=>s.array(Ee).optional())}),E=s.object({id:s.string().optional(),threadId:s.string().optional(),labelIds:s.array(s.string()).optional(),snippet:s.string().optional(),historyId:s.string().optional(),internalDate:s.union([s.string(),s.number(),s.date()]).transform(e=>{if(e instanceof Date)return e;if(typeof e=="number")return new Date(e);if(typeof e=="string"){let t=Number(e);return isNaN(t)?null:new Date(t)}return null}).nullable().optional(),sizeEstimate:s.number().optional(),payload:Ee.optional(),raw:s.string().optional().describe("Full RFC 2822 message in base64url encoding (when format=raw). Not plain text \u2014 decode base64url before reading headers/body.")}),It=s.object({messages:s.array(E).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),wt=s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}),x=s.object({id:s.string().optional(),name:s.string().optional(),messageListVisibility:s.enum(["show","hide"]).optional(),labelListVisibility:s.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),type:s.enum(["system","user"]).optional(),messagesTotal:s.number().optional(),messagesUnread:s.number().optional(),threadsTotal:s.number().optional(),threadsUnread:s.number().optional(),color:wt.optional()}),Tt=s.object({labels:s.array(x).optional()}),R=s.object({id:s.string().optional(),message:E.optional()}),Mt=s.object({drafts:s.array(R).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),P=s.object({id:s.string().optional(),snippet:s.string().optional(),historyId:s.string().optional(),messages:s.array(E).optional()}),St=s.object({threads:s.array(P).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),Lt=s.object({emailAddress:s.string().optional(),messagesTotal:s.number().optional(),threadsTotal:s.number().optional(),historyId:s.string().optional()}),h={messagesList:It,messagesGet:E,messagesSend:E,messagesDelete:s.void(),messagesModify:E,messagesBatchModify:s.void(),messagesTrash:E,messagesUntrash:E,labelsList:Tt,labelsGet:x,labelsCreate:x,labelsUpdate:x,labelsDelete:s.void(),draftsList:Mt,draftsGet:R,draftsCreate:R,draftsUpdate:R,draftsDelete:s.void(),draftsSend:E,threadsList:St,threadsGet:P,threadsModify:P,threadsDelete:s.void(),threadsTrash:P,threadsUntrash:P,usersGetProfile:Lt};var G={list:oe,get:ie,send:ne,delete:re,modify:de,batchModify:le,trash:me,untrash:pe},L={list:X,get:Q,create:ee,update:te,delete:se},w={list:z,get:V,create:K,update:Y,delete:Z,send:J},T={list:ge,get:ce,modify:ue,delete:he,trash:fe,untrash:be};import{z as C}from"zod";import{z as r}from"zod";var kt=r.object({name:r.string().optional(),value:r.string().optional()}),vt=r.object({attachmentId:r.string().optional(),size:r.number().optional(),data:r.string().optional()}),Ge=r.lazy(()=>r.object({partId:r.string().optional(),mimeType:r.string().optional(),filename:r.string().optional(),headers:r.array(kt).optional(),body:vt.optional(),parts:r.array(Ge).optional()})),Ie=r.object({id:r.string(),threadId:r.string().optional(),labelIds:r.array(r.string()).optional(),snippet:r.string().optional(),historyId:r.string().optional(),internalDate:r.string().optional(),sizeEstimate:r.number().optional(),payload:Ge.optional(),raw:r.string().optional(),subject:r.string().optional(),body:r.string().optional(),from:r.string().optional(),to:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),we=r.object({id:r.string(),name:r.string().optional(),messageListVisibility:r.enum(["show","hide"]).optional(),labelListVisibility:r.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),type:r.enum(["system","user"]).optional(),messagesTotal:r.number().optional(),messagesUnread:r.number().optional(),threadsTotal:r.number().optional(),threadsUnread:r.number().optional(),createdAt:r.coerce.date().nullable().optional()}),Te=r.object({id:r.string(),messageId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),Me=r.object({id:r.string(),snippet:r.string().optional(),historyId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()});var fs=C.object({clientId:C.string(),clientSecret:C.string(),accessToken:C.string(),refreshToken:C.string()}),_={version:"1.0.0",entities:{messages:Ie,labels:we,drafts:Te,threads:Me}};import{logEventFromContext as D}from"corsair/core";import{z as l}from"zod";var Pt=l.object({data:l.string().optional(),attributes:l.record(l.string(),l.string()).optional(),messageId:l.string().optional(),publishTime:l.string().optional()}),Se=l.object({message:Pt.optional(),subscription:l.string().optional(),event:l.unknown().optional()}),Es=l.object({emailAddress:l.string().optional(),historyId:l.string().optional()}),Ct=l.object({type:l.literal("messageReceived"),emailAddress:l.string(),historyId:l.string(),message:l.custom()}),Dt=l.object({type:l.literal("messageDeleted"),emailAddress:l.string(),historyId:l.string(),message:l.custom()}),xt=l.object({type:l.literal("messageLabelChanged"),emailAddress:l.string(),historyId:l.string(),message:l.custom(),labelsAdded:l.array(l.string()).optional(),labelsRemoved:l.array(l.string()).optional()}),Le=l.union([Ct,Dt,xt]);function k(e){let t=Buffer.from(e,"base64").toString("utf-8");return JSON.parse(t)}function N(e){return t=>{let a=t.body;if(!a.message?.data)return!1;try{let o=k(a.message.data);return!!o.historyId&&!!o.emailAddress}catch{return!1}}}var Rt=100,At=10,Ot=10;function W(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function jt(e){if(e.payload)return W(e.payload,"Subject")}function Bt(e){if(e.payload)return W(e.payload,"From")}function Ut(e){if(e.payload)return W(e.payload,"To")}function Pe(e){if(!e)return;let t,a;if(e.body?.data)try{let o=Buffer.from(e.body.data,"base64").toString("utf-8");e.mimeType==="text/plain"?t=o:e.mimeType==="text/html"&&(a=o)}catch{}if(e.parts&&e.parts.length>0)for(let o of e.parts){let n=Pe(o);n&&(o.mimeType==="text/plain"?t=n:o.mimeType==="text/html"&&!t&&(a=n))}return t||a}function $t(e){if(e.payload)return Pe(e.payload)}function _t(e){let t=[],a=[],o=[];if(!e)return{added:t,deleted:a,modified:o};for(let n of e){if(n.messagesAdded)for(let i of n.messagesAdded)i.message?.id&&t.push(i.message.id);if(n.messagesDeleted)for(let i of n.messagesDeleted)i.message?.id&&a.push(i.message.id);if(n.labelsAdded||n.labelsRemoved){if(n.labelsAdded)for(let i of n.labelsAdded)i.message?.id&&o.push(i.message.id);if(n.labelsRemoved)for(let i of n.labelsRemoved)i.message?.id&&o.push(i.message.id)}}return{added:[...new Set(t)],deleted:[...new Set(a)],modified:[...new Set(o)]}}async function q(e,t,a){let[o,n]=await Promise.all([y(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"full"}}),y(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"raw"}}).catch(()=>null)]);return{...o,raw:n?.raw}}async function Nt(e,t,a,o){return y(`/users/${t}/messages/${a}/attachments/${o}`,e,{method:"GET"})}async function Ce(e,t,a){if(!a.payload)return a;let o=async i=>{if(!i)return i;if(i.body?.attachmentId)try{let d=await Nt(e,t,a.id,i.body.attachmentId);return{...i,body:{...i.body,data:d.data,size:d.size}}}catch(d){return console.warn(`Failed to fetch attachment ${i.body.attachmentId} for message ${a.id}:`,d),i}if(i.parts&&i.parts.length>0){let d=await Promise.all(i.parts.map(o));return{...i,parts:d.filter(m=>m!==void 0)}}return i},n=await o(a.payload);return{...a,payload:n}}function Wt(e){let t=Number(e);return t>1?String(t-1):e}async function De(e,t){return!e.db?.messages||!t.id?"":(await e.db.messages.upsertByEntityId(t.id,{...t,id:t.id,subject:jt(t),body:$t(t),from:Bt(t),to:Ut(t),createdAt:new Date}))?.id??""}async function qt(e,t,a,o){let n=await y(`/users/${a}/messages`,t,{method:"GET",query:{maxResults:At}}),i=[],d=[];if(!n.messages?.length)return{added:i,modified:d};let m=Number(o);for(let p of n.messages)if(p.id)try{let g=await q(t,a,p.id);(g.historyId?Number(g.historyId):0)>=m-Ot&&(e.db?.messages&&await e.db.messages.findByEntityId(p.id)?d.push(p.id):i.push(p.id))}catch{}return{added:i,modified:d}}async function ke(e,t,a,o){let n=null,i="";for(let d of o)try{let m=await q(t,a,d),p=await Ce(t,a,m);n||(n=p);try{let g=await De(e,p);!i&&g&&(i=g)}catch(g){throw console.error(`Failed to save message ${p.id} to database:`,g),g}}catch(m){console.warn(`Failed to process message ${d}:`,m)}return{message:n,corsairEntityId:i}}async function Ft(e,t,a,o){let n=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let m=null;try{m=await y(`/users/${a}/messages/${d}`,t,{method:"GET",query:{format:"full"}})}catch(p){if(p?.statusCode===404)continue}if(!n&&m&&(n=m),!i){let p=await e.db.messages.findByEntityId(d);p&&(i=p.id)}await e.db.messages.deleteByEntityId(d)}catch(m){console.warn(`Failed to delete message ${d} from database:`,m)}return{message:n,corsairEntityId:i}}async function ve(e,t,a,o){let n=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let m=await q(t,a,d),p=await Ce(t,a,m);n||(n=p);try{let g=await De(e,p);!i&&g&&(i=g)}catch(g){throw console.error(`Failed to update message ${p.id} in database:`,g),g}}catch(m){console.warn(`Failed to process message ${d}:`,m)}return{message:n,corsairEntityId:i}}var xe={match:N("messageChanged"),handler:async(e,t)=>{let a=t.payload;if(!a.message?.data)return{success:!1,error:"No message data in notification"};let o=k(a.message.data);if(!o.historyId||!o.emailAddress)return{success:!1,error:"Invalid push notification format"};let n=e.key,i=o.emailAddress,d=o.historyId;try{let m=Wt(d),p=await y(`/users/${i}/history`,n,{method:"GET",query:{startHistoryId:m,maxResults:Rt}}),{added:g,deleted:A,modified:O}=_t(p.history);if(O.length>0){let f=await ve(e,n,i,O),b={type:"messageLabelChanged",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageLabelChanged",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(g.length>0){let f=await ke(e,n,i,g),b={type:"messageReceived",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageReceived",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(A.length>0){let f=await Ft(e,n,i,A),b={type:"messageDeleted",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageDeleted",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}let{added:F,modified:H}=await qt(e,n,i,d);if(H.length>0){let f=await ve(e,n,i,H),b={type:"messageLabelChanged",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageLabelChanged",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}if(F.length>0){let f=await ke(e,n,i,F),b={type:"messageReceived",emailAddress:i,historyId:d,message:f.message??{}};return await D(e,"gmail.webhook.messageReceived",{...b},"completed"),{success:!0,corsairEntityId:f.corsairEntityId,data:b}}return{success:!0,corsairEntityId:"",data:{type:"messageReceived",emailAddress:i,historyId:d,message:{}}}}catch(m){return console.error("Failed to process Gmail webhook:",m),{success:!1,error:`Failed to process message: ${m instanceof Error?m.message:"Unknown error"}`}}}};var Re={messageChanged:xe};var Ht={oauth_2:{integration:["topic_id"]}},zt={messages:{list:G.list,get:G.get,send:G.send,delete:G.delete,modify:G.modify,batchModify:G.batchModify,trash:G.trash,untrash:G.untrash},labels:{list:L.list,get:L.get,create:L.create,update:L.update,delete:L.delete},drafts:{list:w.list,get:w.get,create:w.create,update:w.update,delete:w.delete,send:w.send},threads:{list:T.list,get:T.get,modify:T.modify,delete:T.delete,trash:T.trash,untrash:T.untrash}},Vt={"messages.list":{input:u.messagesList,output:h.messagesList},"messages.get":{input:u.messagesGet,output:h.messagesGet},"messages.send":{input:u.messagesSend,output:h.messagesSend},"messages.delete":{input:u.messagesDelete,output:h.messagesDelete},"messages.modify":{input:u.messagesModify,output:h.messagesModify},"messages.batchModify":{input:u.messagesBatchModify,output:h.messagesBatchModify},"messages.trash":{input:u.messagesTrash,output:h.messagesTrash},"messages.untrash":{input:u.messagesUntrash,output:h.messagesUntrash},"labels.list":{input:u.labelsList,output:h.labelsList},"labels.get":{input:u.labelsGet,output:h.labelsGet},"labels.create":{input:u.labelsCreate,output:h.labelsCreate},"labels.update":{input:u.labelsUpdate,output:h.labelsUpdate},"labels.delete":{input:u.labelsDelete,output:h.labelsDelete},"drafts.list":{input:u.draftsList,output:h.draftsList},"drafts.get":{input:u.draftsGet,output:h.draftsGet},"drafts.create":{input:u.draftsCreate,output:h.draftsCreate},"drafts.update":{input:u.draftsUpdate,output:h.draftsUpdate},"drafts.delete":{input:u.draftsDelete,output:h.draftsDelete},"drafts.send":{input:u.draftsSend,output:h.draftsSend},"threads.list":{input:u.threadsList,output:h.threadsList},"threads.get":{input:u.threadsGet,output:h.threadsGet},"threads.modify":{input:u.threadsModify,output:h.threadsModify},"threads.delete":{input:u.threadsDelete,output:h.threadsDelete},"threads.trash":{input:u.threadsTrash,output:h.threadsTrash},"threads.untrash":{input:u.threadsUntrash,output:h.threadsUntrash}},Kt={messageChanged:Re.messageChanged},Yt={messageChanged:{description:"A Gmail message was received, deleted, or had its labels changed",payload:Se,response:Le}},Zt="oauth_2",Jt={"messages.list":{riskLevel:"read",description:"List messages in a mailbox"},"messages.get":{riskLevel:"read",description:"Get a specific message"},"messages.send":{riskLevel:"write",description:"Send an email to one or more recipients"},"messages.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a message [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"messages.modify":{riskLevel:"write",description:"Add or remove labels from a message"},"messages.batchModify":{riskLevel:"write",description:"Add or remove labels from multiple messages in bulk"},"messages.trash":{riskLevel:"write",description:"Move a message to the trash"},"messages.untrash":{riskLevel:"write",description:"Restore a message from the trash"},"labels.list":{riskLevel:"read",description:"List all labels in the mailbox"},"labels.get":{riskLevel:"read",description:"Get a specific label"},"labels.create":{riskLevel:"write",description:"Create a new label"},"labels.update":{riskLevel:"write",description:"Update an existing label"},"labels.delete":{riskLevel:"destructive",description:"Delete a label [DESTRUCTIVE]"},"drafts.list":{riskLevel:"read",description:"List drafts in the mailbox"},"drafts.get":{riskLevel:"read",description:"Get a specific draft"},"drafts.create":{riskLevel:"write",description:"Create a new draft"},"drafts.update":{riskLevel:"write",description:"Update an existing draft"},"drafts.delete":{riskLevel:"destructive",description:"Delete a draft [DESTRUCTIVE]"},"drafts.send":{riskLevel:"write",description:"Send a draft as an email"},"threads.list":{riskLevel:"read",description:"List threads in the mailbox"},"threads.get":{riskLevel:"read",description:"Get a specific thread"},"threads.modify":{riskLevel:"write",description:"Add or remove labels from a thread"},"threads.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a thread [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"threads.trash":{riskLevel:"write",description:"Move a thread to the trash"},"threads.untrash":{riskLevel:"write",description:"Restore a thread from the trash"}};function As(e={}){let t={...e,authType:e.authType??Zt};return{id:"gmail",schema:_,options:t,authConfig:Ht,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/gmail.modify","https://www.googleapis.com/auth/gmail.labels","https://www.googleapis.com/auth/gmail.send","https://www.googleapis.com/auth/gmail.compose"],authParams:{access_type:"offline",prompt:"consent"}},hooks:t.hooks,webhookHooks:t.webhookHooks,endpoints:zt,webhooks:Kt,endpointMeta:Jt,endpointSchemas:Vt,webhookSchemas:Yt,keyBuilder:async a=>{let o=a.authType;if(t.key)return t.key;if(a.authType==="oauth_2"){let[n,i,d]=await Promise.all([a.keys.get_access_token(),a.keys.get_expires_at(),a.keys.get_refresh_token()]);if(!d)throw new Error("[auth-missing:gmail:refresh_token]: Gmail refresh token is missing");let m=await a.keys.get_integration_credentials();if(!m.client_id||!m.client_secret)throw new Error("[auth-missing:gmail:client_credentials]: Gmail client credentials are missing");let p;try{p=await B({accessToken:n,expiresAt:i,refreshToken:d,clientId:m.client_id,clientSecret:m.client_secret})}catch(g){throw new Error(`[corsair:gmail] Failed to obtain valid access token: ${g instanceof Error?g.message:String(g)}`)}if(p.refreshed)try{await a.keys.set_access_token(p.accessToken),await a.keys.set_expires_at(String(p.expiresAt))}catch(g){throw new Error(`[corsair:gmail] Token was refreshed but failed to persist new credentials: ${g instanceof Error?g.message:String(g)}`)}return a._refreshAuth=async()=>{let g=await B({accessToken:null,expiresAt:null,refreshToken:d,clientId:m.client_id,clientSecret:m.client_secret,forceRefresh:!0});return await a.keys.set_access_token(g.accessToken),await a.keys.set_expires_at(String(g.expiresAt)),g.accessToken},p.accessToken}throw new Error(`[auth-missing:gmail:${o}]: Gmail key is missing`)},pluginWebhookMatcher:a=>{let o=a.headers;if(!(o.from==="noreply@google.com"||typeof o["user-agent"]=="string"&&o["user-agent"].includes("APIs-Google")))return!1;let i=a.body;if(!i?.message?.data)return!1;try{let d=k(i.message.data);return!!d.emailAddress&&!!d.historyId}catch{return!1}}}}export{_ as GmailSchema,N as createGmailWebhookMatcher,k as decodePubSubMessage,As as gmail,Ht as gmailAuthConfig,Vt as gmailEndpointSchemas,zt as gmailEndpointsNested,Kt as gmailWebhooksNested};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corsair-dev/gmail",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Gmail plugin for Corsair",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"tsup": "^8.0.1",
|
|
28
28
|
"typescript": "^5.9.3",
|
|
29
29
|
"zod": "^4.1.13",
|
|
30
|
-
"corsair": "0.1.
|
|
30
|
+
"corsair": "0.1.70"
|
|
31
31
|
},
|
|
32
32
|
"keywords": [
|
|
33
33
|
"corsair",
|