corsair 0.1.45 → 0.1.47
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.
- package/dist/{chunk-VDZSQY4P.js → chunk-B7SHIP45.js} +4 -4
- package/dist/{chunk-AWPIDPDT.js → chunk-J7NCVPA4.js} +1 -1
- package/dist/core.js +1 -1
- package/dist/index.js +1 -1
- package/dist/plugins/gmail/index.js +1 -1
- package/dist/plugins/googlecalendar/index.js +1 -1
- package/dist/plugins/googledrive/index.js +1 -1
- package/dist/plugins/googlesheets/index.js +1 -1
- package/dist/plugins/spotify/index.js +1 -1
- package/dist/setup.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{o as k,p as w}from"./chunk-
|
|
2
|
-
`)}var O={...m};function p(e){if(e instanceof T){let c={};for(let[l,r]of Object.entries(e.shape))c[l]=p(r);return c}return e instanceof
|
|
3
|
-
Schema: ${JSON.stringify(p(g),null,2)}`)}var C="default";async function E(e,c,l,r){let o=new Date,g=c.keys,s=c;for(let u of l){let n=u.id,a=await e.selectFrom("corsair_integrations").selectAll().where("name","=",n).executeTakeFirst();if(!a){let f=crypto.randomUUID();await e.insertInto("corsair_integrations").values({id:f,name:n,config:{},created_at:o,updated_at:o}).execute(),a=await e.selectFrom("corsair_integrations").selectAll().where("id","=",f).executeTakeFirst(),r(`[corsair:setup] Created integration: ${n}`)}let t=g[n];if(a&&!a.dek&&t&&(await t.issue_new_dek(),r(`[corsair:setup] Issued integration DEK: ${n}`)),!a)continue;let i=await e.selectFrom("corsair_accounts").selectAll().where("tenant_id","=",C).where("integration_id","=",a.id).executeTakeFirst();if(!i){let f=crypto.randomUUID();await e.insertInto("corsair_accounts").values({id:f,tenant_id:C,integration_id:a.id,config:{},created_at:o,updated_at:o}).execute(),i=await e.selectFrom("corsair_accounts").selectAll().where("id","=",f).executeTakeFirst(),r(`[corsair:setup] Created account: ${n}`)}let d=s[n]?.keys;i&&!i.dek&&d&&(await d.issue_new_dek(),r(`[corsair:setup] Issued account DEK: ${n}`))}}async function I(e,c,l,r){let o=e.keys,g=e;for(let[s,u]of Object.entries(c)){let n=o[s],a=g[s]?.keys;for(let[t,i]of Object.entries(u)){let d=`set_${t}`;n&&typeof n[d]=="function"?(await n[d](i),l(`[corsair:setup] Set integration credential: ${s}.${t}`)):a&&typeof a[d]=="function"?(await a[d](i),l(`[corsair:setup] Set account credential: ${s}.${t}`)):r(`[corsair:setup] No setter found for '${s}.${t}' \u2014 skipping.`)}}}var S=new Set(["webhook_signature","expires_at","scope","redirect_url"]);async function x(e,c,l,r,o,g){let s=[],u=[];for(let a of Object.keys(l)){if(!a.startsWith("set_"))continue;let t=a.slice(4);if(S.has(t))continue;let i=l[`get_${t}`];if(!i)continue;let d=null;try{d=await i()}catch{}d||s.push(t)}for(let a of Object.keys(r)){if(!a.startsWith("set_"))continue;let t=a.slice(4);if(S.has(t))continue;let i=r[`get_${t}`];if(!i)continue;let d=null;try{d=await i()}catch{}d||u.push(t)}let n=s.length===0&&u.length===0;if(
|
|
1
|
+
import{o as k,p as w}from"./chunk-J7NCVPA4.js";import{a as m}from"./chunk-34Z5IBIX.js";import{ZodBoolean as h,ZodDate as _,ZodEffects as $,ZodEnum as P,ZodNullable as K,ZodNumber as M,ZodObject as T,ZodOptional as v,ZodRecord as A,ZodString as j}from"zod";var b={slack:{channels:{list:{}},users:{list:{}}},linear:{projects:{list:{}},issues:{list:{}},users:{list:{}}},github:{issues:{list:{}},pullRequests:{list:{}},repositories:{list:{}}},discord:{guilds:{list:{}},channels:{list:{}}},hubspot:{contacts:{getMany:{}},companies:{getMany:{}},deals:{getMany:{}}},gmail:{messages:{list:{}},labels:{list:{}},drafts:{list:{}},threads:{list:{}}},googlecalendar:{events:{getMany:{}}},googledrive:{files:{list:{}},folders:{list:{}},sharedDrives:{list:{}}},notion:{databases:{getManyDatabases:{}},databasePages:{getManyDatabasePages:{}},users:{getManyUsers:{}}},airtable:{bases:{getMany:{}}},todoist:{projects:{getMany:{}},tasks:{getMany:{}}},cal:{bookings:{list:{}}}};async function Y(e,c){let l=[],r=t=>{l.push(t),console.log(t)},o=t=>{l.push(t),console.warn(t)},g=c?.caller??"script",s=e[k];if(!s)throw new Error("setupCorsair: invalid corsair instance");if(s.multiTenancy)throw new Error("setupCorsair: multi-tenancy instances are not supported. Create your corsair instance without multiTenancy: true.");if(!s.database)throw new Error("setupCorsair: a database must be configured on the corsair instance");let u=s.database.db,n=w({plugins:s.plugins,database:s.database.db,kek:s.kek});await D(u,o),await E(u,n,s.plugins,r),c?.credentials&&Object.keys(c.credentials).length>0&&await I(n,c.credentials,r,o);let a=await Z(n,s.plugins,r,g);return c?.backfill&&(r("[corsair:setup] Starting backfill..."),await L(n,s.plugins,a,r,o),r("[corsair:setup] Backfill complete.")),l.join(`
|
|
2
|
+
`)}var O={...m};function p(e){if(e instanceof T){let c={};for(let[l,r]of Object.entries(e.shape))c[l]=p(r);return c}return e instanceof $?p(e.innerType()):e instanceof K?`${p(e.unwrap())} | null`:e instanceof v?`${p(e.unwrap())} | undefined`:e instanceof P?e.options.join(" | "):e instanceof j?"string":e instanceof M?"number":e instanceof h?"boolean":e instanceof _?"date":e instanceof A?"jsonb":"unknown"}async function D(e,c){let l=await e.introspection.getTables(),r=new Set(l.map(o=>o.name));for(let[o,g]of Object.entries(O))r.has(o)||c(`[corsair:setup] Table "${o}" does not exist. Run your database migrations before calling setupCorsair.
|
|
3
|
+
Schema: ${JSON.stringify(p(g),null,2)}`)}var C="default";async function E(e,c,l,r){let o=new Date,g=c.keys,s=c;for(let u of l){let n=u.id,a=await e.selectFrom("corsair_integrations").selectAll().where("name","=",n).executeTakeFirst();if(!a){let f=crypto.randomUUID();await e.insertInto("corsair_integrations").values({id:f,name:n,config:{},created_at:o,updated_at:o}).execute(),a=await e.selectFrom("corsair_integrations").selectAll().where("id","=",f).executeTakeFirst(),r(`[corsair:setup] Created integration: ${n}`)}let t=g[n];if(a&&!a.dek&&t&&(await t.issue_new_dek(),r(`[corsair:setup] Issued integration DEK: ${n}`)),!a)continue;let i=await e.selectFrom("corsair_accounts").selectAll().where("tenant_id","=",C).where("integration_id","=",a.id).executeTakeFirst();if(!i){let f=crypto.randomUUID();await e.insertInto("corsair_accounts").values({id:f,tenant_id:C,integration_id:a.id,config:{},created_at:o,updated_at:o}).execute(),i=await e.selectFrom("corsair_accounts").selectAll().where("id","=",f).executeTakeFirst(),r(`[corsair:setup] Created account: ${n}`)}let d=s[n]?.keys;i&&!i.dek&&d&&(await d.issue_new_dek(),r(`[corsair:setup] Issued account DEK: ${n}`))}}async function I(e,c,l,r){let o=e.keys,g=e;for(let[s,u]of Object.entries(c)){let n=o[s],a=g[s]?.keys;for(let[t,i]of Object.entries(u)){let d=`set_${t}`;n&&typeof n[d]=="function"?(await n[d](i),l(`[corsair:setup] Set integration credential: ${s}.${t}`)):a&&typeof a[d]=="function"?(await a[d](i),l(`[corsair:setup] Set account credential: ${s}.${t}`)):r(`[corsair:setup] No setter found for '${s}.${t}' \u2014 skipping.`)}}}var S=new Set(["webhook_signature","expires_at","scope","redirect_url"]);async function x(e,c,l,r,o,g){let s=[],u=[];for(let a of Object.keys(l)){if(!a.startsWith("set_"))continue;let t=a.slice(4);if(S.has(t))continue;let i=l[`get_${t}`];if(!i)continue;let d=null;try{d=await i()}catch{}d||s.push(t)}for(let a of Object.keys(r)){if(!a.startsWith("set_"))continue;let t=a.slice(4);if(S.has(t))continue;let i=r[`get_${t}`];if(!i)continue;let d=null;try{d=await i()}catch{}d||u.push(t)}let n=s.length===0&&u.length===0;if(n)o(`[corsair:setup] '${e}' (${c}) is configured \u2713`);else{let a=[...s,...u];if(g==="cli"){let t=a.map(i=>`${i}=VALUE`).join(" ");o(`[corsair:setup] '${e}' (${c}) needs credentials. Run:
|
|
4
4
|
corsair setup --${e} ${t}`)}else{let t=[`[corsair:setup] '${e}' (${c}) needs credentials. Call:`];for(let i of s)t.push(` await corsair.keys.${e}.set_${i}(value)`);for(let i of u)t.push(` await corsair.${e}.keys.set_${i}(value)`);o(t.join(`
|
|
5
|
-
`))}}return n}async function Z(e,c,l,r){let o=new Set,g=e.keys,s=e;for(let u of c){let n=u.id,a=u.options?.authType??"unknown",t=g[n],i=s[n]?.keys;t&&i&&await x(n,a,t,i,l,r)&&o.add(n)}return o}async function L(e,c,l,r,o){let g=b,s=new Set(c.map(n=>n.id)),u=e;for(let[n,a]of Object.entries(g)){if(!s.has(n))continue;if(!l.has(n)){r(`[corsair:setup] Skipping backfill for '${n}' \u2014 auth not configured.`);continue}let t=u[n]?.api;if(t)for(let[i,d]of Object.entries(a))for(let[f,
|
|
5
|
+
`))}}return n}async function Z(e,c,l,r){let o=new Set,g=e.keys,s=e;for(let u of c){let n=u.id,a=u.options?.authType??"unknown",t=g[n],i=s[n]?.keys;t&&i&&await x(n,a,t,i,l,r)&&o.add(n)}return o}async function L(e,c,l,r,o){let g=b,s=new Set(c.map(n=>n.id)),u=e;for(let[n,a]of Object.entries(g)){if(!s.has(n))continue;if(!l.has(n)){r(`[corsair:setup] Skipping backfill for '${n}' \u2014 auth not configured.`);continue}let t=u[n]?.api;if(t)for(let[i,d]of Object.entries(a))for(let[f,R]of Object.entries(d)){r(`[corsair:setup] Backfilling ${n} \u203A ${i}.${f}...`);try{await t[i]?.[f]?.(R)}catch(y){o(`[corsair:setup] ${n} \u203A ${i}.${f} failed: `+(y instanceof Error?y.message:String(y)))}}}}export{Y as a};
|
|
@@ -10,6 +10,6 @@ To generate a KEK, run: openssl rand -base64 ${N}`)}})}var W={oauth_2:{integrati
|
|
|
10
10
|
Permission ID: ${d}`,`
|
|
11
11
|
Permission token: ${g}`,`
|
|
12
12
|
Expires at: ${c}`,`
|
|
13
|
-
Use the token to approve or deny this request.`),{result:"blocked"}}function Se(e){return typeof e=="function"}function ne({endpoints:e,hooks:t,ctx:n,tree:r,pluginId:o,errorHandlers:i,currentPath:a=[],keyBuilder:s,permissionsConfig:d,endpointMeta:g,database:y,approvalConfig:c,tenantId:m}){for(let[p,u]of Object.entries(e)){let f=t?.[p];if(Se(u)){let h=f,w=[...a,p].join("."),E=async
|
|
13
|
+
Use the token to approve or deny this request.`),{result:"blocked"}}function Se(e){return typeof e=="function"}function ne({endpoints:e,hooks:t,ctx:n,tree:r,pluginId:o,errorHandlers:i,currentPath:a=[],keyBuilder:s,permissionsConfig:d,endpointMeta:g,database:y,approvalConfig:c,tenantId:m}){for(let[p,u]of Object.entries(e)){let f=t?.[p];if(Se(u)){let h=f,w=[...a,p].join("."),E=async(T={})=>{let l;if(d){let C=g?.[w],{result:v,onComplete:A}=await Ce({pluginId:o,endpointPath:w,args:T,mode:d.mode,override:d.overrides?.[w],riskLevel:C?.riskLevel??"write",meta:C,db:y,timeoutMs:c?be(c.timeout):void 0,tenantId:m});if(v==="blocked")return null;l=A}let k=async(C,v,A)=>{try{return await u(v,A)}catch(B){if(B instanceof Error){let F=await ke(B,o,w,typeof A=="object"&&A!==null?A:{args:A},i);if(C<(F.maxRetries||0)){let j=C+1;console.log(`Retrying (${j} / ${F.maxRetries})...`);let _;if(F.headersRetryAfterMs)_=F.headersRetryAfterMs;else switch(F.retryStrategy){case"exponential_backoff":_=Math.pow(2,j-1)*1e3;break;case"exponential_backoff_jitter":let V=Math.pow(2,j-1)*1e3,Ee=(Math.random()-.5)*1e3;_=Math.max(0,V+Ee);break;case"linear_1s":_=1e3;break;case"linear_2s":_=2e3;break;case"linear_3s":_=3e3;break;case"linear_4s":_=4e3;break;default:_=1e3;break}await new Promise(V=>setTimeout(V,_)),await k(j,v,A),console.log(`[corsair:${o}:${w}] Retry strategy:`,F)}}throw B}},b=s?await s(n,"endpoint"):void 0;if(!h?.before&&!h?.after){let C=await k(0,{...n,key:b},T);return await l?.(),C}let I={...n,key:b},R=h.before?await h.before(I,T):{ctx:I,args:T,continue:!0,passToAfter:void 0};if(R.continue===!1)return;let P=await k(0,R.ctx,R.args);return await h.after?.(R.ctx,P,R.passToAfter),await l?.(),P};r[p]=E}else if(u&&typeof u=="object"){let h={};ne({endpoints:u,hooks:f,ctx:n,tree:h,pluginId:o,errorHandlers:i,currentPath:[...a,p],keyBuilder:s,permissionsConfig:d,endpointMeta:g,database:y,approvalConfig:c,tenantId:m}),r[p]=h}}}var Te=["airtable","amplitude","asana","box","cal","calendly","discord","dropbox","exa","figma","fireflies","github","gmail","googlecalendar","googledrive","googlesheets","hackernews","hubspot","intercom","jira","linear","monday","notion","oura","pagerduty","posthog","resend","sentry","slack","spotify","stripe","tavily","teams","telegram","todoist","trello","twitter","twitterapiio","typeform","zoom"];function x(e){let t=e._def,n=t.typeName;switch(n){case"ZodString":return{type:"string"};case"ZodNumber":return{type:"number"};case"ZodBoolean":return{type:"boolean"};case"ZodNull":return{type:"null"};case"ZodUnknown":case"ZodAny":return{};case"ZodLiteral":return{const:t.value};case"ZodEnum":return{enum:t.values};case"ZodOptional":return x(t.innerType);case"ZodNullable":return{anyOf:[x(t.innerType),{type:"null"}]};case"ZodArray":return{type:"array",items:x(t.type)};case"ZodRecord":return{type:"object",additionalProperties:x(t.valueType)};case"ZodObject":{let r=t.shape(),o={},i=[];for(let[s,d]of Object.entries(r)){o[s]=x(d);let g=d._def.typeName;g!=="ZodOptional"&&g!=="ZodNullable"&&i.push(s)}let a={type:"object",properties:o};return i.length>0&&(a.required=i),a}case"ZodUnion":return{anyOf:t.options.map(x)};case"ZodIntersection":return{allOf:[x(t.left),x(t.right)]};case"ZodEffects":return x(t.schema);default:return{type:(n??"unknown").replace("Zod","").toLowerCase()}}}var Pe=["equals","contains","startsWith","endsWith","in"],Be=["equals","gt","gte","lt","lte","in"],Ne=["equals"],$e=["equals","before","after","between"];function re(e){let t=e._def;switch(t.typeName){case"ZodOptional":case"ZodNullable":case"ZodDefault":return re(t.innerType);case"ZodEffects":return re(t.schema);case"ZodString":return"string";case"ZodNumber":return"number";case"ZodBoolean":return"boolean";case"ZodDate":return"date";default:return null}}function oe(e){let t=e._def,n=t.typeName;if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")return oe(t.innerType);if(n==="ZodEffects")return oe(t.schema);if(n!=="ZodObject")return{};let r=t.shape(),o={};for(let[i,a]of Object.entries(r)){let s=re(a);s==="string"?o[i]={type:"string",operators:Pe}:s==="number"?o[i]={type:"number",operators:Be}:s==="boolean"?o[i]={type:"boolean",operators:Ne}:s==="date"&&(o[i]={type:"date",operators:$e})}return o}function We(e,t){for(let[n,r]of Object.entries(e))if(n.toLowerCase()===t)return[n,r]}function ie(e,t,n){for(let[r,o]of Object.entries(e)){let i=[...t,r];typeof o=="function"?n.push(i.join(".")):o!==null&&typeof o=="object"&&ie(o,i,n)}}function se(e){return e!==null&&typeof e=="object"&&"match"in e&&"handler"in e&&typeof e.match=="function"&&typeof e.handler=="function"}function ae(e,t,n){for(let[r,o]of Object.entries(e)){let i=[...t,r];se(o)?n.push(i.join(".")):o!==null&&typeof o=="object"&&ae(o,i,n)}}function xe(e,t){if(t.length===0)return null;let[n,...r]=t,o=Object.entries(e).find(([s])=>s.toLowerCase()===n);if(!o)return null;let[i,a]=o;if(r.length===0)return se(a)?[i]:null;if(a!==null&&typeof a=="object"&&!se(a)){let s=xe(a,r);if(s!==null)return[i,...s]}return null}function Ze(e,t,n){let r=[];r.push(`${e}({`),r.push(" webhookHooks: {");for(let a=0;a<t.length;a++){let s=" ".repeat(a+2);r.push(`${s}${t[a]}: {`)}let o=" ".repeat(t.length+2),i=o+" ";if(r.push(`${o}before(ctx, args) {`),r.push(`${i}return { ctx, args };`),r.push(`${o}},`),r.push(`${o}after(ctx, response) {`),n!==null){let s=JSON.stringify(n,null,2).split(`
|
|
14
14
|
`).map((d,g)=>g===0?`${i}// response.data: ${d}`:`${i}// ${d}`);r.push(...s)}else r.push(`${i}// response.data: unknown (register webhookSchemas to see the type)`);r.push(`${o}},`);for(let a=t.length-1;a>=0;a--){let s=" ".repeat(a+2);r.push(`${s}},`)}return r.push(" },"),r.push("})"),r.join(`
|
|
15
15
|
`)}var je=new Set(Te);function Z(e,t){let n=t?.type??"api",r=t?.plugin;if(r!==void 0){let i=e.find(s=>s.id===r);if(!i)return je.has(r)?`This plugin (${r}) is not configured. Please add it to the Corsair instance to see its associated methods.`:Z(e);if(n==="webhooks"){if(!i.webhooks)return[];let s=[];return ae(i.webhooks,[],s),s.map(d=>`${i.id}.webhooks.${d}`)}if(n==="db"){let s=i.schema?.entities;return s?Object.keys(s).map(d=>`${i.id}.db.${d}.search`):[]}if(!i.endpoints)return[];let a=[];return ie(i.endpoints,[],a),a.map(s=>`${i.id}.api.${s.toLowerCase()}`)}let o={};if(n==="webhooks")for(let i of e){if(!i.webhooks)continue;let a=[];ae(i.webhooks,[],a),o[i.id]=a.map(s=>`${i.id}.webhooks.${s}`)}else if(n==="db")for(let i of e){let a=i.schema?.entities;a&&(o[i.id]=Object.keys(a).map(s=>`${i.id}.db.${s}.search`))}else for(let i of e){if(!i.endpoints)continue;let a=[];ie(i.endpoints,[],a),o[i.id]=a.map(s=>`${i.id}.api.${s.toLowerCase()}`)}return o}function te(e,t){if(e){for(let[n,r]of Object.entries(e))if(n.toLowerCase()===t)return r}}function Le(e,t){let n=t.toLowerCase(),r=n.indexOf(".");if(r!==-1){let o=n.slice(0,r),i=n.slice(r+1),a=e.find(s=>s.id===o);if(a){if(i.startsWith("db.")){let y=i.slice(3),c=y.lastIndexOf(".");if(c!==-1){let m=y.slice(0,c),p=y.slice(c+1),u=a.schema?.entities;if(p==="search"&&u){let f=We(u,m);if(f){let[h,w]=f;return{description:`Search ${o} ${h} stored in the local database. Returns an array of matching records. Pass limit and offset (numbers) for pagination.`,filters:{entity_id:{type:"string",operators:Pe},data:oe(w)}}}}}return{availableMethods:Z(e,{type:"db"})}}if(i.startsWith("webhooks.")){let y=i.slice(9);if(a.webhooks){let c=xe(a.webhooks,y.split("."));if(c!==null){let m=c.join("."),p=te(a.webhookSchemas,m.toLowerCase()),u=p?.response?x(p.response):null;return{description:p?.description,payload:p?.payload?x(p.payload):void 0,response:u??void 0,usage:Ze(o,c,u)}}}return{availableWebhooks:Z(e,{type:"webhooks"})}}let s=i;s.startsWith("api.")&&(s=s.slice(4));let d=te(a.endpointMeta,s),g=te(a.endpointSchemas,s);if(d||g)return{description:d?.description,riskLevel:d?.riskLevel,irreversible:d?.irreversible,input:g?.input?x(g.input):void 0,output:g?.output?x(g.output):void 0}}}return{availableMethods:Z(e)}}function J(e){return{list_operations(t){return Z(e,t)},get_schema(t){return Le(e,t)}}}function He(e){return e!==null&&typeof e=="object"&&"match"in e&&"handler"in e&&typeof e.match=="function"&&typeof e.handler=="function"}function ce({webhooks:e,hooks:t,ctx:n,webhooksTree:r,keyBuilder:o}){for(let[i,a]of Object.entries(e)){let s=t?.[i];if(He(a)){let d=s,g=async y=>{let c=(p,u)=>a.handler(p,u),m=o?await o(n,"webhook"):void 0;return!d?.before&&!d?.after?c({...n,key:m},y):(async()=>{let p={...n,key:m},u=d.before?await d.before(p,y):{ctx:p,args:y,continue:!0,passToAfter:void 0};if(u.continue===!1)return;let f=await c(u.ctx,u.args);return f?.success===!0&&await d.after?.(u.ctx,f,u.passToAfter),f})()};r[i]={match:a.match,handler:g}}else if(a&&typeof a=="object"){let d={};ce({webhooks:a,hooks:s,ctx:n,webhooksTree:d,keyBuilder:o}),r[i]=d}}}function Ue(e,t,n){let r=null;return async()=>{if(r)return r;if(!e)throw new Error("Database not configured");let o=await e.db.selectFrom("corsair_integrations").selectAll().where("name","=",t).executeTakeFirst();if(!o)throw new Error(`Integration "${t}" not found. Make sure to create the integration first.`);let i=await e.db.selectFrom("corsair_accounts").selectAll().where("tenant_id","=",n).where("integration_id","=",o.id).executeTakeFirst();if(!i)throw new Error(`Account not found for tenant "${n}" and integration "${t}". Make sure to create the account first.`);return r=i.id,r}}function qe(e,t,n,r,o){return e?Y(e.db,t,n,r,o):{findByEntityId:async()=>null,findById:async()=>null,findManyByEntityIds:async()=>[],list:async()=>[],search:async()=>[],upsertByEntityId:async()=>{throw new Error("Database not configured")},deleteById:async()=>!1,deleteByEntityId:async()=>!1,count:async()=>0}}function de(e,t){let{database:n,tenantId:r,kek:o,rootErrorHandlers:i,approvalConfig:a}=t,s={},d={};for(let c of e)s[c.id]={},d[c.id]={};for(let c of e){let m=c.schema,p=r??"default",u=Ue(n,c.id,p);if(m?.entities){let C={};for(let[v,A]of Object.entries(m.entities)){let B=n?Y(n.db,u,v,m.version,A):qe(void 0,u,v,m.version,A);C[v]=B}d[c.id].db=C,s[c.id].db=C}let f=c.options,h=c.authConfig,w;if(n&&o&&f?.authType){let C=h?.[f.authType]?.account??[];w=G({authType:f.authType,integrationName:c.id,tenantId:p,kek:o,database:n,extraAccountFields:C}),s[c.id].keys=w}let E={database:n,db:d[c.id]?.db??{},$getAccountId:u,...c.options?{options:c.options}:{},...w?{keys:w,authType:f?.authType}:{},...r?{tenantId:r}:{}},T=c.endpoints??{},l=c.hooks,k={...i,...c.errorHandlers},b={},I=c.options?.permissions;ne({endpoints:T,hooks:l,ctx:E,tree:b,pluginId:c.id,errorHandlers:k,currentPath:[],keyBuilder:c.keyBuilder,permissionsConfig:I,endpointMeta:c.endpointMeta,database:n,approvalConfig:a,tenantId:r}),Object.keys(b).length>0&&(s[c.id].api=b),E.endpoints=b;let R=c.webhooks??{},P=c.webhookHooks;if(Object.keys(R).length>0){let C={};ce({webhooks:R,hooks:P,ctx:E,webhooksTree:C,keyBuilder:c.keyBuilder}),s[c.id].webhooks=C,c.pluginWebhookMatcher&&(s[c.id].pluginWebhookMatcher=c.pluginWebhookMatcher)}}let g=s,y=J(e);return{...g,...y}}function Re(e,t,n){let r={};for(let o of e){let i=o.options,a=o.authConfig;if(i?.authType){let s=a?.[i.authType]?.integration??[],d=z({authType:i.authType,integrationName:o.id,kek:n,database:t,extraIntegrationFields:s});r[o.id]=d}}return r}var Ae=Symbol.for("corsair:internal");function Kn(e){let t=e.database?ue(e.database):void 0,n=t&&e.kek?Re(e.plugins,t,e.kek):q(!!t,!!e.kek),r={plugins:e.plugins,database:t,kek:e.kek,multiTenancy:!!e.multiTenancy,approval:e.approval},o=we(t);if(e.multiTenancy)return Object.assign({withTenant:a=>{if(!a)throw new Error("corsair.withTenant(tenantId): tenantId must be a non-empty string");return de(e.plugins,{database:t,tenantId:a,kek:e.kek,rootErrorHandlers:e.errorHandlers,approvalConfig:e.approval})},keys:n,permissions:o,...J(e.plugins)},{[Ae]:r});let i=de(e.plugins,{database:t,tenantId:void 0,kek:e.kek,rootErrorHandlers:e.errorHandlers,approvalConfig:e.approval});return Object.assign({},i,{keys:n,permissions:o,[Ae]:r})}export{K as a,O as b,D as c,Q as d,X as e,S as f,M as g,$ as h,W as i,z as j,G as k,he as l,me as m,Te as n,Ae as o,Kn as p};
|
package/dist/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g,h,i,j,k,l,m,o as n,p as o}from"./chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,o as n,p as o}from"./chunk-J7NCVPA4.js";import"./chunk-Q55TIVXA.js";import"./chunk-73HYPGOI.js";import"./chunk-A7CRE5AE.js";import"./chunk-476ZUILE.js";export{i as BASE_AUTH_FIELDS,n as CORSAIR_INTERNAL,k as createAccountKeyManager,o as createCorsair,j as createIntegrationKeyManager,g as decryptConfig,c as decryptDEK,e as decryptWithDEK,f as encryptConfig,b as encryptDEK,d as encryptWithDEK,a as generateDEK,m as initializeAccountDEK,l as initializeIntegrationDEK,h as reEncryptConfig};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as W}from"./chunk-
|
|
1
|
+
import{a as W}from"./chunk-B7SHIP45.js";import{n as k,p as x}from"./chunk-J7NCVPA4.js";import"./chunk-34Z5IBIX.js";import"./chunk-Q55TIVXA.js";import"./chunk-HO245J34.js";import"./chunk-73HYPGOI.js";import"./chunk-A7CRE5AE.js";import"./chunk-476ZUILE.js";var R=Symbol.for("corsair:internal");function P(n,r){let o=n;for(let e of r){if(!o||typeof o!="object")return null;o=o[e]}return typeof o=="function"?o:null}function b(n){return n[R]?.database}async function I(n,r){let o=new Date().toISOString(),e=await n.permissions.find_by_token(r);if(!e)return console.error("executePermission: no permission found for token."),{error:"executePermission: no permission found for token."};if(e.status!=="approved")return console.error(`executePermission: permission '${e.id}' is '${e.status}', expected 'approved'.`),{endpoint:e.endpoint,plugin:e.plugin,result:null,error:`executePermission: permission '${e.id}' is '${e.status}', expected 'approved'.`};if(e.expires_at<o){let i=b(n);return i&&await i.db.updateTable("corsair_permissions").set({status:"expired",updated_at:new Date}).where("id","=",e.id).execute(),console.error(`executePermission: permission '${e.id}' has expired.`),{error:`executePermission: permission '${e.id}' has expired.`,endpoint:e.endpoint,plugin:e.plugin,result:null}}let t=e.tenant_id??"default",g=(n.withTenant?n.withTenant(t):n)[e.plugin];if(!g?.api)return console.error(`executePermission: plugin '${e.plugin}' not found or has no API on this corsair instance.`),{error:`executePermission: plugin '${e.plugin}' not found or has no API on this corsair instance.`,plugin:e.plugin,endpoint:e.endpoint,result:null};let d=P(g.api,e.endpoint.split("."));if(!d)return console.error(`executePermission: endpoint '${e.endpoint}' not found in plugin '${e.plugin}'.`),{endpoint:e.endpoint,plugin:e.plugin,result:null,error:`executePermission: endpoint '${e.endpoint}' not found in plugin '${e.plugin}'.`};await n.permissions.set_executing(e.id);try{let i=typeof e.args=="string"?JSON.parse(e.args):e.args,a=await d(i);return await n.permissions.set_completed(e.id),{plugin:e.plugin,endpoint:e.endpoint,result:a}}catch(i){let a=i instanceof Error?i.message:String(i),c=b(n);return c&&await c.db.updateTable("corsair_permissions").set({status:"failed",error:a,updated_at:new Date}).where("id","=",e.id).execute(),{plugin:e.plugin,endpoint:e.endpoint,result:null,error:a}}}function B(n){return n!==null&&typeof n=="object"&&"match"in n&&"handler"in n&&typeof n.match=="function"&&typeof n.handler=="function"}function m(n,r,o=[]){for(let[e,t]of Object.entries(n))if(B(t)){if(t.match(r))return{webhook:t,path:[...o,e]}}else if(t&&typeof t=="object"){let s=m(t,r,[...o,e]);if(s)return s}return null}function C(n){let r={};for(let[o,e]of Object.entries(n))r[o.toLowerCase()]=Array.isArray(e)?e[0]:e;return r}function S(n){let r=n["x-goog-resource-uri"],o=n["x-goog-channel-id"];if(!r||!o)return null;let e={resourceId:n["x-goog-resource-id"]||"",resourceState:n["x-goog-resource-state"]||"",resourceUri:r,channelId:o,channelExpiration:n["x-goog-channel-expiration"]||""};return r.includes("/drive/")&&(e.kind="drive#change"),{message:{data:Buffer.from(JSON.stringify(e)).toString("base64"),messageId:n["x-goog-message-number"]||""}}}async function T(n,r,o,e){let t=C(r),s=typeof o=="string"?JSON.parse(o):o;(!s||typeof s=="object"&&Object.keys(s).length===0)&&t["x-goog-resource-uri"]&&(s=S(t)||s);let d={headers:t,body:s},i=e?.tenantId||"default",a=n.withTenant?n.withTenant(i):n,c=k;for(let l of c){let p=a[l];if(!p||!p.webhooks||p.pluginWebhookMatcher&&!p.pluginWebhookMatcher(d))continue;let f=m(p.webhooks,d);if(!f)continue;let h=f.path.join("."),w={payload:s,headers:t,rawBody:typeof o=="string"?o:JSON.stringify(o)};try{let u=await f.webhook.handler(w),y=!!Object.keys(u.returnToSender||{})?.length;return{plugin:l,action:h,body:s,response:y?{...u?.returnToSender,success:!0}:{success:!0},...u.responseHeaders&&{responseHeaders:u.responseHeaders}}}catch(u){return console.error(`Error executing webhook handler for ${l}.${h}:`,u),{plugin:l,action:h,body:s,response:{success:!1,error:u instanceof Error?u.message:"Unknown error"}}}}return{plugin:null,action:null,body:null}}export{x as createCorsair,I as executePermission,T as processWebhook,W as setupCorsair};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as m,c as $}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var D=class extends Error{constructor(a,o){super(a);this.code=o;this.name="GmailAPIError"}},ve="https://gmail.googleapis.com/gmail/v1";async function Pe(t,e,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:t,client_secret:e,refresh_token:a,grant_type:"refresh_token"})});if(!o.ok){let n=await o.text();throw new D(`Failed to refresh access token: ${n}`,o.status)}return await o.json()}async function N({accessToken:t,expiresAt:e,clientId:a,clientSecret:o,refreshToken:n}){let i=Math.floor(Date.now()/1e3);if(t&&e&&Number(e)>i+300)return{accessToken:t,expiresAt:Number(e),refreshed:!1};let p=await Pe(a,o,n);return{accessToken:p.access_token,expiresAt:i+p.expires_in,refreshed:!0}}async function l(t,e,a={}){let{method:o="GET",body:n,query:i}=a;return await $({BASE:ve,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json"}},{method:o,url:t,body:o==="POST"||o==="PUT"||o==="PATCH"?n:void 0,mediaType:"application/json",query:o==="GET"?i:void 0})}var W=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/drafts`,t.key,{method:"GET",query:{maxResults:e.maxResults,pageToken:e.pageToken,q:e.q}});if(a.drafts&&t.db.drafts)try{for(let o of a.drafts)o.id&&await t.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(t,"gmail.drafts.list",{...e},"completed"),a},q=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/drafts/${e.id}`,t.key,{method:"GET",query:{format:e.format}});if(a.id&&t.db.drafts)try{await t.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(t,"gmail.drafts.get",{...e},"completed"),a},_=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/drafts`,t.key,{method:"POST",body:e.draft});return a.id&&await t.endpoints.drafts.get({id:a.id,userId:e.userId}),await m(t,"gmail.drafts.create",{...e},"completed"),a},H=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/drafts/${e.id}`,t.key,{method:"PUT",body:e.draft});return a.id&&await t.endpoints.drafts.get({id:a.id,userId:e.userId}),await m(t,"gmail.drafts.update",{...e},"completed"),a},z=async(t,e)=>{if(await l(`/users/${e.userId||"me"}/drafts/${e.id}`,t.key,{method:"DELETE"}),t.db.drafts)try{await t.db.drafts.deleteByEntityId(e.id)}catch(a){console.warn("Failed to delete draft from database:",a)}await m(t,"gmail.drafts.delete",{...e},"completed")},F=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/drafts/send`,t.key,{method:"POST",body:{id:e.id,message:e.message}});return await m(t,"gmail.drafts.send",{...e},"completed"),a};var V=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/labels`,t.key,{method:"GET"});if(a.labels&&t.db.labels)try{for(let o of a.labels)o.id&&await t.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 m(t,"gmail.labels.list",{...e},"completed"),a},K=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/labels/${e.id}`,t.key,{method:"GET"});if(a.id&&t.db.labels)try{await t.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 m(t,"gmail.labels.get",{...e},"completed"),a},Y=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/labels`,t.key,{method:"POST",body:e.label});return a.id&&await t.endpoints.labels.get({id:a.id,userId:e.userId}),await m(t,"gmail.labels.create",{...e},"completed"),a},Z=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/labels/${e.id}`,t.key,{method:"PUT",body:e.label});return a.id&&await t.endpoints.labels.get({id:a.id,userId:e.userId}),await m(t,"gmail.labels.update",{...e},"completed"),a},J=async(t,e)=>{if(await l(`/users/${e.userId||"me"}/labels/${e.id}`,t.key,{method:"DELETE"}),t.db.labels)try{await t.db.labels.deleteByEntityId(e.id)}catch(a){console.warn("Failed to delete label from database:",a)}await m(t,"gmail.labels.delete",{...e},"completed")};function x(t,e){return t?.headers?t.headers.find(o=>o.name?.toLowerCase()===e.toLowerCase())?.value:void 0}function xe(t){if(t.payload)return x(t.payload,"Subject")}function Re(t){if(t.payload)return x(t.payload,"From")}function Oe(t){if(t.payload)return x(t.payload,"To")}function X(t){if(!t)return;let e,a;if(t.body?.data)try{let o=Buffer.from(t.body.data,"base64").toString("utf-8");t.mimeType==="text/plain"?e=o:t.mimeType==="text/html"&&(a=o)}catch{}if(t.parts&&t.parts.length>0)for(let o of t.parts){let n=X(o);n&&(o.mimeType==="text/plain"?e=n:o.mimeType==="text/html"&&!e&&(a=n))}return e||a}function je(t){if(t.payload)return X(t.payload)}var Q=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/messages`,t.key,{method:"GET",query:{q:e.q,maxResults:e.maxResults,pageToken:e.pageToken,labelIds:e.labelIds?.join(","),includeSpamTrash:e.includeSpamTrash}});if(a.messages&&t.db.messages)try{for(let o of a.messages)o.id&&await t.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 m(t,"gmail.messages.list",{...e},"completed"),a},ee=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/messages/${e.id}`,t.key,{method:"GET",query:{format:e.format,metadataHeaders:e.metadataHeaders?.join(",")}});if(a.id&&t.db.messages)try{let o=xe(a),n=je(a),i=Re(a),d=Oe(a);await t.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 m(t,"gmail.messages.get",{...e},"completed"),a},te=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/messages/send`,t.key,{method:"POST",body:{raw:e.raw,threadId:e.threadId}});return a.id&&await t.endpoints.messages.get({id:a.id,userId:e.userId}),await m(t,"gmail.messages.send",{...e},"completed"),a},se=async(t,e)=>{if(await l(`/users/${e.userId||"me"}/messages/${e.id}`,t.key,{method:"DELETE"}),t.db.messages)try{await t.db.messages.deleteByEntityId(e.id)}catch(a){console.warn("Failed to delete message from database:",a)}await m(t,"gmail.messages.delete",{...e},"completed")},ae=async(t,e)=>{let a={};e.addLabelIds&&e.addLabelIds.length>0&&(a.addLabelIds=e.addLabelIds),e.removeLabelIds&&e.removeLabelIds.length>0&&(a.removeLabelIds=e.removeLabelIds);let o=await l(`/users/${e.userId||"me"}/messages/${e.id}/modify`,t.key,{method:"POST",body:a});return o.id&&await t.endpoints.messages.get({id:o.id,userId:e.userId}),await m(t,"gmail.messages.modify",{...e},"completed"),o},oe=async(t,e)=>{let a={ids:e.ids};e.addLabelIds&&e.addLabelIds.length>0&&(a.addLabelIds=e.addLabelIds),e.removeLabelIds&&e.removeLabelIds.length>0&&(a.removeLabelIds=e.removeLabelIds),await l(`/users/${e.userId||"me"}/messages/batchModify`,t.key,{method:"POST",body:a}),await m(t,"gmail.messages.batchModify",{...e},"completed")},ie=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/messages/${e.id}/trash`,t.key,{method:"POST"});return a.id&&await t.endpoints.messages.get({id:a.id,userId:e.userId}),await m(t,"gmail.messages.trash",{...e},"completed"),a},ne=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/messages/${e.id}/untrash`,t.key,{method:"POST"});return a.id&&await t.endpoints.messages.get({id:a.id,userId:e.userId}),await m(t,"gmail.messages.untrash",{...e},"completed"),a};var re=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/threads`,t.key,{method:"GET",query:{q:e.q,maxResults:e.maxResults,pageToken:e.pageToken,labelIds:e.labelIds?.join(","),includeSpamTrash:e.includeSpamTrash}});if(a.threads&&t.db.threads)try{for(let o of a.threads)o.id&&await t.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 m(t,"gmail.threads.list",{...e},"completed"),a},de=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/threads/${e.id}`,t.key,{method:"GET",query:{format:e.format,metadataHeaders:e.metadataHeaders?.join(",")}});if(a.id&&t.db.threads)try{await t.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 m(t,"gmail.threads.get",{...e},"completed"),a},le=async(t,e)=>{let a={};e.addLabelIds&&e.addLabelIds.length>0&&(a.addLabelIds=e.addLabelIds),e.removeLabelIds&&e.removeLabelIds.length>0&&(a.removeLabelIds=e.removeLabelIds);let o=await l(`/users/${e.userId||"me"}/threads/${e.id}/modify`,t.key,{method:"POST",body:a});return o.id&&await t.endpoints.threads.get({id:o.id,userId:e.userId}),await m(t,"gmail.threads.modify",{...e},"completed"),o},me=async(t,e)=>{if(await l(`/users/${e.userId||"me"}/threads/${e.id}`,t.key,{method:"DELETE"}),t.db.threads)try{await t.db.threads.deleteByEntityId(e.id)}catch(a){console.warn("Failed to delete thread from database:",a)}await m(t,"gmail.threads.delete",{...e},"completed")},pe=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/threads/${e.id}/trash`,t.key,{method:"POST"});return a.id&&await t.endpoints.threads.get({id:a.id,userId:e.userId}),await m(t,"gmail.threads.trash",{...e},"completed"),a},ge=async(t,e)=>{let a=await l(`/users/${e.userId||"me"}/threads/${e.id}/untrash`,t.key,{method:"POST"});return a.id&&await t.endpoints.threads.get({id:a.id,userId:e.userId}),await m(t,"gmail.threads.untrash",{...e},"completed"),a};import{z as s}from"zod";var Ue=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()}),$e=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),Ne=s.object({userId:s.string().optional(),raw:s.string(),threadId:s.string().optional()}),We=s.object({userId:s.string().optional(),id:s.string()}),qe=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),_e=s.object({userId:s.string().optional(),ids:s.array(s.string()).optional(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),He=s.object({userId:s.string().optional(),id:s.string()}),ze=s.object({userId:s.string().optional(),id:s.string()}),Fe=s.object({userId:s.string().optional()}),Ve=s.object({userId:s.string().optional(),id:s.string()}),Ke=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()})}),Ye=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()})}),Ze=s.object({userId:s.string().optional(),id:s.string()}),Je=s.object({userId:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),q:s.string().optional()}),Xe=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional()}),Qe=s.object({userId:s.string().optional(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),et=s.object({userId:s.string().optional(),id:s.string(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),tt=s.object({userId:s.string().optional(),id:s.string()}),st=s.object({userId:s.string().optional(),id:s.string().optional(),message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()}),at=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()}),ot=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),it=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),nt=s.object({userId:s.string().optional(),id:s.string()}),rt=s.object({userId:s.string().optional(),id:s.string()}),dt=s.object({userId:s.string().optional(),id:s.string()}),lt=s.object({userId:s.string().optional()}),c={messagesList:Ue,messagesGet:$e,messagesSend:Ne,messagesDelete:We,messagesModify:qe,messagesBatchModify:_e,messagesTrash:He,messagesUntrash:ze,labelsList:Fe,labelsGet:Ve,labelsCreate:Ke,labelsUpdate:Ye,labelsDelete:Ze,draftsList:Je,draftsGet:Xe,draftsCreate:Qe,draftsUpdate:et,draftsDelete:tt,draftsSend:st,threadsList:at,threadsGet:ot,threadsModify:it,threadsDelete:nt,threadsTrash:rt,threadsUntrash:dt,usersGetProfile:lt},mt=s.object({name:s.string().optional(),value:s.string().optional()}),pt=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(mt).optional(),body:pt.optional()}),ce=gt.extend({parts:s.lazy(()=>s.array(ce).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(t=>{if(t instanceof Date)return t;if(typeof t=="number")return new Date(t);if(typeof t=="string"){let e=Number(t);return isNaN(e)?null:new Date(e)}return null}).nullable().optional(),sizeEstimate:s.number().optional(),payload:ce.optional(),raw:s.string().optional()}),ct=s.object({messages:s.array(E).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),ut=s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}),S=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:ut.optional()}),ht=s.object({labels:s.array(S).optional()}),v=s.object({id:s.string().optional(),message:E.optional()}),ft=s.object({drafts:s.array(v).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),L=s.object({id:s.string().optional(),snippet:s.string().optional(),historyId:s.string().optional(),messages:s.array(E).optional()}),bt=s.object({threads:s.array(L).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),yt=s.object({emailAddress:s.string().optional(),messagesTotal:s.number().optional(),threadsTotal:s.number().optional(),historyId:s.string().optional()}),u={messagesList:ct,messagesGet:E,messagesSend:E,messagesDelete:s.void(),messagesModify:E,messagesBatchModify:s.void(),messagesTrash:E,messagesUntrash:E,labelsList:ht,labelsGet:S,labelsCreate:S,labelsUpdate:S,labelsDelete:s.void(),draftsList:ft,draftsGet:v,draftsCreate:v,draftsUpdate:v,draftsDelete:s.void(),draftsSend:E,threadsList:bt,threadsGet:L,threadsModify:L,threadsDelete:s.void(),threadsTrash:L,threadsUntrash:L,usersGetProfile:yt};var G={list:Q,get:ee,send:te,delete:se,modify:ae,batchModify:oe,trash:ie,untrash:ne},T={list:V,get:K,create:Y,update:Z,delete:J},I={list:W,get:q,create:_,update:H,delete:z,send:F},w={list:re,get:de,modify:le,delete:me,trash:pe,untrash:ge};import{z as k}from"zod";import{z as r}from"zod";var Et=r.object({name:r.string().optional(),value:r.string().optional()}),Gt=r.object({attachmentId:r.string().optional(),size:r.number().optional(),data:r.string().optional()}),ue=r.lazy(()=>r.object({partId:r.string().optional(),mimeType:r.string().optional(),filename:r.string().optional(),headers:r.array(Et).optional(),body:Gt.optional(),parts:r.array(ue).optional()})),he=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:ue.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()}),fe=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()}),be=r.object({id:r.string(),messageId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),ye=r.object({id:r.string(),snippet:r.string().optional(),historyId:r.string().optional(),createdAt:r.coerce.date().nullable().optional()});var ds=k.object({clientId:k.string(),clientSecret:k.string(),accessToken:k.string(),refreshToken:k.string()}),R={version:"1.0.0",entities:{messages:he,labels:fe,drafts:be,threads:ye}};import{z as g}from"zod";var It=g.object({data:g.string().optional(),attributes:g.record(g.string()).optional(),messageId:g.string().optional(),publishTime:g.string().optional()}),Ee=g.object({message:It.optional(),subscription:g.string().optional(),event:g.unknown().optional()}),ps=g.object({emailAddress:g.string().optional(),historyId:g.string().optional()}),wt=g.object({type:g.literal("messageReceived"),emailAddress:g.string(),historyId:g.string(),message:g.custom()}),Tt=g.object({type:g.literal("messageDeleted"),emailAddress:g.string(),historyId:g.string(),message:g.custom()}),Mt=g.object({type:g.literal("messageLabelChanged"),emailAddress:g.string(),historyId:g.string(),message:g.custom(),labelsAdded:g.array(g.string()).optional(),labelsRemoved:g.array(g.string()).optional()}),Ge=g.union([wt,Tt,Mt]);function M(t){let e=Buffer.from(t,"base64").toString("utf-8");return JSON.parse(e)}function O(t){return e=>{let a=e.body;if(!a.message?.data)return!1;try{let o=M(a.message.data);return!!o.historyId&&!!o.emailAddress}catch{return!1}}}var Lt=100,kt=10,St=10;function j(t,e){return t?.headers?t.headers.find(o=>o.name?.toLowerCase()===e.toLowerCase())?.value:void 0}function vt(t){if(t.payload)return j(t.payload,"Subject")}function Pt(t){if(t.payload)return j(t.payload,"From")}function Ct(t){if(t.payload)return j(t.payload,"To")}function Te(t){if(!t)return;let e,a;if(t.body?.data)try{let o=Buffer.from(t.body.data,"base64").toString("utf-8");t.mimeType==="text/plain"?e=o:t.mimeType==="text/html"&&(a=o)}catch{}if(t.parts&&t.parts.length>0)for(let o of t.parts){let n=Te(o);n&&(o.mimeType==="text/plain"?e=n:o.mimeType==="text/html"&&!e&&(a=n))}return e||a}function Dt(t){if(t.payload)return Te(t.payload)}function xt(t){let e=[],a=[],o=[];if(!t)return{added:e,deleted:a,modified:o};for(let n of t){if(n.messagesAdded)for(let i of n.messagesAdded)i.message?.id&&e.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(e)],deleted:[...new Set(a)],modified:[...new Set(o)]}}async function A(t,e,a){let[o,n]=await Promise.all([l(`/users/${e}/messages/${a}`,t,{method:"GET",query:{format:"full"}}),l(`/users/${e}/messages/${a}`,t,{method:"GET",query:{format:"raw"}}).catch(()=>null)]);return{...o,raw:n?.raw}}async function Rt(t,e,a,o){return l(`/users/${e}/messages/${a}/attachments/${o}`,t,{method:"GET"})}async function Me(t,e,a){if(!a.payload)return a;let o=async i=>{if(!i)return i;if(i.body?.attachmentId)try{let d=await Rt(t,e,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(p=>p!==void 0)}}return i},n=await o(a.payload);return{...a,payload:n}}function Ot(t){let e=Number(t);return e>1?String(e-1):t}async function Le(t,e){return!t.db?.messages||!e.id?"":(await t.db.messages.upsertByEntityId(e.id,{...e,id:e.id,subject:vt(e),body:Dt(e),from:Pt(e),to:Ct(e),createdAt:new Date}))?.id??""}async function jt(t,e,a,o){let n=await l(`/users/${a}/messages`,e,{method:"GET",query:{maxResults:kt}}),i=[],d=[];if(!n.messages?.length)return{added:i,modified:d};let p=Number(o);for(let h of n.messages)if(h.id)try{let f=await A(e,a,h.id);(f.historyId?Number(f.historyId):0)>=p-St&&(t.db?.messages&&await t.db.messages.findByEntityId(h.id)?d.push(h.id):i.push(h.id))}catch{}return{added:i,modified:d}}async function Ie(t,e,a,o){let n=null,i="";for(let d of o)try{let p=await A(e,a,d),h=await Me(e,a,p);n||(n=h);try{let f=await Le(t,h);!i&&f&&(i=f)}catch(f){throw console.error(`Failed to save message ${h.id} to database:`,f),f}}catch(p){console.warn(`Failed to process message ${d}:`,p)}return{message:n,corsairEntityId:i}}async function At(t,e,a,o){let n=null,i="";if(!t.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let p=null;try{p=await l(`/users/${a}/messages/${d}`,e,{method:"GET",query:{format:"full"}})}catch(h){if(h?.statusCode===404)continue}if(!n&&p&&(n=p),!i){let h=await t.db.messages.findByEntityId(d);h&&(i=h.id)}await t.db.messages.deleteByEntityId(d)}catch(p){console.warn(`Failed to delete message ${d} from database:`,p)}return{message:n,corsairEntityId:i}}async function we(t,e,a,o){let n=null,i="";if(!t.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let p=await A(e,a,d),h=await Me(e,a,p);n||(n=h);try{let f=await Le(t,h);!i&&f&&(i=f)}catch(f){throw console.error(`Failed to update message ${h.id} in database:`,f),f}}catch(p){console.warn(`Failed to process message ${d}:`,p)}return{message:n,corsairEntityId:i}}var ke={match:O("messageChanged"),handler:async(t,e)=>{let a=e.payload;if(!a.message?.data)return{success:!1,error:"No message data in notification"};let o=M(a.message.data);if(!o.historyId||!o.emailAddress)return{success:!1,error:"Invalid push notification format"};let n=t.key,i=o.emailAddress,d=o.historyId;try{let p=Ot(d),h=await l(`/users/${i}/history`,n,{method:"GET",query:{startHistoryId:p,maxResults:Lt}}),{added:f,deleted:P,modified:C}=xt(h.history);if(C.length>0){let b=await we(t,n,i,C),y={type:"messageLabelChanged",emailAddress:i,historyId:d,message:b.message??{}};return await m(t,"gmail.webhook.messageLabelChanged",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if(f.length>0){let b=await Ie(t,n,i,f),y={type:"messageReceived",emailAddress:i,historyId:d,message:b.message??{}};return await m(t,"gmail.webhook.messageReceived",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if(P.length>0){let b=await At(t,n,i,P),y={type:"messageDeleted",emailAddress:i,historyId:d,message:b.message??{}};return await m(t,"gmail.webhook.messageDeleted",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}let{added:B,modified:U}=await jt(t,n,i,d);if(U.length>0){let b=await we(t,n,i,U),y={type:"messageLabelChanged",emailAddress:i,historyId:d,message:b.message??{}};return await m(t,"gmail.webhook.messageLabelChanged",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if(B.length>0){let b=await Ie(t,n,i,B),y={type:"messageReceived",emailAddress:i,historyId:d,message:b.message??{}};return await m(t,"gmail.webhook.messageReceived",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}return{success:!0,corsairEntityId:"",data:{type:"messageReceived",emailAddress:i,historyId:d,message:{}}}}catch(p){return console.error("Failed to process Gmail webhook:",p),{success:!1,error:`Failed to process message: ${p instanceof Error?p.message:"Unknown error"}`}}}};var Se={messageChanged:ke};var Bt={oauth_2:{integration:["topic_id"]}},Ut={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:T.list,get:T.get,create:T.create,update:T.update,delete:T.delete},drafts:{list:I.list,get:I.get,create:I.create,update:I.update,delete:I.delete,send:I.send},threads:{list:w.list,get:w.get,modify:w.modify,delete:w.delete,trash:w.trash,untrash:w.untrash}},$t={"messages.list":{input:c.messagesList,output:u.messagesList},"messages.get":{input:c.messagesGet,output:u.messagesGet},"messages.send":{input:c.messagesSend,output:u.messagesSend},"messages.delete":{input:c.messagesDelete,output:u.messagesDelete},"messages.modify":{input:c.messagesModify,output:u.messagesModify},"messages.batchModify":{input:c.messagesBatchModify,output:u.messagesBatchModify},"messages.trash":{input:c.messagesTrash,output:u.messagesTrash},"messages.untrash":{input:c.messagesUntrash,output:u.messagesUntrash},"labels.list":{input:c.labelsList,output:u.labelsList},"labels.get":{input:c.labelsGet,output:u.labelsGet},"labels.create":{input:c.labelsCreate,output:u.labelsCreate},"labels.update":{input:c.labelsUpdate,output:u.labelsUpdate},"labels.delete":{input:c.labelsDelete,output:u.labelsDelete},"drafts.list":{input:c.draftsList,output:u.draftsList},"drafts.get":{input:c.draftsGet,output:u.draftsGet},"drafts.create":{input:c.draftsCreate,output:u.draftsCreate},"drafts.update":{input:c.draftsUpdate,output:u.draftsUpdate},"drafts.delete":{input:c.draftsDelete,output:u.draftsDelete},"drafts.send":{input:c.draftsSend,output:u.draftsSend},"threads.list":{input:c.threadsList,output:u.threadsList},"threads.get":{input:c.threadsGet,output:u.threadsGet},"threads.modify":{input:c.threadsModify,output:u.threadsModify},"threads.delete":{input:c.threadsDelete,output:u.threadsDelete},"threads.trash":{input:c.threadsTrash,output:u.threadsTrash},"threads.untrash":{input:c.threadsUntrash,output:u.threadsUntrash}},Nt={messageChanged:Se.messageChanged},Wt={messageChanged:{description:"A Gmail message was received, deleted, or had its labels changed",payload:Ee,response:Ge}},qt="oauth_2",_t={"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 ks(t={}){let e={...t,authType:t.authType??qt};return{id:"gmail",schema:R,options:e,authConfig:Bt,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:e.hooks,webhookHooks:e.webhookHooks,endpoints:Ut,webhooks:Nt,endpointMeta:_t,endpointSchemas:$t,webhookSchemas:Wt,keyBuilder:async a=>{if(e.key)return e.key;if(a.authType==="oauth_2"){let[o,n,i]=await Promise.all([a.keys.get_access_token(),a.keys.get_expires_at(),a.keys.get_refresh_token()]);if(!i)throw new Error("No refresh token. Cannot get access token.");let d=await a.keys.get_integration_credentials();if(!d.client_id||!d.client_secret)throw new Error("No client id or client secret");let p=await N({accessToken:o,expiresAt:n,refreshToken:i,clientId:d.client_id,clientSecret:d.client_secret});return p.refreshed&&await Promise.all([a.keys.set_access_token(p.accessToken),a.keys.set_expires_at(String(p.expiresAt))]),p.accessToken}return""},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=M(i.message.data);return!!d.emailAddress&&!!d.historyId}catch{return!1}}}}export{R as GmailSchema,O as createGmailWebhookMatcher,M as decodePubSubMessage,ks as gmail,Bt as gmailAuthConfig,$t as gmailEndpointSchemas,Ut as gmailEndpointsNested,Nt as gmailWebhooksNested};
|
|
1
|
+
import{a as m,c as N}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var R=class extends Error{constructor(a,o){super(a);this.code=o;this.name="GmailAPIError"}},Pe="https://gmail.googleapis.com/gmail/v1";async function Ce(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 r=await o.text();throw new R(`Failed to refresh access token: ${r}`,o.status)}return await o.json()}async function x({accessToken:e,expiresAt:t,clientId:a,clientSecret:o,refreshToken:r,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 l=await Ce(a,o,r);return{accessToken:l.access_token,expiresAt:d+l.expires_in,refreshed:!0}}async function E(e,t,a={}){let{method:o="GET",body:r,query:i}=a;return await N({BASE:Pe,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"?r:void 0,mediaType:"application/json",query:o==="GET"?i:void 0})}function De(e){return e instanceof Error&&"status"in e&&e.status===401}async function c(e,t,a={}){try{return await E(e,t.key,a)}catch(o){if(De(o)&&t._refreshAuth){let r=await t._refreshAuth();return await E(e,r,a)}throw o}}var q=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},W=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},H=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},z=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},F=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")},V=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};var K=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 m(e,"gmail.labels.list",{...t},"completed"),a},Y=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 m(e,"gmail.labels.get",{...t},"completed"),a},Z=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 m(e,"gmail.labels.create",{...t},"completed"),a},J=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 m(e,"gmail.labels.update",{...t},"completed"),a},X=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 m(e,"gmail.labels.delete",{...t},"completed")};function A(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function Ae(e){if(e.payload)return A(e.payload,"Subject")}function Oe(e){if(e.payload)return A(e.payload,"From")}function je(e){if(e.payload)return A(e.payload,"To")}function Q(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 r=Q(o);r&&(o.mimeType==="text/plain"?t=r:o.mimeType==="text/html"&&!t&&(a=r))}return t||a}function Be(e){if(e.payload)return Q(e.payload)}var ee=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 m(e,"gmail.messages.list",{...t},"completed"),a},te=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=Ae(a),r=Be(a),i=Oe(a),d=je(a);await e.db.messages.upsertByEntityId(a.id,{...a,subject:o,body:r,from:i,to:d,id:a.id,createdAt:new Date})}catch(o){console.warn("Failed to save message to database:",o)}return await m(e,"gmail.messages.get",{...t},"completed"),a},se=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 m(e,"gmail.messages.send",{...t},"completed"),a},ae=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 m(e,"gmail.messages.delete",{...t},"completed")},oe=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 m(e,"gmail.messages.modify",{...t},"completed"),o},ie=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 m(e,"gmail.messages.batchModify",{...t},"completed")},re=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 m(e,"gmail.messages.trash",{...t},"completed"),a},ne=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 m(e,"gmail.messages.untrash",{...t},"completed"),a};var de=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 m(e,"gmail.threads.list",{...t},"completed"),a},le=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 m(e,"gmail.threads.get",{...t},"completed"),a},me=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 m(e,"gmail.threads.modify",{...t},"completed"),o},pe=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 m(e,"gmail.threads.delete",{...t},"completed")},ge=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 m(e,"gmail.threads.trash",{...t},"completed"),a},ce=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 m(e,"gmail.threads.untrash",{...t},"completed"),a};import{z as s}from"zod";var _e=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()}),Ne=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),qe=s.object({userId:s.string().optional(),raw:s.string(),threadId:s.string().optional()}),We=s.object({userId:s.string().optional(),id:s.string()}),He=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),ze=s.object({userId:s.string().optional(),ids:s.array(s.string()).optional(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),Fe=s.object({userId:s.string().optional(),id:s.string()}),Ve=s.object({userId:s.string().optional(),id:s.string()}),Ke=s.object({userId:s.string().optional()}),Ye=s.object({userId:s.string().optional(),id:s.string()}),Ze=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()})}),Je=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()})}),Xe=s.object({userId:s.string().optional(),id:s.string()}),Qe=s.object({userId:s.string().optional(),maxResults:s.number().optional(),pageToken:s.string().optional(),q:s.string().optional()}),et=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","raw","metadata"]).optional()}),tt=s.object({userId:s.string().optional(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),st=s.object({userId:s.string().optional(),id:s.string(),draft:s.object({message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()})}),at=s.object({userId:s.string().optional(),id:s.string()}),ot=s.object({userId:s.string().optional(),id:s.string().optional(),message:s.object({raw:s.string().optional(),threadId:s.string().optional()}).optional()}),it=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()}),rt=s.object({userId:s.string().optional(),id:s.string(),format:s.enum(["minimal","full","metadata"]).optional(),metadataHeaders:s.array(s.string()).optional()}),nt=s.object({userId:s.string().optional(),id:s.string(),addLabelIds:s.array(s.string()).optional(),removeLabelIds:s.array(s.string()).optional()}),dt=s.object({userId:s.string().optional(),id:s.string()}),lt=s.object({userId:s.string().optional(),id:s.string()}),mt=s.object({userId:s.string().optional(),id:s.string()}),pt=s.object({userId:s.string().optional()}),u={messagesList:_e,messagesGet:Ne,messagesSend:qe,messagesDelete:We,messagesModify:He,messagesBatchModify:ze,messagesTrash:Fe,messagesUntrash:Ve,labelsList:Ke,labelsGet:Ye,labelsCreate:Ze,labelsUpdate:Je,labelsDelete:Xe,draftsList:Qe,draftsGet:et,draftsCreate:tt,draftsUpdate:st,draftsDelete:at,draftsSend:ot,threadsList:it,threadsGet:rt,threadsModify:nt,threadsDelete:dt,threadsTrash:lt,threadsUntrash:mt,usersGetProfile:pt},gt=s.object({name:s.string().optional(),value:s.string().optional()}),ct=s.object({attachmentId:s.string().optional(),size:s.number().optional(),data:s.string().optional()}),ut=s.object({partId:s.string().optional(),mimeType:s.string().optional(),filename:s.string().optional(),headers:s.array(gt).optional(),body:ct.optional()}),ue=ut.extend({parts:s.lazy(()=>s.array(ue).optional())}),G=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:ue.optional(),raw:s.string().optional()}),ht=s.object({messages:s.array(G).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),ft=s.object({textColor:s.string().optional(),backgroundColor:s.string().optional()}),v=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:ft.optional()}),bt=s.object({labels:s.array(v).optional()}),P=s.object({id:s.string().optional(),message:G.optional()}),yt=s.object({drafts:s.array(P).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),L=s.object({id:s.string().optional(),snippet:s.string().optional(),historyId:s.string().optional(),messages:s.array(G).optional()}),Et=s.object({threads:s.array(L).optional(),nextPageToken:s.string().optional(),resultSizeEstimate:s.number().optional()}),Gt=s.object({emailAddress:s.string().optional(),messagesTotal:s.number().optional(),threadsTotal:s.number().optional(),historyId:s.string().optional()}),h={messagesList:ht,messagesGet:G,messagesSend:G,messagesDelete:s.void(),messagesModify:G,messagesBatchModify:s.void(),messagesTrash:G,messagesUntrash:G,labelsList:bt,labelsGet:v,labelsCreate:v,labelsUpdate:v,labelsDelete:s.void(),draftsList:yt,draftsGet:P,draftsCreate:P,draftsUpdate:P,draftsDelete:s.void(),draftsSend:G,threadsList:Et,threadsGet:L,threadsModify:L,threadsDelete:s.void(),threadsTrash:L,threadsUntrash:L,usersGetProfile:Gt};var I={list:ee,get:te,send:se,delete:ae,modify:oe,batchModify:ie,trash:re,untrash:ne},M={list:K,get:Y,create:Z,update:J,delete:X},w={list:q,get:W,create:H,update:z,delete:F,send:V},T={list:de,get:le,modify:me,delete:pe,trash:ge,untrash:ce};import{z as k}from"zod";import{z as n}from"zod";var It=n.object({name:n.string().optional(),value:n.string().optional()}),wt=n.object({attachmentId:n.string().optional(),size:n.number().optional(),data:n.string().optional()}),he=n.lazy(()=>n.object({partId:n.string().optional(),mimeType:n.string().optional(),filename:n.string().optional(),headers:n.array(It).optional(),body:wt.optional(),parts:n.array(he).optional()})),fe=n.object({id:n.string(),threadId:n.string().optional(),labelIds:n.array(n.string()).optional(),snippet:n.string().optional(),historyId:n.string().optional(),internalDate:n.string().optional(),sizeEstimate:n.number().optional(),payload:he.optional(),raw:n.string().optional(),subject:n.string().optional(),body:n.string().optional(),from:n.string().optional(),to:n.string().optional(),createdAt:n.coerce.date().nullable().optional()}),be=n.object({id:n.string(),name:n.string().optional(),messageListVisibility:n.enum(["show","hide"]).optional(),labelListVisibility:n.enum(["labelShow","labelShowIfUnread","labelHide"]).optional(),type:n.enum(["system","user"]).optional(),messagesTotal:n.number().optional(),messagesUnread:n.number().optional(),threadsTotal:n.number().optional(),threadsUnread:n.number().optional(),createdAt:n.coerce.date().nullable().optional()}),ye=n.object({id:n.string(),messageId:n.string().optional(),createdAt:n.coerce.date().nullable().optional()}),Ee=n.object({id:n.string(),snippet:n.string().optional(),historyId:n.string().optional(),createdAt:n.coerce.date().nullable().optional()});var ms=k.object({clientId:k.string(),clientSecret:k.string(),accessToken:k.string(),refreshToken:k.string()}),O={version:"1.0.0",entities:{messages:fe,labels:be,drafts:ye,threads:Ee}};import{z as p}from"zod";var Tt=p.object({data:p.string().optional(),attributes:p.record(p.string()).optional(),messageId:p.string().optional(),publishTime:p.string().optional()}),Ge=p.object({message:Tt.optional(),subscription:p.string().optional(),event:p.unknown().optional()}),cs=p.object({emailAddress:p.string().optional(),historyId:p.string().optional()}),Mt=p.object({type:p.literal("messageReceived"),emailAddress:p.string(),historyId:p.string(),message:p.custom()}),St=p.object({type:p.literal("messageDeleted"),emailAddress:p.string(),historyId:p.string(),message:p.custom()}),Lt=p.object({type:p.literal("messageLabelChanged"),emailAddress:p.string(),historyId:p.string(),message:p.custom(),labelsAdded:p.array(p.string()).optional(),labelsRemoved:p.array(p.string()).optional()}),Ie=p.union([Mt,St,Lt]);function S(e){let t=Buffer.from(e,"base64").toString("utf-8");return JSON.parse(t)}function j(e){return t=>{let a=t.body;if(!a.message?.data)return!1;try{let o=S(a.message.data);return!!o.historyId&&!!o.emailAddress}catch{return!1}}}var kt=100,vt=10,Pt=10;function B(e,t){return e?.headers?e.headers.find(o=>o.name?.toLowerCase()===t.toLowerCase())?.value:void 0}function Ct(e){if(e.payload)return B(e.payload,"Subject")}function Dt(e){if(e.payload)return B(e.payload,"From")}function Rt(e){if(e.payload)return B(e.payload,"To")}function Me(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 r=Me(o);r&&(o.mimeType==="text/plain"?t=r:o.mimeType==="text/html"&&!t&&(a=r))}return t||a}function xt(e){if(e.payload)return Me(e.payload)}function At(e){let t=[],a=[],o=[];if(!e)return{added:t,deleted:a,modified:o};for(let r of e){if(r.messagesAdded)for(let i of r.messagesAdded)i.message?.id&&t.push(i.message.id);if(r.messagesDeleted)for(let i of r.messagesDeleted)i.message?.id&&a.push(i.message.id);if(r.labelsAdded||r.labelsRemoved){if(r.labelsAdded)for(let i of r.labelsAdded)i.message?.id&&o.push(i.message.id);if(r.labelsRemoved)for(let i of r.labelsRemoved)i.message?.id&&o.push(i.message.id)}}return{added:[...new Set(t)],deleted:[...new Set(a)],modified:[...new Set(o)]}}async function U(e,t,a){let[o,r]=await Promise.all([E(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"full"}}),E(`/users/${t}/messages/${a}`,e,{method:"GET",query:{format:"raw"}}).catch(()=>null)]);return{...o,raw:r?.raw}}async function Ot(e,t,a,o){return E(`/users/${t}/messages/${a}/attachments/${o}`,e,{method:"GET"})}async function Se(e,t,a){if(!a.payload)return a;let o=async i=>{if(!i)return i;if(i.body?.attachmentId)try{let d=await Ot(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(g=>g!==void 0)}}return i},r=await o(a.payload);return{...a,payload:r}}function jt(e){let t=Number(e);return t>1?String(t-1):e}async function Le(e,t){return!e.db?.messages||!t.id?"":(await e.db.messages.upsertByEntityId(t.id,{...t,id:t.id,subject:Ct(t),body:xt(t),from:Dt(t),to:Rt(t),createdAt:new Date}))?.id??""}async function Bt(e,t,a,o){let r=await E(`/users/${a}/messages`,t,{method:"GET",query:{maxResults:vt}}),i=[],d=[];if(!r.messages?.length)return{added:i,modified:d};let g=Number(o);for(let l of r.messages)if(l.id)try{let f=await U(t,a,l.id);(f.historyId?Number(f.historyId):0)>=g-Pt&&(e.db?.messages&&await e.db.messages.findByEntityId(l.id)?d.push(l.id):i.push(l.id))}catch{}return{added:i,modified:d}}async function we(e,t,a,o){let r=null,i="";for(let d of o)try{let g=await U(t,a,d),l=await Se(t,a,g);r||(r=l);try{let f=await Le(e,l);!i&&f&&(i=f)}catch(f){throw console.error(`Failed to save message ${l.id} to database:`,f),f}}catch(g){console.warn(`Failed to process message ${d}:`,g)}return{message:r,corsairEntityId:i}}async function Ut(e,t,a,o){let r=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let g=null;try{g=await E(`/users/${a}/messages/${d}`,t,{method:"GET",query:{format:"full"}})}catch(l){if(l?.statusCode===404)continue}if(!r&&g&&(r=g),!i){let l=await e.db.messages.findByEntityId(d);l&&(i=l.id)}await e.db.messages.deleteByEntityId(d)}catch(g){console.warn(`Failed to delete message ${d} from database:`,g)}return{message:r,corsairEntityId:i}}async function Te(e,t,a,o){let r=null,i="";if(!e.db?.messages)return{message:null,corsairEntityId:i};for(let d of o)try{let g=await U(t,a,d),l=await Se(t,a,g);r||(r=l);try{let f=await Le(e,l);!i&&f&&(i=f)}catch(f){throw console.error(`Failed to update message ${l.id} in database:`,f),f}}catch(g){console.warn(`Failed to process message ${d}:`,g)}return{message:r,corsairEntityId:i}}var ke={match:j("messageChanged"),handler:async(e,t)=>{let a=t.payload;if(!a.message?.data)return{success:!1,error:"No message data in notification"};let o=S(a.message.data);if(!o.historyId||!o.emailAddress)return{success:!1,error:"Invalid push notification format"};let r=e.key,i=o.emailAddress,d=o.historyId;try{let g=jt(d),l=await E(`/users/${i}/history`,r,{method:"GET",query:{startHistoryId:g,maxResults:kt}}),{added:f,deleted:C,modified:D}=At(l.history);if(D.length>0){let b=await Te(e,r,i,D),y={type:"messageLabelChanged",emailAddress:i,historyId:d,message:b.message??{}};return await m(e,"gmail.webhook.messageLabelChanged",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if(f.length>0){let b=await we(e,r,i,f),y={type:"messageReceived",emailAddress:i,historyId:d,message:b.message??{}};return await m(e,"gmail.webhook.messageReceived",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if(C.length>0){let b=await Ut(e,r,i,C),y={type:"messageDeleted",emailAddress:i,historyId:d,message:b.message??{}};return await m(e,"gmail.webhook.messageDeleted",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}let{added:$,modified:_}=await Bt(e,r,i,d);if(_.length>0){let b=await Te(e,r,i,_),y={type:"messageLabelChanged",emailAddress:i,historyId:d,message:b.message??{}};return await m(e,"gmail.webhook.messageLabelChanged",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}if($.length>0){let b=await we(e,r,i,$),y={type:"messageReceived",emailAddress:i,historyId:d,message:b.message??{}};return await m(e,"gmail.webhook.messageReceived",{...y},"completed"),{success:!0,corsairEntityId:b.corsairEntityId,data:y}}return{success:!0,corsairEntityId:"",data:{type:"messageReceived",emailAddress:i,historyId:d,message:{}}}}catch(g){return console.error("Failed to process Gmail webhook:",g),{success:!1,error:`Failed to process message: ${g instanceof Error?g.message:"Unknown error"}`}}}};var ve={messageChanged:ke};var $t={oauth_2:{integration:["topic_id"]}},_t={messages:{list:I.list,get:I.get,send:I.send,delete:I.delete,modify:I.modify,batchModify:I.batchModify,trash:I.trash,untrash:I.untrash},labels:{list:M.list,get:M.get,create:M.create,update:M.update,delete:M.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}},Nt={"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}},qt={messageChanged:ve.messageChanged},Wt={messageChanged:{description:"A Gmail message was received, deleted, or had its labels changed",payload:Ge,response:Ie}},Ht="oauth_2",zt={"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 vs(e={}){let t={...e,authType:e.authType??Ht};return{id:"gmail",schema:O,options:t,authConfig:$t,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:_t,webhooks:qt,endpointMeta:zt,endpointSchemas:Nt,webhookSchemas:Wt,keyBuilder:async a=>{if(t.key)return t.key;if(a.authType==="oauth_2"){let[o,r,i]=await Promise.all([a.keys.get_access_token(),a.keys.get_expires_at(),a.keys.get_refresh_token()]);if(!i)throw new Error("[corsair:gmail] No refresh token found. Run `corsair auth --plugin=gmail` to re-authenticate.");let d=await a.keys.get_integration_credentials();if(!d.client_id||!d.client_secret)throw new Error("[corsair:gmail] Missing client_id or client_secret. Run `corsair setup --gmail` to configure credentials.");let g;try{g=await x({accessToken:o,expiresAt:r,refreshToken:i,clientId:d.client_id,clientSecret:d.client_secret})}catch(l){throw new Error(`[corsair:gmail] Failed to obtain valid access token: ${l instanceof Error?l.message:String(l)}`)}if(g.refreshed)try{await a.keys.set_access_token(g.accessToken),await a.keys.set_expires_at(String(g.expiresAt))}catch(l){throw new Error(`[corsair:gmail] Token was refreshed but failed to persist new credentials: ${l instanceof Error?l.message:String(l)}`)}return a._refreshAuth=async()=>{let l=await x({accessToken:null,expiresAt:null,refreshToken:i,clientId:d.client_id,clientSecret:d.client_secret,forceRefresh:!0});return await a.keys.set_access_token(l.accessToken),await a.keys.set_expires_at(String(l.expiresAt)),l.accessToken},g.accessToken}return""},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=S(i.message.data);return!!d.emailAddress&&!!d.historyId}catch{return!1}}}}export{O as GmailSchema,j as createGmailWebhookMatcher,S as decodePubSubMessage,vs as gmail,$t as gmailAuthConfig,Nt as gmailEndpointSchemas,_t as gmailEndpointsNested,qt as gmailWebhooksNested};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as c,c as w}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var C=class extends Error{constructor(r,a){super(r);this.code=a;this.name="GoogleCalendarAPIError"}},Y="https://www.googleapis.com/calendar/v3";async function J(n,t,r){let a=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:n,client_secret:t,refresh_token:r,grant_type:"refresh_token"})});if(!a.ok){let s=await a.text();throw new C(`Failed to refresh access token: ${s}`,a.status)}return await a.json()}async function T({accessToken:n,expiresAt:t,clientId:r,clientSecret:a,refreshToken:s}){let d=Math.floor(Date.now()/1e3);if(n&&t&&Number(t)>d+300)return{accessToken:n,expiresAt:Number(t),refreshed:!1};let l=await J(r,a,s);return{accessToken:l.access_token,expiresAt:d+l.expires_in,refreshed:!0}}async function g(n,t,r={}){let{method:a="GET",body:s,query:d}=r;return await w({BASE:Y,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:t,HEADERS:{"Content-Type":"application/json"}},{method:a,url:n,body:a==="POST"||a==="PUT"||a==="PATCH"?s:void 0,mediaType:"application/json",query:d})}var x=async(n,t)=>{let r=await g("/freeBusy",n.key,{method:"POST",body:{timeMin:t.timeMin,timeMax:t.timeMax,timeZone:t.timeZone,groupExpansionMax:t.groupExpansionMax,calendarExpansionMax:t.calendarExpansionMax,items:t.items}});return await c(n,"googlecalendar.calendar.getAvailability",{...t},"completed"),r};var I=async(n,t)=>{let r=t.calendarId||"primary",a=await g(`/calendars/${r}/events`,n.key,{method:"POST",body:t.event});if(a.id&&n.db.events)try{await n.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(s){console.warn("Failed to save event to database:",s)}return await c(n,"googlecalendar.events.create",{...t},"completed"),a},P=async(n,t)=>{let r=t.calendarId||"primary",a=await g(`/calendars/${r}/events/${t.id}`,n.key,{method:"GET",query:{timeZone:t.timeZone,maxAttendees:t.maxAttendees}});if(a.id&&n.db.events)try{await n.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(s){console.warn("Failed to save event to database:",s)}return await c(n,"googlecalendar.events.get",{...t},"completed"),a},D=async(n,t)=>{let r=t.calendarId||"primary",a=await g(`/calendars/${r}/events`,n.key,{method:"GET",query:t});if(a.items&&n.db.events)try{for(let s of a.items)s.id&&await n.db.events.upsertByEntityId(s.id,{...s,id:s.id,calendarId:r,createdAt:new Date})}catch(s){console.warn("Failed to save events to database:",s)}return await c(n,"googlecalendar.events.getMany",{...t},"completed"),a},A=async(n,t)=>{let r=t.calendarId||"primary",a=await g(`/calendars/${r}/events/${t.id}`,n.key,{method:"PUT",body:t.event,query:{sendUpdates:t.sendUpdates,sendNotifications:t.sendNotifications,conferenceDataVersion:t.conferenceDataVersion,maxAttendees:t.maxAttendees,supportsAttachments:t.supportsAttachments}});if(a.id&&n.db.events)try{await n.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(s){console.warn("Failed to save event to database:",s)}return await c(n,"googlecalendar.events.update",{...t},"completed"),a},O=async(n,t)=>{let r=t.calendarId||"primary";if(await g(`/calendars/${r}/events/${t.id}`,n.key,{method:"DELETE",query:{sendUpdates:t.sendUpdates,sendNotifications:t.sendNotifications}}),n.db.events)try{await n.db.events.deleteByEntityId(t.id)}catch(a){console.warn("Failed to delete event from database:",a)}await c(n,"googlecalendar.events.delete",{...t},"completed")};import{z as e}from"zod";var y=e.object({date:e.string().optional().describe('All-day event date in "YYYY-MM-DD" format'),dateTime:e.string().optional().describe('RFC 3339 timestamp, e.g. "2024-12-25T10:00:00-07:00". Required for timed events.'),timeZone:e.string().optional().describe('IANA time zone name, e.g. "America/New_York"')}),N=e.object({id:e.string().optional(),email:e.string().optional().describe("Attendee's email address. Required when adding an attendee."),displayName:e.string().optional(),organizer:e.boolean().optional(),self:e.boolean().optional(),resource:e.boolean().optional(),optional:e.boolean().optional(),responseStatus:e.enum(["needsAction","declined","tentative","accepted"]).optional(),comment:e.string().optional(),additionalGuests:e.number().optional()}),M=e.object({id:e.string().optional(),email:e.string().optional(),displayName:e.string().optional(),self:e.boolean().optional()}),R=e.object({method:e.enum(["email","popup"]).optional(),minutes:e.number().optional()}),U=e.object({useDefault:e.boolean().optional().describe("Use the calendar default reminders"),overrides:e.array(R).optional().describe("Custom reminders. Only used when useDefault is false.")}),W=e.object({summary:e.string().optional().describe("Title of the event"),description:e.string().optional().describe("Description of the event. HTML is supported."),location:e.string().optional().describe("Geographic location of the event as free-form text"),start:y.optional().describe('Start time. Use "date" for all-day events, "dateTime" for timed events.'),end:y.optional().describe('End time. Use "date" for all-day events, "dateTime" for timed events.'),attendees:e.array(N).optional().describe("List of attendees. Each attendee must include an email."),recurrence:e.array(e.string()).optional().describe('RRULE / EXDATE lines per RFC 5545, e.g. ["RRULE:FREQ=WEEKLY;COUNT=5"]'),colorId:e.string().optional().describe("Color ID (1\u201311). Use the colors endpoint to see options."),transparency:e.enum(["opaque","transparent"]).optional().describe('"opaque" blocks time on the calendar (default); "transparent" does not'),visibility:e.enum(["default","public","private","confidential"]).optional(),eventType:e.enum(["default","outOfOffice","focusTime","workingLocation"]).optional(),status:e.enum(["confirmed","tentative","cancelled"]).optional(),reminders:U.optional(),guestsCanModify:e.boolean().optional(),guestsCanInviteOthers:e.boolean().optional(),guestsCanSeeOtherGuests:e.boolean().optional(),anyoneCanAddSelf:e.boolean().optional(),sequence:e.number().optional().describe("Sequence number for recurring event updates"),originalStartTime:y.optional().describe("Original start time for a recurring event instance"),recurringEventId:e.string().optional().describe("ID of the recurring event this instance belongs to")}),ee=e.object({calendarId:e.string().optional().describe('Calendar ID. Defaults to "primary".'),event:W.describe('Event body. Provide at minimum "summary", "start", and "end".'),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional(),conferenceDataVersion:e.number().optional(),maxAttendees:e.number().optional(),supportsAttachments:e.boolean().optional()}),te=e.object({calendarId:e.string().optional(),id:e.string(),timeZone:e.string().optional(),maxAttendees:e.number().optional()}),ne=e.object({calendarId:e.string().optional(),timeMin:e.string().optional(),timeMax:e.string().optional(),timeZone:e.string().optional(),updatedMin:e.string().optional(),singleEvents:e.boolean().optional(),maxResults:e.number().optional(),pageToken:e.string().optional(),q:e.string().optional(),orderBy:e.enum(["startTime","updated"]).optional(),iCalUID:e.string().optional(),showDeleted:e.boolean().optional(),showHiddenInvitations:e.boolean().optional()}),oe=e.object({calendarId:e.string().optional().describe('Calendar ID. Defaults to "primary".'),id:e.string().describe("Event ID to update"),event:W.describe("Updated event fields"),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional(),conferenceDataVersion:e.number().optional(),maxAttendees:e.number().optional(),supportsAttachments:e.boolean().optional()}),ae=e.object({calendarId:e.string().optional(),id:e.string(),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional()}),re=e.object({timeMin:e.string(),timeMax:e.string(),timeZone:e.string().optional(),groupExpansionMax:e.number().optional(),calendarExpansionMax:e.number().optional(),items:e.array(e.object({id:e.string()})).optional()}),m={eventsCreate:ee,eventsGet:te,eventsGetMany:ne,eventsUpdate:oe,eventsDelete:ae,calendarGetAvailability:re},h=e.object({id:e.string().optional(),status:e.enum(["confirmed","tentative","cancelled"]).optional(),htmlLink:e.string().optional(),created:e.string().optional(),updated:e.string().optional(),summary:e.string().optional(),description:e.string().optional(),location:e.string().optional(),colorId:e.string().optional(),creator:M.optional(),organizer:M.optional(),start:y.optional(),end:y.optional(),endTimeUnspecified:e.boolean().optional(),recurrence:e.array(e.string()).optional(),recurringEventId:e.string().optional(),originalStartTime:y.optional(),transparency:e.enum(["opaque","transparent"]).optional(),visibility:e.enum(["default","public","private","confidential"]).optional(),iCalUID:e.string().optional(),sequence:e.number().optional(),attendees:e.array(N).optional(),attendeesOmitted:e.boolean().optional(),hangoutLink:e.string().optional(),reminders:U.optional(),anyoneCanAddSelf:e.boolean().optional(),guestsCanInviteOthers:e.boolean().optional(),guestsCanModify:e.boolean().optional(),guestsCanSeeOtherGuests:e.boolean().optional(),privateCopy:e.boolean().optional(),locked:e.boolean().optional(),eventType:e.enum(["default","outOfOffice","focusTime","workingLocation"]).optional()}),ie=e.object({kind:e.string().optional(),etag:e.string().optional(),summary:e.string().optional(),description:e.string().optional(),updated:e.string().optional(),timeZone:e.string().optional(),accessRole:e.string().optional(),defaultReminders:e.array(R).optional(),nextPageToken:e.string().optional(),nextSyncToken:e.string().optional(),items:e.array(h).optional()}),se=e.object({busy:e.array(e.object({start:e.string().optional(),end:e.string().optional()})).optional(),errors:e.array(e.object({domain:e.string().optional(),reason:e.string().optional()})).optional()}),le=e.object({kind:e.string().optional(),calendars:e.record(e.string(),se).optional(),groups:e.record(e.string(),e.object({calendars:e.array(e.string()).optional(),errors:e.array(e.object({domain:e.string().optional(),reason:e.string().optional()})).optional()})).optional(),timeMin:e.string().optional(),timeMax:e.string().optional()}),v={eventsCreate:h,eventsGet:h,eventsGetMany:ie,eventsUpdate:h,eventsDelete:e.void(),calendarGetAvailability:le};var f={create:I,get:P,getMany:D,update:A,delete:O},_={getAvailability:x};import{z as o}from"zod";var G=o.object({date:o.string().optional(),dateTime:o.string().optional(),timeZone:o.string().optional()}),de=o.object({id:o.string().optional(),email:o.string().optional(),displayName:o.string().optional(),organizer:o.boolean().optional(),self:o.boolean().optional(),resource:o.boolean().optional(),optional:o.boolean().optional(),responseStatus:o.enum(["needsAction","declined","tentative","accepted"]).optional(),comment:o.string().optional(),additionalGuests:o.number().optional()}),q=o.object({id:o.string().optional(),email:o.string().optional(),displayName:o.string().optional(),self:o.boolean().optional()}),pe=o.object({method:o.enum(["email","popup"]).optional(),minutes:o.number().optional()}),ce=o.object({useDefault:o.boolean().optional(),overrides:o.array(pe).optional()}),j=o.object({id:o.string(),status:o.enum(["confirmed","tentative","cancelled"]).optional(),htmlLink:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),summary:o.string().optional(),description:o.string().optional(),location:o.string().optional(),colorId:o.string().optional(),creator:q.optional(),organizer:q.optional(),start:G.optional(),end:G.optional(),endTimeUnspecified:o.boolean().optional(),recurrence:o.array(o.string()).optional(),recurringEventId:o.string().optional(),originalStartTime:G.optional(),transparency:o.enum(["opaque","transparent"]).optional(),visibility:o.enum(["default","public","private","confidential"]).optional(),iCalUID:o.string().optional(),sequence:o.number().optional(),attendees:o.array(de).optional(),attendeesOmitted:o.boolean().optional(),hangoutLink:o.string().optional(),reminders:ce.optional(),anyoneCanAddSelf:o.boolean().optional(),guestsCanInviteOthers:o.boolean().optional(),guestsCanModify:o.boolean().optional(),guestsCanSeeOtherGuests:o.boolean().optional(),privateCopy:o.boolean().optional(),locked:o.boolean().optional(),eventType:o.enum(["default","outOfOffice","focusTime","workingLocation"]).optional(),calendarId:o.string().optional(),createdAt:o.coerce.date().optional()}),B=o.object({id:o.string(),summary:o.string().optional(),description:o.string().optional(),location:o.string().optional(),timeZone:o.string().optional(),createdAt:o.coerce.date().optional()});var L={version:"1.0.0",entities:{events:j,calendars:B}};import{z as i}from"zod";var ge=i.object({data:i.string().optional(),attributes:i.record(i.string()).optional(),messageId:i.string().optional(),publishTime:i.string().optional()}),z=i.object({message:ge.optional(),subscription:i.string().optional(),event:i.unknown().optional()}),$e=i.object({resourceId:i.string().optional(),resourceState:i.string().optional(),resourceUri:i.string().optional(),channelId:i.string().optional(),channelExpiration:i.string().optional(),channelToken:i.string().optional(),changed:i.string().optional()}),ue=i.object({type:i.literal("eventCreated"),calendarId:i.string(),event:i.custom(),timestamp:i.string()}),me=i.object({type:i.literal("eventUpdated"),calendarId:i.string(),event:i.custom(),timestamp:i.string()}),ve=i.object({type:i.literal("eventDeleted"),calendarId:i.string(),eventId:i.string(),timestamp:i.string()}),F=i.union([ue,me,ve]);function b(n){let t=Buffer.from(n,"base64").toString("utf-8");return JSON.parse(t)}function k(n){return t=>{let r=t.body;if(!r.message?.data)return!1;try{let a=b(r.message.data);return!!a.channelId&&!!a.resourceId&&!!a.resourceUri&&a.resourceUri.includes("/calendar/")}catch{return!1}}}var ye=/\/calendars\/([^\/\?]+)/,fe=/\/calendars\/[^\/]+\/events\/([^\/\?]+)/,be=120*1e3,Ee=5e3;function he(n){return{calendarId:n.match(ye)?.[1],eventId:n.match(fe)?.[1]}}function Ce(n){return!n.created||!n.updated?!1:Math.abs(new Date(n.updated).getTime()-new Date(n.created).getTime())<Ee}function Ge(n,t,r){return g(`/calendars/${t}/events/${r}`,n,{method:"GET"})}async function $(n,t){let r=new Date(Date.now()-be).toISOString();return(await g(`/calendars/${t}/events`,n,{method:"GET",query:{maxResults:10,orderBy:"updated",updatedMin:r,showDeleted:!0}})).items??[]}async function ke(n,t,r){return r?Ge(n,t,r):(await $(n,t)).at(-1)??null}async function Se(n,t,r,a){return r||((await $(n,t)).find(p=>p.status==="cancelled")?.id??a.resourceId??"")}async function K(n,t,r){r&&n.db.events&&await n.db.events.deleteByEntityId(r);let a={type:"eventDeleted",calendarId:t,eventId:r,timestamp:new Date().toISOString()};return await c(n,"googlecalendar.webhook.eventDeleted",{...a},"completed"),{eventData:a}}var H={match:k("eventChanged"),handler:async(n,t)=>{let r=t.payload;if(!r.message?.data)return{success:!1,error:"No message data in notification"};let a=b(r.message.data);if(!a.resourceUri)return{success:!1,error:"Invalid push notification format"};let{calendarId:s,eventId:d}=he(a.resourceUri);if(!s)return{success:!1,error:"Could not parse calendar ID from resource URI"};let p=n.key;try{if(a.resourceState==="not_exists"){let u=await Se(p,s,d,a),{eventData:Z}=await K(n,s,u);return{success:!0,data:Z}}let l=await ke(p,s,d);if(!l)return{success:!1,error:"No recently updated events found in calendar"};if(l.status==="cancelled"){let{eventData:u}=await K(n,s,l.id??"");return{success:!0,data:u}}let E="";if(l.id&&n.db.events&&(E=(await n.db.events.upsertByEntityId(l.id,{...l,id:l.id,calendarId:s,createdAt:new Date}))?.id??""),Ce(l)){let u={type:"eventCreated",calendarId:s,event:l,timestamp:new Date().toISOString()};return await c(n,"googlecalendar.webhook.eventCreated",{...u},"completed"),{success:!0,corsairEntityId:E,data:u}}let S={type:"eventUpdated",calendarId:s,event:l,timestamp:new Date().toISOString()};return await c(n,"googlecalendar.webhook.eventUpdated",{...S},"completed"),{success:!0,corsairEntityId:E,data:S}}catch(l){return console.error("Failed to process webhook:",l),{success:!1,error:`Failed to process event: ${l instanceof Error?l.message:"Unknown error"}`}}}};var V={onEventChanged:H};var we={events:{create:f.create,get:f.get,getMany:f.getMany,update:f.update,delete:f.delete},calendar:{getAvailability:_.getAvailability}},Te={"events.create":{input:m.eventsCreate,output:v.eventsCreate},"events.get":{input:m.eventsGet,output:v.eventsGet},"events.getMany":{input:m.eventsGetMany,output:v.eventsGetMany},"events.update":{input:m.eventsUpdate,output:v.eventsUpdate},"events.delete":{input:m.eventsDelete,output:v.eventsDelete},"calendar.getAvailability":{input:m.calendarGetAvailability,output:v.calendarGetAvailability}},xe={onEventChanged:V.onEventChanged},Ie={onEventChanged:{description:"A Google Calendar event was created, updated, or deleted",payload:z,response:F}},Pe="oauth_2",De={"events.create":{riskLevel:"write",description:"Create a new calendar event"},"events.get":{riskLevel:"read",description:"Get a specific calendar event"},"events.getMany":{riskLevel:"read",description:"List calendar events"},"events.update":{riskLevel:"write",description:"Update an existing calendar event"},"events.delete":{riskLevel:"destructive",description:"Delete a calendar event [DESTRUCTIVE]"},"calendar.getAvailability":{riskLevel:"read",description:"Get free/busy availability for a calendar"}};function st(n={}){let t={...n,authType:n.authType??Pe};return{id:"googlecalendar",schema:L,options:t,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/calendar"],authParams:{access_type:"offline",prompt:"consent"}},hooks:t.hooks,webhookHooks:t.webhookHooks,endpoints:we,webhooks:xe,endpointMeta:De,endpointSchemas:Te,webhookSchemas:Ie,keyBuilder:async r=>{if(t.key)return t.key;if(r.authType==="oauth_2"){let[a,s,d]=await Promise.all([r.keys.get_access_token(),r.keys.get_expires_at(),r.keys.get_refresh_token()]);if(!d)throw new Error("No refresh token. Cannot get access token.");let p=await r.keys.get_integration_credentials();if(!p.client_id||!p.client_secret)throw new Error("No client id or client secret");let l=await T({accessToken:a,expiresAt:s,refreshToken:d,clientId:p.client_id,clientSecret:p.client_secret});return l.refreshed&&await Promise.all([r.keys.set_access_token(l.accessToken),r.keys.set_expires_at(String(l.expiresAt))]),l.accessToken}return""},pluginWebhookMatcher:r=>{let a=r.headers;if(!(a.from==="noreply@google.com"||typeof a["user-agent"]=="string"&&a["user-agent"].includes("APIs-Google")))return!1;let d=r.body;if(!d?.message?.data)return!1;try{let p=b(d.message.data);return!!p.resourceUri&&p.resourceUri.includes("calendar")}catch{return!1}}}}export{k as createGoogleCalendarWebhookMatcher,b as decodePubSubMessage,st as googlecalendar,Te as googlecalendarEndpointSchemas};
|
|
1
|
+
import{a as c,c as P}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var G=class extends Error{constructor(r,a){super(r);this.code=a;this.name="GoogleCalendarAPIError"}},J="https://www.googleapis.com/calendar/v3";async function Q(t,n,r){let a=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:t,client_secret:n,refresh_token:r,grant_type:"refresh_token"})});if(!a.ok){let i=await a.text();throw new G(`Failed to refresh access token: ${i}`,a.status)}return await a.json()}async function k({accessToken:t,expiresAt:n,clientId:r,clientSecret:a,refreshToken:i,forceRefresh:p=!1}){let d=Math.floor(Date.now()/1e3);if(!p&&t&&n&&Number(n)>d+300)return{accessToken:t,expiresAt:Number(n),refreshed:!1};let u=await Q(r,a,i);return{accessToken:u.access_token,expiresAt:d+u.expires_in,refreshed:!0}}async function E(t,n,r={}){let{method:a="GET",body:i,query:p}=r;return await P({BASE:J,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:n,HEADERS:{"Content-Type":"application/json"}},{method:a,url:t,body:a==="POST"||a==="PUT"||a==="PATCH"?i:void 0,mediaType:"application/json",query:p})}function X(t){return t instanceof Error&&"status"in t&&t.status===401}async function g(t,n,r={}){try{return await E(t,n.key,r)}catch(a){if(X(a)&&n._refreshAuth){let i=await n._refreshAuth();return await E(t,i,r)}throw a}}var I=async(t,n)=>{let r=await g("/freeBusy",t,{method:"POST",body:{timeMin:n.timeMin,timeMax:n.timeMax,timeZone:n.timeZone,groupExpansionMax:n.groupExpansionMax,calendarExpansionMax:n.calendarExpansionMax,items:n.items}});return await c(t,"googlecalendar.calendar.getAvailability",{...n},"completed"),r};var x=async(t,n)=>{let r=n.calendarId||"primary",a=await g(`/calendars/${r}/events`,t,{method:"POST",body:n.event});if(a.id&&t.db.events)try{await t.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(i){console.warn("Failed to save event to database:",i)}return await c(t,"googlecalendar.events.create",{...n},"completed"),a},A=async(t,n)=>{let r=n.calendarId||"primary",a=await g(`/calendars/${r}/events/${n.id}`,t,{method:"GET",query:{timeZone:n.timeZone,maxAttendees:n.maxAttendees}});if(a.id&&t.db.events)try{await t.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(i){console.warn("Failed to save event to database:",i)}return await c(t,"googlecalendar.events.get",{...n},"completed"),a},D=async(t,n)=>{let r=n.calendarId||"primary",a=await g(`/calendars/${r}/events`,t,{method:"GET",query:n});if(a.items&&t.db.events)try{for(let i of a.items)i.id&&await t.db.events.upsertByEntityId(i.id,{...i,id:i.id,calendarId:r,createdAt:new Date})}catch(i){console.warn("Failed to save events to database:",i)}return await c(t,"googlecalendar.events.getMany",{...n},"completed"),a},O=async(t,n)=>{let r=n.calendarId||"primary",a=await g(`/calendars/${r}/events/${n.id}`,t,{method:"PUT",body:n.event,query:{sendUpdates:n.sendUpdates,sendNotifications:n.sendNotifications,conferenceDataVersion:n.conferenceDataVersion,maxAttendees:n.maxAttendees,supportsAttachments:n.supportsAttachments}});if(a.id&&t.db.events)try{await t.db.events.upsertByEntityId(a.id,{...a,id:a.id,calendarId:r,createdAt:new Date})}catch(i){console.warn("Failed to save event to database:",i)}return await c(t,"googlecalendar.events.update",{...n},"completed"),a},R=async(t,n)=>{let r=n.calendarId||"primary";if(await g(`/calendars/${r}/events/${n.id}`,t,{method:"DELETE",query:{sendUpdates:n.sendUpdates,sendNotifications:n.sendNotifications}}),t.db.events)try{await t.db.events.deleteByEntityId(n.id)}catch(a){console.warn("Failed to delete event from database:",a)}await c(t,"googlecalendar.events.delete",{...n},"completed")};import{z as e}from"zod";var y=e.object({date:e.string().optional().describe('All-day event date in "YYYY-MM-DD" format'),dateTime:e.string().optional().describe('RFC 3339 timestamp, e.g. "2024-12-25T10:00:00-07:00". Required for timed events.'),timeZone:e.string().optional().describe('IANA time zone name, e.g. "America/New_York"')}),N=e.object({id:e.string().optional(),email:e.string().optional().describe("Attendee's email address. Required when adding an attendee."),displayName:e.string().optional(),organizer:e.boolean().optional(),self:e.boolean().optional(),resource:e.boolean().optional(),optional:e.boolean().optional(),responseStatus:e.enum(["needsAction","declined","tentative","accepted"]).optional(),comment:e.string().optional(),additionalGuests:e.number().optional()}),M=e.object({id:e.string().optional(),email:e.string().optional(),displayName:e.string().optional(),self:e.boolean().optional()}),U=e.object({method:e.enum(["email","popup"]).optional(),minutes:e.number().optional()}),_=e.object({useDefault:e.boolean().optional().describe("Use the calendar default reminders"),overrides:e.array(U).optional().describe("Custom reminders. Only used when useDefault is false.")}),W=e.object({summary:e.string().optional().describe("Title of the event"),description:e.string().optional().describe("Description of the event. HTML is supported."),location:e.string().optional().describe("Geographic location of the event as free-form text"),start:y.optional().describe('Start time. Use "date" for all-day events, "dateTime" for timed events.'),end:y.optional().describe('End time. Use "date" for all-day events, "dateTime" for timed events.'),attendees:e.array(N).optional().describe("List of attendees. Each attendee must include an email."),recurrence:e.array(e.string()).optional().describe('RRULE / EXDATE lines per RFC 5545, e.g. ["RRULE:FREQ=WEEKLY;COUNT=5"]'),colorId:e.string().optional().describe("Color ID (1\u201311). Use the colors endpoint to see options."),transparency:e.enum(["opaque","transparent"]).optional().describe('"opaque" blocks time on the calendar (default); "transparent" does not'),visibility:e.enum(["default","public","private","confidential"]).optional(),eventType:e.enum(["default","outOfOffice","focusTime","workingLocation"]).optional(),status:e.enum(["confirmed","tentative","cancelled"]).optional(),reminders:_.optional(),guestsCanModify:e.boolean().optional(),guestsCanInviteOthers:e.boolean().optional(),guestsCanSeeOtherGuests:e.boolean().optional(),anyoneCanAddSelf:e.boolean().optional(),sequence:e.number().optional().describe("Sequence number for recurring event updates"),originalStartTime:y.optional().describe("Original start time for a recurring event instance"),recurringEventId:e.string().optional().describe("ID of the recurring event this instance belongs to")}),ne=e.object({calendarId:e.string().optional().describe('Calendar ID. Defaults to "primary".'),event:W.describe('Event body. Provide at minimum "summary", "start", and "end".'),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional(),conferenceDataVersion:e.number().optional(),maxAttendees:e.number().optional(),supportsAttachments:e.boolean().optional()}),oe=e.object({calendarId:e.string().optional(),id:e.string(),timeZone:e.string().optional(),maxAttendees:e.number().optional()}),ae=e.object({calendarId:e.string().optional(),timeMin:e.string().optional(),timeMax:e.string().optional(),timeZone:e.string().optional(),updatedMin:e.string().optional(),singleEvents:e.boolean().optional(),maxResults:e.number().optional(),pageToken:e.string().optional(),q:e.string().optional(),orderBy:e.enum(["startTime","updated"]).optional(),iCalUID:e.string().optional(),showDeleted:e.boolean().optional(),showHiddenInvitations:e.boolean().optional()}),re=e.object({calendarId:e.string().optional().describe('Calendar ID. Defaults to "primary".'),id:e.string().describe("Event ID to update"),event:W.describe("Updated event fields"),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional(),conferenceDataVersion:e.number().optional(),maxAttendees:e.number().optional(),supportsAttachments:e.boolean().optional()}),ie=e.object({calendarId:e.string().optional(),id:e.string(),sendUpdates:e.enum(["all","externalOnly","none"]).optional(),sendNotifications:e.boolean().optional()}),se=e.object({timeMin:e.string(),timeMax:e.string(),timeZone:e.string().optional(),groupExpansionMax:e.number().optional(),calendarExpansionMax:e.number().optional(),items:e.array(e.object({id:e.string()})).optional()}),v={eventsCreate:ne,eventsGet:oe,eventsGetMany:ae,eventsUpdate:re,eventsDelete:ie,calendarGetAvailability:se},C=e.object({id:e.string().optional(),status:e.enum(["confirmed","tentative","cancelled"]).optional(),htmlLink:e.string().optional(),created:e.string().optional(),updated:e.string().optional(),summary:e.string().optional(),description:e.string().optional(),location:e.string().optional(),colorId:e.string().optional(),creator:M.optional(),organizer:M.optional(),start:y.optional(),end:y.optional(),endTimeUnspecified:e.boolean().optional(),recurrence:e.array(e.string()).optional(),recurringEventId:e.string().optional(),originalStartTime:y.optional(),transparency:e.enum(["opaque","transparent"]).optional(),visibility:e.enum(["default","public","private","confidential"]).optional(),iCalUID:e.string().optional(),sequence:e.number().optional(),attendees:e.array(N).optional(),attendeesOmitted:e.boolean().optional(),hangoutLink:e.string().optional(),reminders:_.optional(),anyoneCanAddSelf:e.boolean().optional(),guestsCanInviteOthers:e.boolean().optional(),guestsCanModify:e.boolean().optional(),guestsCanSeeOtherGuests:e.boolean().optional(),privateCopy:e.boolean().optional(),locked:e.boolean().optional(),eventType:e.enum(["default","outOfOffice","focusTime","workingLocation"]).optional()}),le=e.object({kind:e.string().optional(),etag:e.string().optional(),summary:e.string().optional(),description:e.string().optional(),updated:e.string().optional(),timeZone:e.string().optional(),accessRole:e.string().optional(),defaultReminders:e.array(U).optional(),nextPageToken:e.string().optional(),nextSyncToken:e.string().optional(),items:e.array(C).optional()}),de=e.object({busy:e.array(e.object({start:e.string().optional(),end:e.string().optional()})).optional(),errors:e.array(e.object({domain:e.string().optional(),reason:e.string().optional()})).optional()}),pe=e.object({kind:e.string().optional(),calendars:e.record(e.string(),de).optional(),groups:e.record(e.string(),e.object({calendars:e.array(e.string()).optional(),errors:e.array(e.object({domain:e.string().optional(),reason:e.string().optional()})).optional()})).optional(),timeMin:e.string().optional(),timeMax:e.string().optional()}),f={eventsCreate:C,eventsGet:C,eventsGetMany:le,eventsUpdate:C,eventsDelete:e.void(),calendarGetAvailability:pe};var b={create:x,get:A,getMany:D,update:O,delete:R},q={getAvailability:I};import{z as o}from"zod";var S=o.object({date:o.string().optional(),dateTime:o.string().optional(),timeZone:o.string().optional()}),ce=o.object({id:o.string().optional(),email:o.string().optional(),displayName:o.string().optional(),organizer:o.boolean().optional(),self:o.boolean().optional(),resource:o.boolean().optional(),optional:o.boolean().optional(),responseStatus:o.enum(["needsAction","declined","tentative","accepted"]).optional(),comment:o.string().optional(),additionalGuests:o.number().optional()}),j=o.object({id:o.string().optional(),email:o.string().optional(),displayName:o.string().optional(),self:o.boolean().optional()}),ue=o.object({method:o.enum(["email","popup"]).optional(),minutes:o.number().optional()}),ge=o.object({useDefault:o.boolean().optional(),overrides:o.array(ue).optional()}),B=o.object({id:o.string(),status:o.enum(["confirmed","tentative","cancelled"]).optional(),htmlLink:o.string().optional(),created:o.string().optional(),updated:o.string().optional(),summary:o.string().optional(),description:o.string().optional(),location:o.string().optional(),colorId:o.string().optional(),creator:j.optional(),organizer:j.optional(),start:S.optional(),end:S.optional(),endTimeUnspecified:o.boolean().optional(),recurrence:o.array(o.string()).optional(),recurringEventId:o.string().optional(),originalStartTime:S.optional(),transparency:o.enum(["opaque","transparent"]).optional(),visibility:o.enum(["default","public","private","confidential"]).optional(),iCalUID:o.string().optional(),sequence:o.number().optional(),attendees:o.array(ce).optional(),attendeesOmitted:o.boolean().optional(),hangoutLink:o.string().optional(),reminders:ge.optional(),anyoneCanAddSelf:o.boolean().optional(),guestsCanInviteOthers:o.boolean().optional(),guestsCanModify:o.boolean().optional(),guestsCanSeeOtherGuests:o.boolean().optional(),privateCopy:o.boolean().optional(),locked:o.boolean().optional(),eventType:o.enum(["default","outOfOffice","focusTime","workingLocation"]).optional(),calendarId:o.string().optional(),createdAt:o.coerce.date().optional()}),L=o.object({id:o.string(),summary:o.string().optional(),description:o.string().optional(),location:o.string().optional(),timeZone:o.string().optional(),createdAt:o.coerce.date().optional()});var z={version:"1.0.0",entities:{events:B,calendars:L}};import{z as s}from"zod";var me=s.object({data:s.string().optional(),attributes:s.record(s.string()).optional(),messageId:s.string().optional(),publishTime:s.string().optional()}),F=s.object({message:me.optional(),subscription:s.string().optional(),event:s.unknown().optional()}),Ve=s.object({resourceId:s.string().optional(),resourceState:s.string().optional(),resourceUri:s.string().optional(),channelId:s.string().optional(),channelExpiration:s.string().optional(),channelToken:s.string().optional(),changed:s.string().optional()}),ve=s.object({type:s.literal("eventCreated"),calendarId:s.string(),event:s.custom(),timestamp:s.string()}),fe=s.object({type:s.literal("eventUpdated"),calendarId:s.string(),event:s.custom(),timestamp:s.string()}),ye=s.object({type:s.literal("eventDeleted"),calendarId:s.string(),eventId:s.string(),timestamp:s.string()}),K=s.union([ve,fe,ye]);function h(t){let n=Buffer.from(t,"base64").toString("utf-8");return JSON.parse(n)}function w(t){return n=>{let r=n.body;if(!r.message?.data)return!1;try{let a=h(r.message.data);return!!a.channelId&&!!a.resourceId&&!!a.resourceUri&&a.resourceUri.includes("/calendar/")}catch{return!1}}}var be=/\/calendars\/([^\/\?]+)/,he=/\/calendars\/[^\/]+\/events\/([^\/\?]+)/,Ee=120*1e3,Ce=5e3;function Ge(t){return{calendarId:t.match(be)?.[1],eventId:t.match(he)?.[1]}}function ke(t){return!t.created||!t.updated?!1:Math.abs(new Date(t.updated).getTime()-new Date(t.created).getTime())<Ce}function Se(t,n,r){return E(`/calendars/${n}/events/${r}`,t,{method:"GET"})}async function H(t,n){let r=new Date(Date.now()-Ee).toISOString();return(await E(`/calendars/${n}/events`,t,{method:"GET",query:{maxResults:10,orderBy:"updated",updatedMin:r,showDeleted:!0}})).items??[]}async function we(t,n,r){return r?Se(t,n,r):(await H(t,n)).at(-1)??null}async function Te(t,n,r,a){return r||((await H(t,n)).find(d=>d.status==="cancelled")?.id??a.resourceId??"")}async function $(t,n,r){r&&t.db.events&&await t.db.events.deleteByEntityId(r);let a={type:"eventDeleted",calendarId:n,eventId:r,timestamp:new Date().toISOString()};return await c(t,"googlecalendar.webhook.eventDeleted",{...a},"completed"),{eventData:a}}var V={match:w("eventChanged"),handler:async(t,n)=>{let r=n.payload;if(!r.message?.data)return{success:!1,error:"No message data in notification"};let a=h(r.message.data);if(!a.resourceUri)return{success:!1,error:"Invalid push notification format"};let{calendarId:i,eventId:p}=Ge(a.resourceUri);if(!i)return{success:!1,error:"Could not parse calendar ID from resource URI"};let d=t.key;try{if(a.resourceState==="not_exists"){let m=await Te(d,i,p,a),{eventData:Y}=await $(t,i,m);return{success:!0,data:Y}}let l=await we(d,i,p);if(!l)return{success:!1,error:"No recently updated events found in calendar"};if(l.status==="cancelled"){let{eventData:m}=await $(t,i,l.id??"");return{success:!0,data:m}}let u="";if(l.id&&t.db.events&&(u=(await t.db.events.upsertByEntityId(l.id,{...l,id:l.id,calendarId:i,createdAt:new Date}))?.id??""),ke(l)){let m={type:"eventCreated",calendarId:i,event:l,timestamp:new Date().toISOString()};return await c(t,"googlecalendar.webhook.eventCreated",{...m},"completed"),{success:!0,corsairEntityId:u,data:m}}let T={type:"eventUpdated",calendarId:i,event:l,timestamp:new Date().toISOString()};return await c(t,"googlecalendar.webhook.eventUpdated",{...T},"completed"),{success:!0,corsairEntityId:u,data:T}}catch(l){return console.error("Failed to process webhook:",l),{success:!1,error:`Failed to process event: ${l instanceof Error?l.message:"Unknown error"}`}}}};var Z={onEventChanged:V};var Pe={events:{create:b.create,get:b.get,getMany:b.getMany,update:b.update,delete:b.delete},calendar:{getAvailability:q.getAvailability}},Ie={"events.create":{input:v.eventsCreate,output:f.eventsCreate},"events.get":{input:v.eventsGet,output:f.eventsGet},"events.getMany":{input:v.eventsGetMany,output:f.eventsGetMany},"events.update":{input:v.eventsUpdate,output:f.eventsUpdate},"events.delete":{input:v.eventsDelete,output:f.eventsDelete},"calendar.getAvailability":{input:v.calendarGetAvailability,output:f.calendarGetAvailability}},xe={onEventChanged:Z.onEventChanged},Ae={onEventChanged:{description:"A Google Calendar event was created, updated, or deleted",payload:F,response:K}},De="oauth_2",Oe={"events.create":{riskLevel:"write",description:"Create a new calendar event"},"events.get":{riskLevel:"read",description:"Get a specific calendar event"},"events.getMany":{riskLevel:"read",description:"List calendar events"},"events.update":{riskLevel:"write",description:"Update an existing calendar event"},"events.delete":{riskLevel:"destructive",description:"Delete a calendar event [DESTRUCTIVE]"},"calendar.getAvailability":{riskLevel:"read",description:"Get free/busy availability for a calendar"}};function dt(t={}){let n={...t,authType:t.authType??De};return{id:"googlecalendar",schema:z,options:n,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/calendar"],authParams:{access_type:"offline",prompt:"consent"}},hooks:n.hooks,webhookHooks:n.webhookHooks,endpoints:Pe,webhooks:xe,endpointMeta:Oe,endpointSchemas:Ie,webhookSchemas:Ae,keyBuilder:async r=>{if(n.key)return n.key;if(r.authType==="oauth_2"){let[a,i,p]=await Promise.all([r.keys.get_access_token(),r.keys.get_expires_at(),r.keys.get_refresh_token()]);if(!p)throw new Error("[corsair:googlecalendar] No refresh token. Cannot get access token.");let d=await r.keys.get_integration_credentials();if(!d.client_id||!d.client_secret)throw new Error("[corsair:googlecalendar] No client id or client secret");try{let l=await k({accessToken:a,expiresAt:i,refreshToken:p,clientId:d.client_id,clientSecret:d.client_secret});return l.refreshed&&await Promise.all([r.keys.set_access_token(l.accessToken),r.keys.set_expires_at(String(l.expiresAt))]),r._refreshAuth=async()=>{let u=await k({accessToken:null,expiresAt:null,refreshToken:p,clientId:d.client_id,clientSecret:d.client_secret,forceRefresh:!0});return await r.keys.set_access_token(u.accessToken),await r.keys.set_expires_at(String(u.expiresAt)),u.accessToken},l.accessToken}catch(l){throw console.error("[corsair:googlecalendar] Failed to get valid access token:",l),l}}return""},pluginWebhookMatcher:r=>{let a=r.headers;if(!(a.from==="noreply@google.com"||typeof a["user-agent"]=="string"&&a["user-agent"].includes("APIs-Google")))return!1;let p=r.body;if(!p?.message?.data)return!1;try{let d=h(p.message.data);return!!d.resourceUri&&d.resourceUri.includes("calendar")}catch{return!1}}}}export{w as createGoogleCalendarWebhookMatcher,h as decodePubSubMessage,dt as googlecalendar,Ie as googlecalendarEndpointSchemas};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as l,c as M}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var O=class extends Error{constructor(r,s){super(r);this.code=s;this.name="GoogleDriveAPIError"}},ye="https://www.googleapis.com/drive/v3";async function be(i,o,r){let s=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i,client_secret:o,refresh_token:r,grant_type:"refresh_token"})});if(!s.ok){let n=await s.text();throw new O(`Failed to refresh access token: ${n}`,s.status)}return await s.json()}async function q({accessToken:i,expiresAt:o,clientId:r,clientSecret:s,refreshToken:n}){let m=Math.floor(Date.now()/1e3);if(i&&o&&Number(o)>m+300)return{accessToken:i,expiresAt:Number(o),refreshed:!1};let f=await be(r,s,n);return{accessToken:f.access_token,expiresAt:m+f.expires_in,refreshed:!0}}async function d(i,o,r={}){let{method:s="GET",body:n,query:m}=r;return await M({BASE:ye,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:o,HEADERS:{"Content-Type":"application/json"}},{method:s,url:i,body:s==="POST"||s==="PUT"||s==="PATCH"?n:void 0,mediaType:"application/json",query:s==="GET"?m:void 0})}var N=async(i,o)=>{let r=await d("/files",i.key,{method:"GET",query:o});if(r.files&&i.db.files)try{for(let s of r.files)if(s.id){let n=s.mimeType==="application/vnd.google-apps.folder";n&&i.db.folders?await i.db.folders.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date}):n||await i.db.files.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}}catch(s){console.warn("Failed to save files to database:",s)}return await l(i,"googledrive.files.list",{...o},"completed"),r},U=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i.key,{method:"GET",query:o});if(r.id){let s=r.mimeType==="application/vnd.google-apps.folder";try{s&&i.db.folders?await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date}):!s&&i.db.files&&await i.db.files.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(n){console.warn("Failed to save file to database:",n)}}return await l(i,"googledrive.files.get",{...o},"completed"),r},W=async(i,o)=>{let r=await d("/files",i.key,{method:"POST",body:{...o},query:{uploadType:"multipart"}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.createFromText",{...o},"completed"),r},j=async(i,o)=>{let r=await d("/files",i.key,{method:"POST",body:{...o},query:{uploadType:"multipart"}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.upload",{...o},"completed"),r},_=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i.key,{method:"PATCH",body:{name:o.name,description:o.description,starred:o.starred,trashed:o.trashed,parents:o.parents,properties:o.properties,appProperties:o.appProperties},query:{addParents:o.addParents,removeParents:o.removeParents,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.update",{...o},"completed"),r},z=async(i,o)=>{if(await d(`/files/${o.fileId}`,i.key,{method:"DELETE",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}}),i.db.files)try{await i.db.files.deleteByEntityId(o.fileId)}catch(r){console.warn("Failed to delete file from database:",r)}await l(i,"googledrive.files.delete",{...o},"completed")},V=async(i,o)=>{let r=await d(`/files/${o.fileId}/copy`,i.key,{method:"POST",body:{name:o.name,parents:o.parents},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.copy",{...o},"completed"),r},$=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i.key,{method:"PATCH",body:{},query:o});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.move",{...o},"completed"),r},K=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i.key,{method:"GET",query:{alt:"media",acknowledgeAbuse:o.acknowledgeAbuse}});return await l(i,"googledrive.files.download",{...o},"completed"),r},H=async(i,o)=>{let r=await d(`/files/${o.fileId}/permissions`,i.key,{method:"POST",body:{type:o.type,role:o.role,emailAddress:o.emailAddress,domain:o.domain,allowFileDiscovery:o.allowFileDiscovery,expirationTime:o.expirationTime,sendNotificationEmail:o.sendNotificationEmail,emailMessage:o.emailMessage},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,moveToNewOwnersRoot:o.moveToNewOwnersRoot,transferOwnership:o.transferOwnership}});return await l(i,"googledrive.files.share",{...o},"completed"),r};var J=async(i,o)=>{let r=await d("/files",i.key,{method:"POST",body:{name:o.name,mimeType:"application/vnd.google-apps.folder",parents:o.parents,description:o.description}});if(r.id&&i.db.folders)try{await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save folder to database:",s)}return await l(i,"googledrive.folders.create",{...o},"completed"),r},Y=async(i,o)=>{let r=await d(`/files/${o.folderId}`,i.key,{method:"GET",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,includePermissionsForView:o.includePermissionsForView}});if(r.id&&i.db.folders)try{await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save folder to database:",s)}return await l(i,"googledrive.folders.get",{...o},"completed"),r},Q=async(i,o)=>{let r=`mimeType='application/vnd.google-apps.folder'${o.q?` and ${o.q}`:""}`,s=await d("/files",i.key,{method:"GET",query:{q:r,pageSize:o.pageSize,pageToken:o.pageToken,spaces:o.spaces,corpora:o.corpora,driveId:o.driveId,includeItemsFromAllDrives:o.includeItemsFromAllDrives,includePermissionsForView:o.includePermissionsForView,orderBy:o.orderBy,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,teamDriveId:o.teamDriveId}});if(s.files&&i.db.folders)try{for(let n of s.files)n.id&&await i.db.folders.upsertByEntityId(n.id,{...n,id:n.id,createdAt:new Date})}catch(n){console.warn("Failed to save folders to database:",n)}return await l(i,"googledrive.folders.list",{...o},"completed"),s},X=async(i,o)=>{if(await d(`/files/${o.folderId}`,i.key,{method:"DELETE",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}}),i.db.folders)try{await i.db.folders.deleteByEntityId(o.folderId)}catch(r){console.warn("Failed to delete folder from database:",r)}await l(i,"googledrive.folders.delete",{...o},"completed")},Z=async(i,o)=>{let r=await d(`/files/${o.folderId}/permissions`,i.key,{method:"POST",body:{type:o.type,role:o.role,emailAddress:o.emailAddress,domain:o.domain,allowFileDiscovery:o.allowFileDiscovery,expirationTime:o.expirationTime,sendNotificationEmail:o.sendNotificationEmail,emailMessage:o.emailMessage},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,moveToNewOwnersRoot:o.moveToNewOwnersRoot,transferOwnership:o.transferOwnership}});return await l(i,"googledrive.folders.share",{...o},"completed"),r};var ee=async(i,o)=>{let r=await d("/files",i.key,{method:"GET",query:{q:o.q,pageSize:o.pageSize,pageToken:o.pageToken,spaces:o.spaces,corpora:o.corpora,driveId:o.driveId,includeItemsFromAllDrives:o.includeItemsFromAllDrives,includePermissionsForView:o.includePermissionsForView,orderBy:o.orderBy,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,teamDriveId:o.teamDriveId}});if(r.files)try{for(let s of r.files)if(s.id){let n=s.mimeType==="application/vnd.google-apps.folder";n&&i.db.folders?await i.db.folders.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date}):!n&&i.db.files&&await i.db.files.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}}catch(s){console.warn("Failed to save search results to database:",s)}return await l(i,"googledrive.search.filesAndFolders",{...o},"completed"),r};var oe=async(i,o)=>{let r=o.requestId||`req_${Date.now()}`,s=await d("/drives",i.key,{method:"POST",body:{name:o.name,themeId:o.themeId,colorRgb:o.colorRgb,restrictions:o.restrictions},query:{requestId:r}});if(s.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}catch(n){console.warn("Failed to save shared drive to database:",n)}return await l(i,"googledrive.sharedDrives.create",{...o},"completed"),s},ie=async(i,o)=>{let r=await d(`/drives/${o.driveId}`,i.key,{method:"GET",query:{useDomainAdminAccess:o.useDomainAdminAccess}});if(r.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drive to database:",s)}return await l(i,"googledrive.sharedDrives.get",{...o},"completed"),r},te=async(i,o)=>{let r=await d("/drives",i.key,{method:"GET",query:{pageSize:o.pageSize,pageToken:o.pageToken,q:o.q,useDomainAdminAccess:o.useDomainAdminAccess}});if(r.drives&&i.db.sharedDrives)try{for(let s of r.drives)s.id&&await i.db.sharedDrives.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drives to database:",s)}return await l(i,"googledrive.sharedDrives.list",{...o},"completed"),r},re=async(i,o)=>{let r=await d(`/drives/${o.driveId}`,i.key,{method:"PATCH",body:{name:o.name,themeId:o.themeId,colorRgb:o.colorRgb,restrictions:o.restrictions},query:{useDomainAdminAccess:o.useDomainAdminAccess}});if(r.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drive to database:",s)}return await l(i,"googledrive.sharedDrives.update",{...o},"completed"),r},se=async(i,o)=>{if(await d(`/drives/${o.driveId}`,i.key,{method:"DELETE"}),i.db.sharedDrives)try{await i.db.sharedDrives.deleteByEntityId(o.driveId)}catch(r){console.warn("Failed to delete shared drive from database:",r)}await l(i,"googledrive.sharedDrives.delete",{...o},"completed")};import{z as e}from"zod";var ke=e.object({q:e.string().optional(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),Fe=e.object({fileId:e.string(),acknowledgeAbuse:e.boolean().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),includePermissionsForView:e.string().optional()}),Se=e.object({name:e.string(),content:e.string(),mimeType:e.string().optional(),parents:e.array(e.string()).optional(),description:e.string().optional()}),Ce=e.object({name:e.string(),mimeType:e.string().optional(),parents:e.array(e.string()).optional(),description:e.string().optional()}),Ie=e.object({fileId:e.string(),name:e.string().optional(),description:e.string().optional(),starred:e.boolean().optional(),trashed:e.boolean().optional(),parents:e.array(e.string()).optional(),addParents:e.string().optional(),removeParents:e.string().optional(),properties:e.record(e.string()).optional(),appProperties:e.record(e.string()).optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Pe=e.object({fileId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Ae=e.object({fileId:e.string(),name:e.string().optional(),parents:e.array(e.string()).optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Oe=e.object({fileId:e.string(),addParents:e.string().optional(),removeParents:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Le=e.object({fileId:e.string(),acknowledgeAbuse:e.boolean().optional()}),Re=e.object({fileId:e.string(),type:e.enum(["user","group","domain","anyone"]).optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),allowFileDiscovery:e.boolean().optional(),expirationTime:e.string().optional(),sendNotificationEmail:e.boolean().optional(),emailMessage:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),moveToNewOwnersRoot:e.boolean().optional(),transferOwnership:e.boolean().optional()}),Be=e.object({name:e.string(),parents:e.array(e.string()).optional(),description:e.string().optional()}),xe=e.object({folderId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),includePermissionsForView:e.string().optional()}),Me=e.object({q:e.string().optional(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),qe=e.object({folderId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Ne=e.object({folderId:e.string(),type:e.enum(["user","group","domain","anyone"]).optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),allowFileDiscovery:e.boolean().optional(),expirationTime:e.string().optional(),sendNotificationEmail:e.boolean().optional(),emailMessage:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),moveToNewOwnersRoot:e.boolean().optional(),transferOwnership:e.boolean().optional()}),Ue=e.object({name:e.string(),requestId:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),restrictions:e.object({adminManagedRestrictions:e.boolean().optional(),copyRequiresWriterPermission:e.boolean().optional(),domainUsersOnly:e.boolean().optional(),driveMembersOnly:e.boolean().optional()}).optional()}),We=e.object({driveId:e.string(),useDomainAdminAccess:e.boolean().optional()}),je=e.object({pageSize:e.number().optional(),pageToken:e.string().optional(),q:e.string().optional(),useDomainAdminAccess:e.boolean().optional()}),_e=e.object({driveId:e.string(),name:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),restrictions:e.object({adminManagedRestrictions:e.boolean().optional(),copyRequiresWriterPermission:e.boolean().optional(),domainUsersOnly:e.boolean().optional(),driveMembersOnly:e.boolean().optional()}).optional(),useDomainAdminAccess:e.boolean().optional()}),ze=e.object({driveId:e.string()}),Ve=e.object({q:e.string(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),c={filesList:ke,filesGet:Fe,filesCreateFromText:Se,filesUpload:Ce,filesUpdate:Ie,filesDelete:Pe,filesCopy:Ae,filesMove:Oe,filesDownload:Le,filesShare:Re,foldersCreate:Be,foldersGet:xe,foldersList:Me,foldersDelete:qe,foldersShare:Ne,sharedDrivesCreate:Ue,sharedDrivesGet:We,sharedDrivesList:je,sharedDrivesUpdate:_e,sharedDrivesDelete:ze,searchFilesAndFolders:Ve},D=e.object({id:e.string().optional(),name:e.string().optional(),mimeType:e.string().optional(),description:e.string().optional(),starred:e.boolean().optional(),trashed:e.boolean().optional(),explicitlyTrashed:e.boolean().optional(),parents:e.array(e.string()).optional(),properties:e.record(e.string()).optional(),appProperties:e.record(e.string()).optional(),spaces:e.array(e.string()).optional(),version:e.string().optional(),webViewLink:e.string().optional(),webContentLink:e.string().optional(),iconLink:e.string().optional(),hasThumbnail:e.boolean().optional(),thumbnailLink:e.string().optional(),thumbnailVersion:e.string().optional(),viewedByMe:e.boolean().optional(),viewedByMeTime:e.string().optional(),createdTime:e.string().optional(),modifiedTime:e.string().optional(),modifiedByMeTime:e.string().optional(),modifiedByMe:e.boolean().optional(),shared:e.boolean().optional(),ownedByMe:e.boolean().optional(),permissionIds:e.array(e.string()).optional(),hasAugmentedPermissions:e.boolean().optional(),folderColorRgb:e.string().optional(),originalFilename:e.string().optional(),fullFileExtension:e.string().optional(),fileExtension:e.string().optional(),md5Checksum:e.string().optional(),size:e.string().optional(),quotaBytesUsed:e.string().optional(),headRevisionId:e.string().optional(),isAppAuthorized:e.boolean().optional(),resourceKey:e.string().optional(),sha1Checksum:e.string().optional(),sha256Checksum:e.string().optional()}),L=e.object({kind:e.string().optional(),nextPageToken:e.string().optional(),incompleteSearch:e.boolean().optional(),files:e.array(D).optional()}),ne=e.object({id:e.string().optional(),type:e.enum(["user","group","domain","anyone"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),allowFileDiscovery:e.boolean().optional(),displayName:e.string().optional(),photoLink:e.string().optional(),expirationTime:e.string().optional(),deleted:e.boolean().optional(),view:e.enum(["user","domain"]).optional(),pendingOwner:e.boolean().optional()}),A=e.object({kind:e.string().optional(),id:e.string().optional(),name:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),createdTime:e.string().optional(),hidden:e.boolean().optional()}),$e=e.object({kind:e.string().optional(),nextPageToken:e.string().optional(),drives:e.array(A).optional()}),g={filesList:L,filesGet:D,filesCreateFromText:D,filesUpload:D,filesUpdate:D,filesDelete:e.void(),filesCopy:D,filesMove:D,filesDownload:e.any(),filesShare:ne,foldersCreate:D,foldersGet:D,foldersList:L,foldersDelete:e.void(),foldersShare:ne,sharedDrivesCreate:A,sharedDrivesGet:A,sharedDrivesList:$e,sharedDrivesUpdate:A,sharedDrivesDelete:e.void(),searchFilesAndFolders:L};var h={list:N,get:U,createFromText:W,upload:j,update:_,delete:z,copy:V,move:$,download:K,share:H},G={create:J,get:Y,list:Q,delete:X,share:Z},T={create:oe,get:ie,list:te,update:re,delete:se},ae={filesAndFolders:ee};import{z as t}from"zod";var le=t.object({canAddChildren:t.boolean().optional(),canChangeCopyRequiresWriterPermission:t.boolean().optional(),canChangeViewersCanCopyContent:t.boolean().optional(),canComment:t.boolean().optional(),canCopy:t.boolean().optional(),canDelete:t.boolean().optional(),canDeleteChildren:t.boolean().optional(),canDownload:t.boolean().optional(),canEdit:t.boolean().optional(),canListChildren:t.boolean().optional(),canModifyContent:t.boolean().optional(),canModifyContentRestriction:t.boolean().optional(),canMoveChildrenOutOfDrive:t.boolean().optional(),canMoveChildrenOutOfTeamDrive:t.boolean().optional(),canMoveChildrenWithinDrive:t.boolean().optional(),canMoveItemIntoTeamDrive:t.boolean().optional(),canMoveItemOutOfDrive:t.boolean().optional(),canMoveItemWithinDrive:t.boolean().optional(),canReadRevisions:t.boolean().optional(),canReadTeamDrive:t.boolean().optional(),canRemoveChildren:t.boolean().optional(),canRename:t.boolean().optional(),canShare:t.boolean().optional(),canTrash:t.boolean().optional(),canTrashChildren:t.boolean().optional(),canUntrash:t.boolean().optional()}),de=t.object({id:t.string(),name:t.string().optional(),mimeType:t.string().optional(),description:t.string().optional(),starred:t.boolean().optional(),trashed:t.boolean().optional(),explicitlyTrashed:t.boolean().optional(),parents:t.array(t.string()).optional(),properties:t.record(t.string()).optional(),appProperties:t.record(t.string()).optional(),spaces:t.array(t.string()).optional(),version:t.string().optional(),webViewLink:t.string().optional(),webContentLink:t.string().optional(),iconLink:t.string().optional(),hasThumbnail:t.boolean().optional(),thumbnailLink:t.string().optional(),thumbnailVersion:t.string().optional(),viewedByMe:t.boolean().optional(),viewedByMeTime:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),modifiedByMeTime:t.string().optional(),modifiedByMe:t.boolean().optional(),shared:t.boolean().optional(),ownedByMe:t.boolean().optional(),capabilities:le.optional(),viewersCanCopyContent:t.boolean().optional(),copyRequiresWriterPermission:t.boolean().optional(),writersCanShare:t.boolean().optional(),permissionIds:t.array(t.string()).optional(),hasAugmentedPermissions:t.boolean().optional(),folderColorRgb:t.string().optional(),originalFilename:t.string().optional(),fullFileExtension:t.string().optional(),fileExtension:t.string().optional(),md5Checksum:t.string().optional(),size:t.string().optional(),quotaBytesUsed:t.string().optional(),headRevisionId:t.string().optional(),isAppAuthorized:t.boolean().optional(),resourceKey:t.string().optional(),sha1Checksum:t.string().optional(),sha256Checksum:t.string().optional(),filePath:t.string().optional(),createdAt:t.coerce.date().optional()}),pe=t.object({id:t.string(),name:t.string().optional(),mimeType:t.string().optional(),description:t.string().optional(),starred:t.boolean().optional(),trashed:t.boolean().optional(),explicitlyTrashed:t.boolean().optional(),parents:t.array(t.string()).optional(),properties:t.record(t.string()).optional(),appProperties:t.record(t.string()).optional(),spaces:t.array(t.string()).optional(),version:t.string().optional(),webViewLink:t.string().optional(),webContentLink:t.string().optional(),iconLink:t.string().optional(),hasThumbnail:t.boolean().optional(),thumbnailLink:t.string().optional(),thumbnailVersion:t.string().optional(),viewedByMe:t.boolean().optional(),viewedByMeTime:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),modifiedByMeTime:t.string().optional(),modifiedByMe:t.boolean().optional(),shared:t.boolean().optional(),ownedByMe:t.boolean().optional(),capabilities:le.optional(),viewersCanCopyContent:t.boolean().optional(),copyRequiresWriterPermission:t.boolean().optional(),writersCanShare:t.boolean().optional(),permissionIds:t.array(t.string()).optional(),hasAugmentedPermissions:t.boolean().optional(),folderColorRgb:t.string().optional(),filePath:t.string().optional(),createdAt:t.coerce.date().optional()}),ce=t.object({id:t.string(),name:t.string().optional(),themeId:t.string().optional(),colorRgb:t.string().optional(),createdTime:t.string().optional(),hidden:t.boolean().optional(),createdAt:t.coerce.date().optional()});var ge={version:"1.0.0",entities:{files:de,folders:pe,sharedDrives:ce}};import{z as a}from"zod";var Ke=a.object({data:a.string().optional(),attributes:a.record(a.string()).optional(),messageId:a.string().optional(),publishTime:a.string().optional()}),fe=a.object({message:Ke.optional(),subscription:a.string().optional(),event:a.unknown().optional()}),Po=a.object({kind:a.string().optional(),id:a.string().optional(),resourceId:a.string().optional(),resourceUri:a.string().optional(),resourceState:a.string().optional(),changed:a.string().optional(),expiration:a.string().optional()}),R=a.enum(["created","updated","deleted","trashed","untrashed"]),me=a.object({type:a.enum(["fileChanged","folderChanged"]),fileId:a.string().optional(),folderId:a.string().optional(),changeType:R,file:a.custom().optional(),folder:a.custom().optional(),filePath:a.string().optional(),change:a.custom().optional(),binaryData:a.string().nullable().optional(),allFiles:a.array(a.object({file:a.custom(),filePath:a.string(),change:a.custom(),changeType:R,binaryData:a.string().nullable().optional()})),allFolders:a.array(a.object({folder:a.custom(),filePath:a.string(),change:a.custom(),changeType:R}))});function k(i){let o=Buffer.from(i,"base64").toString("utf-8");return JSON.parse(o)}function B(i){return o=>{let r=o.body;if(!r.message?.data)return!1;try{let s=k(r.message.data);return!!s.resourceId&&!!s.resourceUri&&s.resourceUri.includes("/drive/")}catch{return!1}}}var He=/[?&]pageToken=([^&]+)/,Je="application/vnd.google-apps.folder",Ye=6e4,Qe=["id","name","mimeType","parents","trashed","createdTime","modifiedTime","size","webViewLink","webContentLink","starred","shared","ownedByMe","description","fileExtension","originalFilename"].join(",");function Xe(i){return i.match(He)?.[1]}async function ve(i,o){try{return await d(`/files/${o}`,i,{method:"GET",query:{supportsAllDrives:!0,fields:Qe}})}catch(r){return console.warn(`Failed to fetch file ${o}:`,r),null}}async function Ze(i,o){try{let r=`https://www.googleapis.com/drive/v3/files/${o}?alt=media&supportsAllDrives=true`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!s.ok)return null;let n=await s.arrayBuffer();return Buffer.from(n).toString("base64")}catch(r){return console.warn(`Failed to fetch binary data for file ${o}:`,r),null}}async function eo(i,o){return await d("/changes",i,{method:"GET",query:{pageToken:o,pageSize:100,includeRemoved:!0,supportsAllDrives:!0}})}async function oo(i,o,r=20){let s=[o.name??""],n=o.parents,m=0;for(;n?.length&&m<r;){let v=n[0];if(!v)break;let f=await ve(i,v);if(!f?.name||!f.parents?.length)break;s.unshift(f.name),n=f.parents,m++}return"/"+s.join("/")}function io(i,o,r){return i.removed?"deleted":o.trashed?"trashed":"updated"}function to(i,o=Ye){if(i.length===0)return i;let r=Date.now();return i.filter(s=>{if(!s.time)return!0;let n=new Date(s.time).getTime();return r-n<=o})}var ue={match:B("driveChanged"),handler:async(i,o)=>{let r=o.payload;if(!r.message?.data)return{success:!1,error:"No message data in notification"};let s=k(r.message.data);if(!s.resourceId||!s.resourceUri)return{success:!1,error:"Invalid push notification format"};let n=i.key,m=Xe(s.resourceUri);if(!m)return{success:!1,error:"Could not parse pageToken from resource URI"};try{let f=(await eo(n,m)).changes??[];f=to(f);let y="";if(f.length===0)return{success:!0,corsairEntityId:"",data:{type:"fileChanged",fileId:s.resourceId??"",changeType:"updated",allFiles:[],allFolders:[]}};let F=[],S=[];for(let u of f){if(!u.fileId)continue;let p=await ve(n,u.fileId);if(!p)continue;let De=p.mimeType===Je,C=u.removed?"":await oo(n,p),I=io(u,p,F.length===0&&S.length===0);if(De){if(i.db?.folders&&p.id)try{if(I==="deleted")await i.db.folders.deleteByEntityId(p.id);else{let E=await i.db.folders.upsertByEntityId(p.id,{...p,id:p.id,filePath:C});!y&&E?.id&&(y=E.id)}}catch(E){console.warn(`Failed to save folder ${p.id} to database:`,E)}S.push({folder:p,filePath:C,change:u,changeType:I})}else{let E=await Ze(n,u.fileId);if(i.db?.files&&p.id)try{if(I==="deleted")await i.db.files.deleteByEntityId(p.id);else{let P=await i.db.files.upsertByEntityId(p.id,{...p,id:p.id,filePath:C});!y&&P?.id&&(y=P.id)}}catch(P){console.warn(`Failed to save file ${p.id} to database:`,P)}F.push({file:p,filePath:C,change:u,changeType:I,binaryData:E})}}let w=S[0],b=F[0];if(w&&!b){let u={type:"folderChanged",folderId:w.folder.id??s.resourceId??"",changeType:w.changeType,folder:w.folder,filePath:w.filePath,change:w.change,allFolders:S,allFiles:F.map(p=>({file:p.file,filePath:p.filePath,change:p.change,changeType:p.changeType,binaryData:p.binaryData}))};return await l(i,"googledrive.webhook.folderChanged",{...u},"completed"),{success:!0,corsairEntityId:y,data:u}}let x={type:"fileChanged",fileId:b?.file.id??s.resourceId??"",changeType:b?.changeType??"updated",file:b?.file,filePath:b?.filePath??"",change:b?.change??f[0],binaryData:b?.binaryData??null,allFiles:F.map(u=>({file:u.file,filePath:u.filePath,change:u.change,changeType:u.changeType,binaryData:u.binaryData})),allFolders:S};return await l(i,"googledrive.webhook.fileChanged",{...x},"completed"),{success:!0,corsairEntityId:y,data:x}}catch(v){return console.error("Failed to process Google Drive webhook:",v),{success:!1,error:`Failed to process change: ${v instanceof Error?v.message:"Unknown error"}`}}}};var he={driveChanged:ue};var ro={files:{list:h.list,get:h.get,createFromText:h.createFromText,upload:h.upload,update:h.update,delete:h.delete,copy:h.copy,move:h.move,download:h.download,share:h.share},folders:{create:G.create,get:G.get,list:G.list,delete:G.delete,share:G.share},sharedDrives:{create:T.create,get:T.get,list:T.list,update:T.update,delete:T.delete},search:{filesAndFolders:ae.filesAndFolders}},so={"files.list":{input:c.filesList,output:g.filesList},"files.get":{input:c.filesGet,output:g.filesGet},"files.createFromText":{input:c.filesCreateFromText,output:g.filesCreateFromText},"files.upload":{input:c.filesUpload,output:g.filesUpload},"files.update":{input:c.filesUpdate,output:g.filesUpdate},"files.delete":{input:c.filesDelete,output:g.filesDelete},"files.copy":{input:c.filesCopy,output:g.filesCopy},"files.move":{input:c.filesMove,output:g.filesMove},"files.download":{input:c.filesDownload,output:g.filesDownload},"files.share":{input:c.filesShare,output:g.filesShare},"folders.create":{input:c.foldersCreate,output:g.foldersCreate},"folders.get":{input:c.foldersGet,output:g.foldersGet},"folders.list":{input:c.foldersList,output:g.foldersList},"folders.delete":{input:c.foldersDelete,output:g.foldersDelete},"folders.share":{input:c.foldersShare,output:g.foldersShare},"sharedDrives.create":{input:c.sharedDrivesCreate,output:g.sharedDrivesCreate},"sharedDrives.get":{input:c.sharedDrivesGet,output:g.sharedDrivesGet},"sharedDrives.list":{input:c.sharedDrivesList,output:g.sharedDrivesList},"sharedDrives.update":{input:c.sharedDrivesUpdate,output:g.sharedDrivesUpdate},"sharedDrives.delete":{input:c.sharedDrivesDelete,output:g.sharedDrivesDelete},"search.filesAndFolders":{input:c.searchFilesAndFolders,output:g.searchFilesAndFolders}},no={driveChanged:he.driveChanged},ao={driveChanged:{description:"A file or folder in Google Drive was created, updated, or deleted",payload:fe,response:me}},lo="oauth_2",po={"files.list":{riskLevel:"read",description:"List files in Google Drive"},"files.get":{riskLevel:"read",description:"Get metadata for a specific file"},"files.createFromText":{riskLevel:"write",description:"Create a new Drive file from text content"},"files.upload":{riskLevel:"write",description:"Upload a file to Google Drive"},"files.update":{riskLevel:"write",description:"Update the content or metadata of a file"},"files.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a file [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"files.copy":{riskLevel:"write",description:"Copy a file in Google Drive"},"files.move":{riskLevel:"write",description:"Move a file to a different folder"},"files.download":{riskLevel:"read",description:"Download the content of a file"},"files.share":{riskLevel:"write",description:"Share a file by granting permissions to users"},"folders.create":{riskLevel:"write",description:"Create a new folder"},"folders.get":{riskLevel:"read",description:"Get metadata for a specific folder"},"folders.list":{riskLevel:"read",description:"List folders in Google Drive"},"folders.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a folder and its contents [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"folders.share":{riskLevel:"write",description:"Share a folder by granting permissions to users"},"sharedDrives.create":{riskLevel:"write",description:"Create a new shared drive"},"sharedDrives.get":{riskLevel:"read",description:"Get info about a shared drive"},"sharedDrives.list":{riskLevel:"read",description:"List shared drives"},"sharedDrives.update":{riskLevel:"write",description:"Update a shared drive"},"sharedDrives.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a shared drive [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"search.filesAndFolders":{riskLevel:"read",description:"Search for files and folders in Google Drive"}};function Vo(i={}){let o={...i,authType:i.authType??lo};return{id:"googledrive",schema:ge,options:o,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/drive"],authParams:{access_type:"offline",prompt:"consent"}},hooks:o.hooks,webhookHooks:o.webhookHooks,endpoints:ro,webhooks:no,endpointMeta:po,endpointSchemas:so,webhookSchemas:ao,keyBuilder:async r=>{if(o.key)return o.key;if(r.authType==="oauth_2"){let[s,n,m]=await Promise.all([r.keys.get_access_token(),r.keys.get_expires_at(),r.keys.get_refresh_token()]);if(!m)throw new Error("No refresh token. Cannot get access token.");let v=await r.keys.get_integration_credentials();if(!v.client_id||!v.client_secret)throw new Error("No client id or client secret");let f=await q({accessToken:s,expiresAt:n,refreshToken:m,clientId:v.client_id,clientSecret:v.client_secret});return f.refreshed&&await Promise.all([r.keys.set_access_token(f.accessToken),r.keys.set_expires_at(String(f.expiresAt))]),f.accessToken}return""},pluginWebhookMatcher:r=>{let s=r.headers;if(!(s.from==="noreply@google.com"||typeof s["user-agent"]=="string"&&s["user-agent"].includes("APIs-Google")))return!1;let m=r.body;if(!m?.message?.data)return!1;try{let v=k(m.message.data);return!!v.resourceUri&&v.resourceUri.includes("drive")}catch{return!1}}}}export{B as createGoogleDriveWebhookMatcher,k as decodePubSubMessage,Vo as googledrive,so as googledriveEndpointSchemas};
|
|
1
|
+
import{a as l,c as N}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var L=class extends Error{constructor(r,s){super(r);this.code=s;this.name="GoogleDriveAPIError"}},be="https://www.googleapis.com/drive/v3";async function we(i,o,r){let s=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i,client_secret:o,refresh_token:r,grant_type:"refresh_token"})});if(!s.ok){let n=await s.text();throw new L(`Failed to refresh access token: ${n}`,s.status)}return await s.json()}async function R({accessToken:i,expiresAt:o,clientId:r,clientSecret:s,refreshToken:n,forceRefresh:m=!1}){let f=Math.floor(Date.now()/1e3);if(!m&&i&&o&&Number(o)>f+300)return{accessToken:i,expiresAt:Number(o),refreshed:!1};let h=await we(r,s,n);return{accessToken:h.access_token,expiresAt:f+h.expires_in,refreshed:!0}}async function C(i,o,r={}){let{method:s="GET",body:n,query:m}=r;return await N({BASE:be,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:o,HEADERS:{"Content-Type":"application/json"}},{method:s,url:i,body:s==="POST"||s==="PUT"||s==="PATCH"?n:void 0,mediaType:"application/json",query:s==="GET"?m:void 0})}function Ee(i){return i instanceof Error&&"status"in i&&i.status===401}async function d(i,o,r={}){try{return await C(i,o.key,r)}catch(s){if(Ee(s)&&o._refreshAuth){let n=await o._refreshAuth();return await C(i,n,r)}throw s}}var U=async(i,o)=>{let r=await d("/files",i,{method:"GET",query:o});if(r.files&&i.db.files)try{for(let s of r.files)if(s.id){let n=s.mimeType==="application/vnd.google-apps.folder";n&&i.db.folders?await i.db.folders.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date}):n||await i.db.files.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}}catch(s){console.warn("Failed to save files to database:",s)}return await l(i,"googledrive.files.list",{...o},"completed"),r},W=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i,{method:"GET",query:o});if(r.id){let s=r.mimeType==="application/vnd.google-apps.folder";try{s&&i.db.folders?await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date}):!s&&i.db.files&&await i.db.files.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(n){console.warn("Failed to save file to database:",n)}}return await l(i,"googledrive.files.get",{...o},"completed"),r},_=async(i,o)=>{let r=await d("/files",i,{method:"POST",body:{...o},query:{uploadType:"multipart"}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.createFromText",{...o},"completed"),r},j=async(i,o)=>{let r=await d("/files",i,{method:"POST",body:{...o},query:{uploadType:"multipart"}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.upload",{...o},"completed"),r},z=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i,{method:"PATCH",body:{name:o.name,description:o.description,starred:o.starred,trashed:o.trashed,parents:o.parents,properties:o.properties,appProperties:o.appProperties},query:{addParents:o.addParents,removeParents:o.removeParents,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.update",{...o},"completed"),r},V=async(i,o)=>{if(await d(`/files/${o.fileId}`,i,{method:"DELETE",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}}),i.db.files)try{await i.db.files.deleteByEntityId(o.fileId)}catch(r){console.warn("Failed to delete file from database:",r)}await l(i,"googledrive.files.delete",{...o},"completed")},$=async(i,o)=>{let r=await d(`/files/${o.fileId}/copy`,i,{method:"POST",body:{name:o.name,parents:o.parents},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.copy",{...o},"completed"),r},K=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i,{method:"PATCH",body:{},query:o});return r.id&&await i.endpoints.files.get({fileId:r.id}),await l(i,"googledrive.files.move",{...o},"completed"),r},H=async(i,o)=>{let r=await d(`/files/${o.fileId}`,i,{method:"GET",query:{alt:"media",acknowledgeAbuse:o.acknowledgeAbuse}});return await l(i,"googledrive.files.download",{...o},"completed"),r},J=async(i,o)=>{let r=await d(`/files/${o.fileId}/permissions`,i,{method:"POST",body:{type:o.type,role:o.role,emailAddress:o.emailAddress,domain:o.domain,allowFileDiscovery:o.allowFileDiscovery,expirationTime:o.expirationTime,sendNotificationEmail:o.sendNotificationEmail,emailMessage:o.emailMessage},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,moveToNewOwnersRoot:o.moveToNewOwnersRoot,transferOwnership:o.transferOwnership}});return await l(i,"googledrive.files.share",{...o},"completed"),r};var Y=async(i,o)=>{let r=await d("/files",i,{method:"POST",body:{name:o.name,mimeType:"application/vnd.google-apps.folder",parents:o.parents,description:o.description}});if(r.id&&i.db.folders)try{await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save folder to database:",s)}return await l(i,"googledrive.folders.create",{...o},"completed"),r},Q=async(i,o)=>{let r=await d(`/files/${o.folderId}`,i,{method:"GET",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,includePermissionsForView:o.includePermissionsForView}});if(r.id&&i.db.folders)try{await i.db.folders.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save folder to database:",s)}return await l(i,"googledrive.folders.get",{...o},"completed"),r},X=async(i,o)=>{let r=`mimeType='application/vnd.google-apps.folder'${o.q?` and ${o.q}`:""}`,s=await d("/files",i,{method:"GET",query:{q:r,pageSize:o.pageSize,pageToken:o.pageToken,spaces:o.spaces,corpora:o.corpora,driveId:o.driveId,includeItemsFromAllDrives:o.includeItemsFromAllDrives,includePermissionsForView:o.includePermissionsForView,orderBy:o.orderBy,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,teamDriveId:o.teamDriveId}});if(s.files&&i.db.folders)try{for(let n of s.files)n.id&&await i.db.folders.upsertByEntityId(n.id,{...n,id:n.id,createdAt:new Date})}catch(n){console.warn("Failed to save folders to database:",n)}return await l(i,"googledrive.folders.list",{...o},"completed"),s},Z=async(i,o)=>{if(await d(`/files/${o.folderId}`,i,{method:"DELETE",query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives}}),i.db.folders)try{await i.db.folders.deleteByEntityId(o.folderId)}catch(r){console.warn("Failed to delete folder from database:",r)}await l(i,"googledrive.folders.delete",{...o},"completed")},ee=async(i,o)=>{let r=await d(`/files/${o.folderId}/permissions`,i,{method:"POST",body:{type:o.type,role:o.role,emailAddress:o.emailAddress,domain:o.domain,allowFileDiscovery:o.allowFileDiscovery,expirationTime:o.expirationTime,sendNotificationEmail:o.sendNotificationEmail,emailMessage:o.emailMessage},query:{supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,moveToNewOwnersRoot:o.moveToNewOwnersRoot,transferOwnership:o.transferOwnership}});return await l(i,"googledrive.folders.share",{...o},"completed"),r};var oe=async(i,o)=>{let r=await d("/files",i,{method:"GET",query:{q:o.q,pageSize:o.pageSize,pageToken:o.pageToken,spaces:o.spaces,corpora:o.corpora,driveId:o.driveId,includeItemsFromAllDrives:o.includeItemsFromAllDrives,includePermissionsForView:o.includePermissionsForView,orderBy:o.orderBy,supportsAllDrives:o.supportsAllDrives,supportsTeamDrives:o.supportsTeamDrives,teamDriveId:o.teamDriveId}});if(r.files)try{for(let s of r.files)if(s.id){let n=s.mimeType==="application/vnd.google-apps.folder";n&&i.db.folders?await i.db.folders.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date}):!n&&i.db.files&&await i.db.files.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}}catch(s){console.warn("Failed to save search results to database:",s)}return await l(i,"googledrive.search.filesAndFolders",{...o},"completed"),r};var ie=async(i,o)=>{let r=o.requestId||`req_${Date.now()}`,s=await d("/drives",i,{method:"POST",body:{name:o.name,themeId:o.themeId,colorRgb:o.colorRgb,restrictions:o.restrictions},query:{requestId:r}});if(s.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}catch(n){console.warn("Failed to save shared drive to database:",n)}return await l(i,"googledrive.sharedDrives.create",{...o},"completed"),s},te=async(i,o)=>{let r=await d(`/drives/${o.driveId}`,i,{method:"GET",query:{useDomainAdminAccess:o.useDomainAdminAccess}});if(r.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drive to database:",s)}return await l(i,"googledrive.sharedDrives.get",{...o},"completed"),r},re=async(i,o)=>{let r=await d("/drives",i,{method:"GET",query:{pageSize:o.pageSize,pageToken:o.pageToken,q:o.q,useDomainAdminAccess:o.useDomainAdminAccess}});if(r.drives&&i.db.sharedDrives)try{for(let s of r.drives)s.id&&await i.db.sharedDrives.upsertByEntityId(s.id,{...s,id:s.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drives to database:",s)}return await l(i,"googledrive.sharedDrives.list",{...o},"completed"),r},se=async(i,o)=>{let r=await d(`/drives/${o.driveId}`,i,{method:"PATCH",body:{name:o.name,themeId:o.themeId,colorRgb:o.colorRgb,restrictions:o.restrictions},query:{useDomainAdminAccess:o.useDomainAdminAccess}});if(r.id&&i.db.sharedDrives)try{await i.db.sharedDrives.upsertByEntityId(r.id,{...r,id:r.id,createdAt:new Date})}catch(s){console.warn("Failed to save shared drive to database:",s)}return await l(i,"googledrive.sharedDrives.update",{...o},"completed"),r},ne=async(i,o)=>{if(await d(`/drives/${o.driveId}`,i,{method:"DELETE"}),i.db.sharedDrives)try{await i.db.sharedDrives.deleteByEntityId(o.driveId)}catch(r){console.warn("Failed to delete shared drive from database:",r)}await l(i,"googledrive.sharedDrives.delete",{...o},"completed")};import{z as e}from"zod";var Se=e.object({q:e.string().optional(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),Ce=e.object({fileId:e.string(),acknowledgeAbuse:e.boolean().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),includePermissionsForView:e.string().optional()}),Ie=e.object({name:e.string(),content:e.string(),mimeType:e.string().optional(),parents:e.array(e.string()).optional(),description:e.string().optional()}),Pe=e.object({name:e.string(),mimeType:e.string().optional(),parents:e.array(e.string()).optional(),description:e.string().optional()}),Ae=e.object({fileId:e.string(),name:e.string().optional(),description:e.string().optional(),starred:e.boolean().optional(),trashed:e.boolean().optional(),parents:e.array(e.string()).optional(),addParents:e.string().optional(),removeParents:e.string().optional(),properties:e.record(e.string()).optional(),appProperties:e.record(e.string()).optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Oe=e.object({fileId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Le=e.object({fileId:e.string(),name:e.string().optional(),parents:e.array(e.string()).optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Re=e.object({fileId:e.string(),addParents:e.string().optional(),removeParents:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),Be=e.object({fileId:e.string(),acknowledgeAbuse:e.boolean().optional()}),xe=e.object({fileId:e.string(),type:e.enum(["user","group","domain","anyone"]).optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),allowFileDiscovery:e.boolean().optional(),expirationTime:e.string().optional(),sendNotificationEmail:e.boolean().optional(),emailMessage:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),moveToNewOwnersRoot:e.boolean().optional(),transferOwnership:e.boolean().optional()}),qe=e.object({name:e.string(),parents:e.array(e.string()).optional(),description:e.string().optional()}),Me=e.object({folderId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),includePermissionsForView:e.string().optional()}),Ne=e.object({q:e.string().optional(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),Ue=e.object({folderId:e.string(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional()}),We=e.object({folderId:e.string(),type:e.enum(["user","group","domain","anyone"]).optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),allowFileDiscovery:e.boolean().optional(),expirationTime:e.string().optional(),sendNotificationEmail:e.boolean().optional(),emailMessage:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),moveToNewOwnersRoot:e.boolean().optional(),transferOwnership:e.boolean().optional()}),_e=e.object({name:e.string(),requestId:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),restrictions:e.object({adminManagedRestrictions:e.boolean().optional(),copyRequiresWriterPermission:e.boolean().optional(),domainUsersOnly:e.boolean().optional(),driveMembersOnly:e.boolean().optional()}).optional()}),je=e.object({driveId:e.string(),useDomainAdminAccess:e.boolean().optional()}),ze=e.object({pageSize:e.number().optional(),pageToken:e.string().optional(),q:e.string().optional(),useDomainAdminAccess:e.boolean().optional()}),Ve=e.object({driveId:e.string(),name:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),restrictions:e.object({adminManagedRestrictions:e.boolean().optional(),copyRequiresWriterPermission:e.boolean().optional(),domainUsersOnly:e.boolean().optional(),driveMembersOnly:e.boolean().optional()}).optional(),useDomainAdminAccess:e.boolean().optional()}),$e=e.object({driveId:e.string()}),Ke=e.object({q:e.string(),pageSize:e.number().optional(),pageToken:e.string().optional(),spaces:e.string().optional(),corpora:e.string().optional(),driveId:e.string().optional(),includeItemsFromAllDrives:e.boolean().optional(),includePermissionsForView:e.string().optional(),orderBy:e.string().optional(),supportsAllDrives:e.boolean().optional(),supportsTeamDrives:e.boolean().optional(),teamDriveId:e.string().optional()}),c={filesList:Se,filesGet:Ce,filesCreateFromText:Ie,filesUpload:Pe,filesUpdate:Ae,filesDelete:Oe,filesCopy:Le,filesMove:Re,filesDownload:Be,filesShare:xe,foldersCreate:qe,foldersGet:Me,foldersList:Ne,foldersDelete:Ue,foldersShare:We,sharedDrivesCreate:_e,sharedDrivesGet:je,sharedDrivesList:ze,sharedDrivesUpdate:Ve,sharedDrivesDelete:$e,searchFilesAndFolders:Ke},y=e.object({id:e.string().optional(),name:e.string().optional(),mimeType:e.string().optional(),description:e.string().optional(),starred:e.boolean().optional(),trashed:e.boolean().optional(),explicitlyTrashed:e.boolean().optional(),parents:e.array(e.string()).optional(),properties:e.record(e.string()).optional(),appProperties:e.record(e.string()).optional(),spaces:e.array(e.string()).optional(),version:e.string().optional(),webViewLink:e.string().optional(),webContentLink:e.string().optional(),iconLink:e.string().optional(),hasThumbnail:e.boolean().optional(),thumbnailLink:e.string().optional(),thumbnailVersion:e.string().optional(),viewedByMe:e.boolean().optional(),viewedByMeTime:e.string().optional(),createdTime:e.string().optional(),modifiedTime:e.string().optional(),modifiedByMeTime:e.string().optional(),modifiedByMe:e.boolean().optional(),shared:e.boolean().optional(),ownedByMe:e.boolean().optional(),permissionIds:e.array(e.string()).optional(),hasAugmentedPermissions:e.boolean().optional(),folderColorRgb:e.string().optional(),originalFilename:e.string().optional(),fullFileExtension:e.string().optional(),fileExtension:e.string().optional(),md5Checksum:e.string().optional(),size:e.string().optional(),quotaBytesUsed:e.string().optional(),headRevisionId:e.string().optional(),isAppAuthorized:e.boolean().optional(),resourceKey:e.string().optional(),sha1Checksum:e.string().optional(),sha256Checksum:e.string().optional()}),B=e.object({kind:e.string().optional(),nextPageToken:e.string().optional(),incompleteSearch:e.boolean().optional(),files:e.array(y).optional()}),ae=e.object({id:e.string().optional(),type:e.enum(["user","group","domain","anyone"]).optional(),emailAddress:e.string().optional(),domain:e.string().optional(),role:e.enum(["owner","organizer","fileOrganizer","writer","commenter","reader"]).optional(),allowFileDiscovery:e.boolean().optional(),displayName:e.string().optional(),photoLink:e.string().optional(),expirationTime:e.string().optional(),deleted:e.boolean().optional(),view:e.enum(["user","domain"]).optional(),pendingOwner:e.boolean().optional()}),O=e.object({kind:e.string().optional(),id:e.string().optional(),name:e.string().optional(),themeId:e.string().optional(),colorRgb:e.string().optional(),createdTime:e.string().optional(),hidden:e.boolean().optional()}),He=e.object({kind:e.string().optional(),nextPageToken:e.string().optional(),drives:e.array(O).optional()}),g={filesList:B,filesGet:y,filesCreateFromText:y,filesUpload:y,filesUpdate:y,filesDelete:e.void(),filesCopy:y,filesMove:y,filesDownload:e.any(),filesShare:ae,foldersCreate:y,foldersGet:y,foldersList:B,foldersDelete:e.void(),foldersShare:ae,sharedDrivesCreate:O,sharedDrivesGet:O,sharedDrivesList:He,sharedDrivesUpdate:O,sharedDrivesDelete:e.void(),searchFilesAndFolders:B};var D={list:U,get:W,createFromText:_,upload:j,update:z,delete:V,copy:$,move:K,download:H,share:J},T={create:Y,get:Q,list:X,delete:Z,share:ee},G={create:ie,get:te,list:re,update:se,delete:ne},le={filesAndFolders:oe};import{z as t}from"zod";var de=t.object({canAddChildren:t.boolean().optional(),canChangeCopyRequiresWriterPermission:t.boolean().optional(),canChangeViewersCanCopyContent:t.boolean().optional(),canComment:t.boolean().optional(),canCopy:t.boolean().optional(),canDelete:t.boolean().optional(),canDeleteChildren:t.boolean().optional(),canDownload:t.boolean().optional(),canEdit:t.boolean().optional(),canListChildren:t.boolean().optional(),canModifyContent:t.boolean().optional(),canModifyContentRestriction:t.boolean().optional(),canMoveChildrenOutOfDrive:t.boolean().optional(),canMoveChildrenOutOfTeamDrive:t.boolean().optional(),canMoveChildrenWithinDrive:t.boolean().optional(),canMoveItemIntoTeamDrive:t.boolean().optional(),canMoveItemOutOfDrive:t.boolean().optional(),canMoveItemWithinDrive:t.boolean().optional(),canReadRevisions:t.boolean().optional(),canReadTeamDrive:t.boolean().optional(),canRemoveChildren:t.boolean().optional(),canRename:t.boolean().optional(),canShare:t.boolean().optional(),canTrash:t.boolean().optional(),canTrashChildren:t.boolean().optional(),canUntrash:t.boolean().optional()}),pe=t.object({id:t.string(),name:t.string().optional(),mimeType:t.string().optional(),description:t.string().optional(),starred:t.boolean().optional(),trashed:t.boolean().optional(),explicitlyTrashed:t.boolean().optional(),parents:t.array(t.string()).optional(),properties:t.record(t.string()).optional(),appProperties:t.record(t.string()).optional(),spaces:t.array(t.string()).optional(),version:t.string().optional(),webViewLink:t.string().optional(),webContentLink:t.string().optional(),iconLink:t.string().optional(),hasThumbnail:t.boolean().optional(),thumbnailLink:t.string().optional(),thumbnailVersion:t.string().optional(),viewedByMe:t.boolean().optional(),viewedByMeTime:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),modifiedByMeTime:t.string().optional(),modifiedByMe:t.boolean().optional(),shared:t.boolean().optional(),ownedByMe:t.boolean().optional(),capabilities:de.optional(),viewersCanCopyContent:t.boolean().optional(),copyRequiresWriterPermission:t.boolean().optional(),writersCanShare:t.boolean().optional(),permissionIds:t.array(t.string()).optional(),hasAugmentedPermissions:t.boolean().optional(),folderColorRgb:t.string().optional(),originalFilename:t.string().optional(),fullFileExtension:t.string().optional(),fileExtension:t.string().optional(),md5Checksum:t.string().optional(),size:t.string().optional(),quotaBytesUsed:t.string().optional(),headRevisionId:t.string().optional(),isAppAuthorized:t.boolean().optional(),resourceKey:t.string().optional(),sha1Checksum:t.string().optional(),sha256Checksum:t.string().optional(),filePath:t.string().optional(),createdAt:t.coerce.date().optional()}),ce=t.object({id:t.string(),name:t.string().optional(),mimeType:t.string().optional(),description:t.string().optional(),starred:t.boolean().optional(),trashed:t.boolean().optional(),explicitlyTrashed:t.boolean().optional(),parents:t.array(t.string()).optional(),properties:t.record(t.string()).optional(),appProperties:t.record(t.string()).optional(),spaces:t.array(t.string()).optional(),version:t.string().optional(),webViewLink:t.string().optional(),webContentLink:t.string().optional(),iconLink:t.string().optional(),hasThumbnail:t.boolean().optional(),thumbnailLink:t.string().optional(),thumbnailVersion:t.string().optional(),viewedByMe:t.boolean().optional(),viewedByMeTime:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),modifiedByMeTime:t.string().optional(),modifiedByMe:t.boolean().optional(),shared:t.boolean().optional(),ownedByMe:t.boolean().optional(),capabilities:de.optional(),viewersCanCopyContent:t.boolean().optional(),copyRequiresWriterPermission:t.boolean().optional(),writersCanShare:t.boolean().optional(),permissionIds:t.array(t.string()).optional(),hasAugmentedPermissions:t.boolean().optional(),folderColorRgb:t.string().optional(),filePath:t.string().optional(),createdAt:t.coerce.date().optional()}),ge=t.object({id:t.string(),name:t.string().optional(),themeId:t.string().optional(),colorRgb:t.string().optional(),createdTime:t.string().optional(),hidden:t.boolean().optional(),createdAt:t.coerce.date().optional()});var fe={version:"1.0.0",entities:{files:pe,folders:ce,sharedDrives:ge}};import{z as a}from"zod";var Je=a.object({data:a.string().optional(),attributes:a.record(a.string()).optional(),messageId:a.string().optional(),publishTime:a.string().optional()}),ue=a.object({message:Je.optional(),subscription:a.string().optional(),event:a.unknown().optional()}),Oo=a.object({kind:a.string().optional(),id:a.string().optional(),resourceId:a.string().optional(),resourceUri:a.string().optional(),resourceState:a.string().optional(),changed:a.string().optional(),expiration:a.string().optional()}),x=a.enum(["created","updated","deleted","trashed","untrashed"]),me=a.object({type:a.enum(["fileChanged","folderChanged"]),fileId:a.string().optional(),folderId:a.string().optional(),changeType:x,file:a.custom().optional(),folder:a.custom().optional(),filePath:a.string().optional(),change:a.custom().optional(),binaryData:a.string().nullable().optional(),allFiles:a.array(a.object({file:a.custom(),filePath:a.string(),change:a.custom(),changeType:x,binaryData:a.string().nullable().optional()})),allFolders:a.array(a.object({folder:a.custom(),filePath:a.string(),change:a.custom(),changeType:x}))});function F(i){let o=Buffer.from(i,"base64").toString("utf-8");return JSON.parse(o)}function q(i){return o=>{let r=o.body;if(!r.message?.data)return!1;try{let s=F(r.message.data);return!!s.resourceId&&!!s.resourceUri&&s.resourceUri.includes("/drive/")}catch{return!1}}}var Ye=/[?&]pageToken=([^&]+)/,Qe="application/vnd.google-apps.folder",Xe=6e4,Ze=["id","name","mimeType","parents","trashed","createdTime","modifiedTime","size","webViewLink","webContentLink","starred","shared","ownedByMe","description","fileExtension","originalFilename"].join(",");function eo(i){return i.match(Ye)?.[1]}async function ve(i,o){try{return await C(`/files/${o}`,i,{method:"GET",query:{supportsAllDrives:!0,fields:Ze}})}catch(r){return console.warn(`Failed to fetch file ${o}:`,r),null}}async function oo(i,o){try{let r=`https://www.googleapis.com/drive/v3/files/${o}?alt=media&supportsAllDrives=true`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!s.ok)return null;let n=await s.arrayBuffer();return Buffer.from(n).toString("base64")}catch(r){return console.warn(`Failed to fetch binary data for file ${o}:`,r),null}}async function io(i,o){return await C("/changes",i,{method:"GET",query:{pageToken:o,pageSize:100,includeRemoved:!0,supportsAllDrives:!0}})}async function to(i,o,r=20){let s=[o.name??""],n=o.parents,m=0;for(;n?.length&&m<r;){let f=n[0];if(!f)break;let u=await ve(i,f);if(!u?.name||!u.parents?.length)break;s.unshift(u.name),n=u.parents,m++}return"/"+s.join("/")}function ro(i,o,r){return i.removed?"deleted":o.trashed?"trashed":"updated"}function so(i,o=Xe){if(i.length===0)return i;let r=Date.now();return i.filter(s=>{if(!s.time)return!0;let n=new Date(s.time).getTime();return r-n<=o})}var he={match:q("driveChanged"),handler:async(i,o)=>{let r=o.payload;if(!r.message?.data)return{success:!1,error:"No message data in notification"};let s=F(r.message.data);if(!s.resourceId||!s.resourceUri)return{success:!1,error:"Invalid push notification format"};let n=i.key,m=eo(s.resourceUri);if(!m)return{success:!1,error:"Could not parse pageToken from resource URI"};try{let u=(await io(n,m)).changes??[];u=so(u);let h="";if(u.length===0)return{success:!0,corsairEntityId:"",data:{type:"fileChanged",fileId:s.resourceId??"",changeType:"updated",allFiles:[],allFolders:[]}};let k=[],S=[];for(let v of u){if(!v.fileId)continue;let p=await ve(n,v.fileId);if(!p)continue;let ye=p.mimeType===Qe,I=v.removed?"":await to(n,p),P=ro(v,p,k.length===0&&S.length===0);if(ye){if(i.db?.folders&&p.id)try{if(P==="deleted")await i.db.folders.deleteByEntityId(p.id);else{let E=await i.db.folders.upsertByEntityId(p.id,{...p,id:p.id,filePath:I});!h&&E?.id&&(h=E.id)}}catch(E){console.warn(`Failed to save folder ${p.id} to database:`,E)}S.push({folder:p,filePath:I,change:v,changeType:P})}else{let E=await oo(n,v.fileId);if(i.db?.files&&p.id)try{if(P==="deleted")await i.db.files.deleteByEntityId(p.id);else{let A=await i.db.files.upsertByEntityId(p.id,{...p,id:p.id,filePath:I});!h&&A?.id&&(h=A.id)}}catch(A){console.warn(`Failed to save file ${p.id} to database:`,A)}k.push({file:p,filePath:I,change:v,changeType:P,binaryData:E})}}let w=S[0],b=k[0];if(w&&!b){let v={type:"folderChanged",folderId:w.folder.id??s.resourceId??"",changeType:w.changeType,folder:w.folder,filePath:w.filePath,change:w.change,allFolders:S,allFiles:k.map(p=>({file:p.file,filePath:p.filePath,change:p.change,changeType:p.changeType,binaryData:p.binaryData}))};return await l(i,"googledrive.webhook.folderChanged",{...v},"completed"),{success:!0,corsairEntityId:h,data:v}}let M={type:"fileChanged",fileId:b?.file.id??s.resourceId??"",changeType:b?.changeType??"updated",file:b?.file,filePath:b?.filePath??"",change:b?.change??u[0],binaryData:b?.binaryData??null,allFiles:k.map(v=>({file:v.file,filePath:v.filePath,change:v.change,changeType:v.changeType,binaryData:v.binaryData})),allFolders:S};return await l(i,"googledrive.webhook.fileChanged",{...M},"completed"),{success:!0,corsairEntityId:h,data:M}}catch(f){return console.error("Failed to process Google Drive webhook:",f),{success:!1,error:`Failed to process change: ${f instanceof Error?f.message:"Unknown error"}`}}}};var De={driveChanged:he};var no={files:{list:D.list,get:D.get,createFromText:D.createFromText,upload:D.upload,update:D.update,delete:D.delete,copy:D.copy,move:D.move,download:D.download,share:D.share},folders:{create:T.create,get:T.get,list:T.list,delete:T.delete,share:T.share},sharedDrives:{create:G.create,get:G.get,list:G.list,update:G.update,delete:G.delete},search:{filesAndFolders:le.filesAndFolders}},ao={"files.list":{input:c.filesList,output:g.filesList},"files.get":{input:c.filesGet,output:g.filesGet},"files.createFromText":{input:c.filesCreateFromText,output:g.filesCreateFromText},"files.upload":{input:c.filesUpload,output:g.filesUpload},"files.update":{input:c.filesUpdate,output:g.filesUpdate},"files.delete":{input:c.filesDelete,output:g.filesDelete},"files.copy":{input:c.filesCopy,output:g.filesCopy},"files.move":{input:c.filesMove,output:g.filesMove},"files.download":{input:c.filesDownload,output:g.filesDownload},"files.share":{input:c.filesShare,output:g.filesShare},"folders.create":{input:c.foldersCreate,output:g.foldersCreate},"folders.get":{input:c.foldersGet,output:g.foldersGet},"folders.list":{input:c.foldersList,output:g.foldersList},"folders.delete":{input:c.foldersDelete,output:g.foldersDelete},"folders.share":{input:c.foldersShare,output:g.foldersShare},"sharedDrives.create":{input:c.sharedDrivesCreate,output:g.sharedDrivesCreate},"sharedDrives.get":{input:c.sharedDrivesGet,output:g.sharedDrivesGet},"sharedDrives.list":{input:c.sharedDrivesList,output:g.sharedDrivesList},"sharedDrives.update":{input:c.sharedDrivesUpdate,output:g.sharedDrivesUpdate},"sharedDrives.delete":{input:c.sharedDrivesDelete,output:g.sharedDrivesDelete},"search.filesAndFolders":{input:c.searchFilesAndFolders,output:g.searchFilesAndFolders}},lo={driveChanged:De.driveChanged},po={driveChanged:{description:"A file or folder in Google Drive was created, updated, or deleted",payload:ue,response:me}},co="oauth_2",go={"files.list":{riskLevel:"read",description:"List files in Google Drive"},"files.get":{riskLevel:"read",description:"Get metadata for a specific file"},"files.createFromText":{riskLevel:"write",description:"Create a new Drive file from text content"},"files.upload":{riskLevel:"write",description:"Upload a file to Google Drive"},"files.update":{riskLevel:"write",description:"Update the content or metadata of a file"},"files.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a file [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"files.copy":{riskLevel:"write",description:"Copy a file in Google Drive"},"files.move":{riskLevel:"write",description:"Move a file to a different folder"},"files.download":{riskLevel:"read",description:"Download the content of a file"},"files.share":{riskLevel:"write",description:"Share a file by granting permissions to users"},"folders.create":{riskLevel:"write",description:"Create a new folder"},"folders.get":{riskLevel:"read",description:"Get metadata for a specific folder"},"folders.list":{riskLevel:"read",description:"List folders in Google Drive"},"folders.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a folder and its contents [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"folders.share":{riskLevel:"write",description:"Share a folder by granting permissions to users"},"sharedDrives.create":{riskLevel:"write",description:"Create a new shared drive"},"sharedDrives.get":{riskLevel:"read",description:"Get info about a shared drive"},"sharedDrives.list":{riskLevel:"read",description:"List shared drives"},"sharedDrives.update":{riskLevel:"write",description:"Update a shared drive"},"sharedDrives.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a shared drive [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"search.filesAndFolders":{riskLevel:"read",description:"Search for files and folders in Google Drive"}};function Ko(i={}){let o={...i,authType:i.authType??co};return{id:"googledrive",schema:fe,options:o,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/drive"],authParams:{access_type:"offline",prompt:"consent"}},hooks:o.hooks,webhookHooks:o.webhookHooks,endpoints:no,webhooks:lo,endpointMeta:go,endpointSchemas:ao,webhookSchemas:po,keyBuilder:async r=>{if(o.key)return o.key;if(r.authType==="oauth_2"){let[s,n,m]=await Promise.all([r.keys.get_access_token(),r.keys.get_expires_at(),r.keys.get_refresh_token()]);if(!m)throw new Error("[corsair:googledrive] No refresh token. Cannot get access token.");let f=await r.keys.get_integration_credentials();if(!f.client_id||!f.client_secret)throw new Error("[corsair:googledrive] No client id or client secret");try{let u=await R({accessToken:s,expiresAt:n,refreshToken:m,clientId:f.client_id,clientSecret:f.client_secret});return u.refreshed&&await Promise.all([r.keys.set_access_token(u.accessToken),r.keys.set_expires_at(String(u.expiresAt))]),r._refreshAuth=async()=>{let h=await R({accessToken:null,expiresAt:null,refreshToken:m,clientId:f.client_id,clientSecret:f.client_secret,forceRefresh:!0});return await r.keys.set_access_token(h.accessToken),await r.keys.set_expires_at(String(h.expiresAt)),h.accessToken},u.accessToken}catch(u){throw new Error(`[corsair:googledrive] Failed to get valid access token: ${u instanceof Error?u.message:String(u)}`)}}return""},pluginWebhookMatcher:r=>{let s=r.headers;if(!(s.from==="noreply@google.com"||typeof s["user-agent"]=="string"&&s["user-agent"].includes("APIs-Google")))return!1;let m=r.body;if(!m?.message?.data)return!1;try{let f=F(m.message.data);return!!f.resourceUri&&f.resourceUri.includes("drive")}catch{return!1}}}}export{q as createGoogleDriveWebhookMatcher,F as decodePubSubMessage,Ko as googledrive,ao as googledriveEndpointSchemas};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as c,c as v}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var I=class extends Error{constructor(o,n){super(o);this.code=n;this.name="GoogleSheetsAPIError"}},Z="https://sheets.googleapis.com/v4";async function J(s,e,o){let n=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:s,client_secret:e,refresh_token:o,grant_type:"refresh_token"})});if(!n.ok){let a=await n.text();throw new I(`Failed to refresh access token: ${a}`,n.status)}return await n.json()}async function U({accessToken:s,expiresAt:e,clientId:o,clientSecret:n,refreshToken:a}){let r=Math.floor(Date.now()/1e3);if(s&&e&&Number(e)>r+300)return{accessToken:s,expiresAt:Number(e),refreshed:!1};let p=await J(o,n,a);return{accessToken:p.access_token,expiresAt:r+p.expires_in,refreshed:!0}}async function u(s,e,o={}){let{method:n="GET",body:a,query:r}=o;return await v({BASE:Z,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json"}},{method:n,url:s,body:n==="POST"||n==="PUT"||n==="PATCH"?a:void 0,mediaType:"application/json",query:r})}var T=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,n=e.values?[e.values]:[],a=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}:append`,s.key,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:n,majorDimension:"ROWS"}});if(a.responses&&a.responses.length>0&&s.db.rows)try{let r=a.responses[0];if(r){let d=r.updatedRange||o,p=e.sheetName||"Sheet1",g=`${e.spreadsheetId}_${p}_${d}`;await s.db.rows.upsertByEntityId(g,{rowId:g,spreadsheetId:e.spreadsheetId,sheetName:p,range:d,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await c(s,"googlesheets.sheets.appendRow",{...e},"completed"),a},C=async(s,e)=>{let o=e.sheetName||"Sheet1",n=e.keyColumn||"A",a=e.keyValue;if(!a)throw new Error("keyValue is required for appendOrUpdateRow");let r=`${o}!${n}:${n}`,d=await u(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s.key,{method:"GET"}),p=-1;if(d.values){for(let i=0;i<d.values.length;i++)if(d.values[i]?.[0]===String(a)){p=i;break}}let g=e.values?[e.values]:[],w=p>=0?`${o}!${p+1}:${p+1}`:`${o}!A:Z`;if(p>=0){let i=await u(`/spreadsheets/${e.spreadsheetId}/values/${w}`,s.key,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:g,majorDimension:"ROWS"}});if(i.responses&&i.responses.length>0&&s.db.rows)try{let R=i.responses[0];if(R){let E=R.updatedRange||w,b=`${e.spreadsheetId}_${o}_${E}`;await s.db.rows.upsertByEntityId(b,{rowId:b,spreadsheetId:e.spreadsheetId,sheetName:o,range:E,values:e.values,createdAt:new Date})}}catch(R){console.warn("Failed to update row in database:",R)}return await c(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),i}else{let i=await u(`/spreadsheets/${e.spreadsheetId}/values/${w}:append`,s.key,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:g,majorDimension:"ROWS"}});if(i.responses&&i.responses.length>0&&s.db.rows)try{let R=i.responses[0];if(R){let E=R.updatedRange||w,b=`${e.spreadsheetId}_${o}_${E}`;await s.db.rows.upsertByEntityId(b,{rowId:b,spreadsheetId:e.spreadsheetId,sheetName:o,range:E,values:e.values,createdAt:new Date})}}catch(R){console.warn("Failed to save row to database:",R)}return await c(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),i}},A=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,n=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s.key,{method:"GET",query:{valueRenderOption:e.valueRenderOption||"FORMATTED_VALUE",dateTimeRenderOption:e.dateTimeRenderOption||"FORMATTED_STRING"}});if(n.values&&s.db.rows)try{let a=e.sheetName||"Sheet1";for(let r=0;r<n.values.length;r++){let d=n.values[r];if(d){let p=r+1,g=`${a}!${p}:${p}`,w=`${e.spreadsheetId}_${a}_${g}`;await s.db.rows.upsertByEntityId(w,{rowId:w,spreadsheetId:e.spreadsheetId,sheetName:a,range:g,values:d,createdAt:new Date})}}}catch(a){console.warn("Failed to save rows to database:",a)}return await c(s,"googlesheets.sheets.getRows",{...e},"completed"),n},D=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,n=e.values?[e.values]:[],a=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s.key,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:n,majorDimension:"ROWS"}});if(a.responses&&a.responses.length>0&&s.db.rows)try{let r=a.responses[0];if(r){let d=r.updatedRange||o,p=e.sheetName||"Sheet1",g=`${e.spreadsheetId}_${p}_${d}`;await s.db.rows.upsertByEntityId(g,{rowId:g,spreadsheetId:e.spreadsheetId,sheetName:p,range:d,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await c(s,"googlesheets.sheets.updateRow",{...e},"completed"),a},P=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",n=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}:clear`,s.key,{method:"POST"});if(n.clearedRange&&s.db.rows)try{let a=e.sheetName||"Sheet1",r=n.clearedRange,d=`${e.spreadsheetId}_${a}_${r}`;await s.db.rows.deleteByEntityId(d)}catch(a){console.warn("Failed to delete rows from database:",a)}return await c(s,"googlesheets.sheets.clearSheet",{...e},"completed"),n},N=async(s,e)=>{let o=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s.key,{method:"POST",body:{requests:[{addSheet:{properties:{title:e.title||"Sheet1"}}}]}});if(o.replies&&o.replies.length>0&&s.db.sheets)try{let a=o.replies[0].addSheet?.properties;a?.sheetId!==void 0&&await s.db.sheets.upsertByEntityId(String(a.sheetId),{sheetId:String(a.sheetId),spreadsheetId:e.spreadsheetId,title:a.title||e.title||"Sheet1",index:a.index,createdAt:new Date})}catch(n){console.warn("Failed to save sheet to database:",n)}return await c(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},_=async(s,e)=>{let o=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s.key,{method:"POST",body:{requests:[{deleteSheet:{sheetId:e.sheetId}}]}});if(s.db.sheets)try{await s.db.sheets.deleteByEntityId(String(e.sheetId))}catch(n){console.warn("Failed to delete sheet from database:",n)}return await c(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},$=async(s,e)=>{let o=e.dimension||"ROWS",n=e.startIndex||0,a=e.endIndex||n+1,r=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s.key,{method:"POST",body:{requests:[{deleteDimension:{range:{sheetId:e.sheetId,dimension:o,startIndex:n,endIndex:a}}}]}});if(o==="ROWS"&&s.db.rows)try{let d=`Sheet_${e.sheetId}`;for(let p=n;p<a;p++){let g=p+1,w=`${d}!${g}:${g}`,i=`${e.spreadsheetId}_${d}_${w}`;await s.db.rows.deleteByEntityId(i)}}catch(d){console.warn("Failed to delete rows from database:",d)}return await c(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};var W=async(s,e)=>{let o=await u("/spreadsheets",s.key,{method:"POST",body:{properties:e.properties}});if(o.spreadsheetId&&s.db.spreadsheets)try{await s.db.spreadsheets.upsertByEntityId(o.spreadsheetId,{spreadsheetId:o.spreadsheetId,title:o.properties?.title,spreadsheetUrl:o.spreadsheetUrl,createdAt:new Date})}catch(n){console.warn("Failed to save spreadsheet to database:",n)}return await c(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},x=async(s,e)=>{let o=await fetch(`https://www.googleapis.com/drive/v3/files/${e.spreadsheetId}`,{method:"DELETE",headers:{Authorization:`Bearer ${s.key}`}});if(!o.ok&&o.status!==404){let n=await o.text();throw new Error(`Failed to delete spreadsheet: ${o.status} ${n}`)}if(s.db.spreadsheets)try{await s.db.spreadsheets.deleteByEntityId(e.spreadsheetId)}catch(n){console.warn("Failed to delete spreadsheet from database:",n)}await c(s,"googlesheets.spreadsheets.delete",{...e},"completed")};import{z as t}from"zod";var Y=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),ee=t.object({spreadsheetId:t.string()}),te=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),se=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),keyColumn:t.string().optional(),keyValue:t.union([t.string(),t.number()]).optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),oe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),valueRenderOption:t.enum(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional(),dateTimeRenderOption:t.enum(["SERIAL_NUMBER","FORMATTED_STRING"]).optional()}),ne=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),rowIndex:t.number().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional()}),ae=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),re=t.object({spreadsheetId:t.string(),title:t.string().optional()}),pe=t.object({spreadsheetId:t.string(),sheetId:t.number()}),de=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),S={spreadsheetsCreate:Y,spreadsheetsDelete:ee,sheetsAppendRow:te,sheetsAppendOrUpdateRow:se,sheetsGetRows:oe,sheetsUpdateRow:ne,sheetsClearSheet:ae,sheetsCreateSheet:re,sheetsDeleteSheet:pe,sheetsDeleteRowsOrColumns:de},he=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),B=t.object({spreadsheetId:t.string().optional(),properties:he.optional(),spreadsheetUrl:t.string().optional()}),j=t.object({range:t.string().optional(),majorDimension:t.enum(["ROWS","COLUMNS","DIMENSION_UNSPECIFIED"]).optional(),values:t.array(t.array(t.union([t.string(),t.number(),t.boolean(),t.null()]))).optional()}),f=t.object({spreadsheetId:t.string().optional(),totalUpdatedRows:t.number().optional(),totalUpdatedColumns:t.number().optional(),totalUpdatedCells:t.number().optional(),totalUpdatedSheets:t.number().optional(),responses:t.array(j).optional()}),le=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),ie=t.object({sheetId:t.number().optional(),title:t.string().optional(),index:t.number().optional(),sheetType:t.enum(["GRID","OBJECT","DATA_SOURCE"]).optional(),hidden:t.boolean().optional()}),Ge=t.object({properties:ie.optional()}),O=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:B.optional()}),m={spreadsheetsCreate:B,spreadsheetsDelete:t.void(),sheetsAppendRow:f,sheetsAppendOrUpdateRow:f,sheetsGetRows:j,sheetsUpdateRow:f,sheetsClearSheet:le,sheetsCreateSheet:O,sheetsDeleteSheet:O,sheetsDeleteRowsOrColumns:O};var k={create:W,delete:x},y={appendRow:T,appendOrUpdateRow:C,getRows:A,updateRow:D,clearSheet:P,createSheet:N,deleteSheet:_,deleteRowsOrColumns:$};import{z as l}from"zod";var V=l.object({spreadsheetId:l.string(),title:l.string().optional(),spreadsheetUrl:l.string().optional(),createdAt:l.coerce.date().optional()}),q=l.object({sheetId:l.string(),spreadsheetId:l.string(),title:l.string().optional(),index:l.number().optional(),createdAt:l.coerce.date().optional()}),L=l.object({rowId:l.string(),spreadsheetId:l.string(),sheetName:l.string().optional(),range:l.string().optional(),values:l.array(l.union([l.string(),l.number(),l.boolean(),l.null()])).optional(),createdAt:l.coerce.date().optional()});var F={version:"1.0.0",entities:{spreadsheets:V,sheets:q,rows:L}};import{z as h}from"zod";var M=h.object({spreadsheetId:h.string().optional(),sheetName:h.string().optional(),range:h.string().optional(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])).optional(),eventType:h.literal("rangeUpdated").optional(),timestamp:h.string().optional(),event:h.unknown().optional()}),K=h.object({eventType:h.literal("rangeUpdated"),spreadsheetId:h.string(),sheetName:h.string(),range:h.string(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])),timestamp:h.string()});function ge(s){return typeof s=="string"?JSON.parse(s):s}function G(s){return e=>ge(e.body).eventType===s}var H={match:G("rangeUpdated"),handler:async(s,e)=>{let o=e.payload;if(!o.spreadsheetId||!o.values)return{success:!1,error:"Missing required fields: spreadsheetId or values"};let n={eventType:"rangeUpdated",spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,timestamp:o.timestamp||new Date().toISOString()};if(s.db.rows)try{let a=`${o.spreadsheetId}_${o.sheetName}_${o.range||"A:Z"}`;await s.db.rows.upsertByEntityId(a,{rowId:a,spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,createdAt:new Date})}catch(a){console.warn("Failed to save/update range in database:",a)}return await c(s,"googlesheets.webhook.rangeUpdated",{...n},"completed"),{success:!0,data:n}}};var z={rangeUpdated:H};var ce={spreadsheets:{create:k.create,delete:k.delete},sheets:{appendRow:y.appendRow,appendOrUpdateRow:y.appendOrUpdateRow,getRows:y.getRows,updateRow:y.updateRow,clearSheet:y.clearSheet,createSheet:y.createSheet,deleteSheet:y.deleteSheet,deleteRowsOrColumns:y.deleteRowsOrColumns}},ue={"spreadsheets.create":{input:S.spreadsheetsCreate,output:m.spreadsheetsCreate},"spreadsheets.delete":{input:S.spreadsheetsDelete,output:m.spreadsheetsDelete},"sheets.appendRow":{input:S.sheetsAppendRow,output:m.sheetsAppendRow},"sheets.appendOrUpdateRow":{input:S.sheetsAppendOrUpdateRow,output:m.sheetsAppendOrUpdateRow},"sheets.getRows":{input:S.sheetsGetRows,output:m.sheetsGetRows},"sheets.updateRow":{input:S.sheetsUpdateRow,output:m.sheetsUpdateRow},"sheets.clearSheet":{input:S.sheetsClearSheet,output:m.sheetsClearSheet},"sheets.createSheet":{input:S.sheetsCreateSheet,output:m.sheetsCreateSheet},"sheets.deleteSheet":{input:S.sheetsDeleteSheet,output:m.sheetsDeleteSheet},"sheets.deleteRowsOrColumns":{input:S.sheetsDeleteRowsOrColumns,output:m.sheetsDeleteRowsOrColumns}},Se={rangeUpdated:z.rangeUpdated},me={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:M,response:K}},we="oauth_2",Re={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.appendRow":{riskLevel:"write",description:"Append a new row to a sheet"},"sheets.appendOrUpdateRow":{riskLevel:"write",description:"Append a new row or update an existing one"},"sheets.getRows":{riskLevel:"read",description:"Read rows from a sheet"},"sheets.updateRow":{riskLevel:"write",description:"Update an existing row in a sheet"},"sheets.clearSheet":{riskLevel:"destructive",description:"Clear all data from a sheet [DESTRUCTIVE]"},"sheets.createSheet":{riskLevel:"write",description:"Add a new sheet tab to a spreadsheet"},"sheets.deleteSheet":{riskLevel:"destructive",irreversible:!0,description:"Delete a sheet tab and all its data [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.deleteRowsOrColumns":{riskLevel:"destructive",description:"Delete rows or columns from a sheet [DESTRUCTIVE]"}};function ze(s={}){let e={...s,authType:s.authType??we};return{id:"googlesheets",schema:F,options:e,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/spreadsheets"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:ce,webhooks:Se,endpointMeta:Re,endpointSchemas:ue,webhookSchemas:me,keyBuilder:async o=>{if(e.key)return e.key;if(o.authType==="oauth_2"){let[n,a,r]=await Promise.all([o.keys.get_access_token(),o.keys.get_expires_at(),o.keys.get_refresh_token()]);if(!r)throw new Error("No refresh token. Cannot get access token.");let d=await o.keys.get_integration_credentials();if(!d.client_id||!d.client_secret)throw new Error("No client id or client secret");let p=await U({accessToken:n,expiresAt:a,refreshToken:r,clientId:d.client_id,clientSecret:d.client_secret});return p.refreshed&&await Promise.all([o.keys.set_access_token(p.accessToken),o.keys.set_expires_at(String(p.expiresAt))]),p.accessToken}return""},pluginWebhookMatcher:o=>{let n=o.body;if(!n)return!1;let a=typeof n?.spreadsheetId=="string",r=n?.eventType==="rangeUpdated";return a||r}}}export{G as createGoogleSheetsWebhookMatcher,ze as googlesheets,ue as googlesheetsEndpointSchemas};
|
|
1
|
+
import{a as g,c as T}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import"../../chunk-476ZUILE.js";var f=class extends Error{constructor(o,n){super(o);this.code=n;this.name="GoogleSheetsAPIError"}},J="https://sheets.googleapis.com/v4";async function Q(s,e,o){let n=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:s,client_secret:e,refresh_token:o,grant_type:"refresh_token"})});if(!n.ok){let a=await n.text();throw new f(`Failed to refresh access token: ${a}`,n.status)}return await n.json()}async function I({accessToken:s,expiresAt:e,clientId:o,clientSecret:n,refreshToken:a,forceRefresh:r=!1}){let p=Math.floor(Date.now()/1e3);if(!r&&s&&e&&Number(e)>p+300)return{accessToken:s,expiresAt:Number(e),refreshed:!1};let l=await Q(o,n,a);return{accessToken:l.access_token,expiresAt:p+l.expires_in,refreshed:!0}}async function U(s,e,o={}){let{method:n="GET",body:a,query:r}=o;return await T({BASE:J,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json"}},{method:n,url:s,body:n==="POST"||n==="PUT"||n==="PATCH"?a:void 0,mediaType:"application/json",query:r})}function X(s){return s instanceof Error&&"status"in s&&s.status===401}async function u(s,e,o={}){try{return await U(s,e.key,o)}catch(n){if(X(n)&&e._refreshAuth){let a=await e._refreshAuth();return await U(s,a,o)}throw n}}var A=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,n=e.values?[e.values]:[],a=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:n,majorDimension:"ROWS"}});if(a.responses&&a.responses.length>0&&s.db.rows)try{let r=a.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await g(s,"googlesheets.sheets.appendRow",{...e},"completed"),a},C=async(s,e)=>{let o=e.sheetName||"Sheet1",n=e.keyColumn||"A",a=e.keyValue;if(!a)throw new Error("keyValue is required for appendOrUpdateRow");let r=`${o}!${n}:${n}`,p=await u(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s,{method:"GET"}),d=-1;if(p.values){for(let c=0;c<p.values.length;c++)if(p.values[c]?.[0]===String(a)){d=c;break}}let l=e.values?[e.values]:[],w=d>=0?`${o}!${d+1}:${d+1}`:`${o}!A:Z`;if(d>=0){let c=await u(`/spreadsheets/${e.spreadsheetId}/values/${w}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:l,majorDimension:"ROWS"}});if(c.responses&&c.responses.length>0&&s.db.rows)try{let R=c.responses[0];if(R){let E=R.updatedRange||w,b=`${e.spreadsheetId}_${o}_${E}`;await s.db.rows.upsertByEntityId(b,{rowId:b,spreadsheetId:e.spreadsheetId,sheetName:o,range:E,values:e.values,createdAt:new Date})}}catch(R){console.warn("Failed to update row in database:",R)}return await g(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),c}else{let c=await u(`/spreadsheets/${e.spreadsheetId}/values/${w}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:l,majorDimension:"ROWS"}});if(c.responses&&c.responses.length>0&&s.db.rows)try{let R=c.responses[0];if(R){let E=R.updatedRange||w,b=`${e.spreadsheetId}_${o}_${E}`;await s.db.rows.upsertByEntityId(b,{rowId:b,spreadsheetId:e.spreadsheetId,sheetName:o,range:E,values:e.values,createdAt:new Date})}}catch(R){console.warn("Failed to save row to database:",R)}return await g(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),c}},_=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,n=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"GET",query:{valueRenderOption:e.valueRenderOption||"FORMATTED_VALUE",dateTimeRenderOption:e.dateTimeRenderOption||"FORMATTED_STRING"}});if(n.values&&s.db.rows)try{let a=e.sheetName||"Sheet1";for(let r=0;r<n.values.length;r++){let p=n.values[r];if(p){let d=r+1,l=`${a}!${d}:${d}`,w=`${e.spreadsheetId}_${a}_${l}`;await s.db.rows.upsertByEntityId(w,{rowId:w,spreadsheetId:e.spreadsheetId,sheetName:a,range:l,values:p,createdAt:new Date})}}}catch(a){console.warn("Failed to save rows to database:",a)}return await g(s,"googlesheets.sheets.getRows",{...e},"completed"),n},D=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,n=e.values?[e.values]:[],a=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:n,majorDimension:"ROWS"}});if(a.responses&&a.responses.length>0&&s.db.rows)try{let r=a.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await g(s,"googlesheets.sheets.updateRow",{...e},"completed"),a},P=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",n=await u(`/spreadsheets/${e.spreadsheetId}/values/${o}:clear`,s,{method:"POST"});if(n.clearedRange&&s.db.rows)try{let a=e.sheetName||"Sheet1",r=n.clearedRange,p=`${e.spreadsheetId}_${a}_${r}`;await s.db.rows.deleteByEntityId(p)}catch(a){console.warn("Failed to delete rows from database:",a)}return await g(s,"googlesheets.sheets.clearSheet",{...e},"completed"),n},N=async(s,e)=>{let o=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{addSheet:{properties:{title:e.title||"Sheet1"}}}]}});if(o.replies&&o.replies.length>0&&s.db.sheets)try{let a=o.replies[0].addSheet?.properties;a?.sheetId!==void 0&&await s.db.sheets.upsertByEntityId(String(a.sheetId),{sheetId:String(a.sheetId),spreadsheetId:e.spreadsheetId,title:a.title||e.title||"Sheet1",index:a.index,createdAt:new Date})}catch(n){console.warn("Failed to save sheet to database:",n)}return await g(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},$=async(s,e)=>{let o=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteSheet:{sheetId:e.sheetId}}]}});if(s.db.sheets)try{await s.db.sheets.deleteByEntityId(String(e.sheetId))}catch(n){console.warn("Failed to delete sheet from database:",n)}return await g(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},W=async(s,e)=>{let o=e.dimension||"ROWS",n=e.startIndex||0,a=e.endIndex||n+1,r=await u(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteDimension:{range:{sheetId:e.sheetId,dimension:o,startIndex:n,endIndex:a}}}]}});if(o==="ROWS"&&s.db.rows)try{let p=`Sheet_${e.sheetId}`;for(let d=n;d<a;d++){let l=d+1,w=`${p}!${l}:${l}`,c=`${e.spreadsheetId}_${p}_${w}`;await s.db.rows.deleteByEntityId(c)}}catch(p){console.warn("Failed to delete rows from database:",p)}return await g(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};var x=async(s,e)=>{let o=await u("/spreadsheets",s,{method:"POST",body:{properties:e.properties}});if(o.spreadsheetId&&s.db.spreadsheets)try{await s.db.spreadsheets.upsertByEntityId(o.spreadsheetId,{spreadsheetId:o.spreadsheetId,title:o.properties?.title,spreadsheetUrl:o.spreadsheetUrl,createdAt:new Date})}catch(n){console.warn("Failed to save spreadsheet to database:",n)}return await g(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},B=async(s,e)=>{let o=await fetch(`https://www.googleapis.com/drive/v3/files/${e.spreadsheetId}`,{method:"DELETE",headers:{Authorization:`Bearer ${s.key}`}});if(!o.ok&&o.status!==404){let n=await o.text();throw new Error(`Failed to delete spreadsheet: ${o.status} ${n}`)}if(s.db.spreadsheets)try{await s.db.spreadsheets.deleteByEntityId(e.spreadsheetId)}catch(n){console.warn("Failed to delete spreadsheet from database:",n)}await g(s,"googlesheets.spreadsheets.delete",{...e},"completed")};import{z as t}from"zod";var te=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),se=t.object({spreadsheetId:t.string()}),oe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ne=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),keyColumn:t.string().optional(),keyValue:t.union([t.string(),t.number()]).optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ae=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),valueRenderOption:t.enum(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional(),dateTimeRenderOption:t.enum(["SERIAL_NUMBER","FORMATTED_STRING"]).optional()}),re=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),rowIndex:t.number().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional()}),pe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),de=t.object({spreadsheetId:t.string(),title:t.string().optional()}),he=t.object({spreadsheetId:t.string(),sheetId:t.number()}),ie=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),S={spreadsheetsCreate:te,spreadsheetsDelete:se,sheetsAppendRow:oe,sheetsAppendOrUpdateRow:ne,sheetsGetRows:ae,sheetsUpdateRow:re,sheetsClearSheet:pe,sheetsCreateSheet:de,sheetsDeleteSheet:he,sheetsDeleteRowsOrColumns:ie},le=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),q=t.object({spreadsheetId:t.string().optional(),properties:le.optional(),spreadsheetUrl:t.string().optional()}),j=t.object({range:t.string().optional(),majorDimension:t.enum(["ROWS","COLUMNS","DIMENSION_UNSPECIFIED"]).optional(),values:t.array(t.array(t.union([t.string(),t.number(),t.boolean(),t.null()]))).optional()}),O=t.object({spreadsheetId:t.string().optional(),totalUpdatedRows:t.number().optional(),totalUpdatedColumns:t.number().optional(),totalUpdatedCells:t.number().optional(),totalUpdatedSheets:t.number().optional(),responses:t.array(j).optional()}),ce=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),ge=t.object({sheetId:t.number().optional(),title:t.string().optional(),index:t.number().optional(),sheetType:t.enum(["GRID","OBJECT","DATA_SOURCE"]).optional(),hidden:t.boolean().optional()}),Te=t.object({properties:ge.optional()}),k=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:q.optional()}),m={spreadsheetsCreate:q,spreadsheetsDelete:t.void(),sheetsAppendRow:O,sheetsAppendOrUpdateRow:O,sheetsGetRows:j,sheetsUpdateRow:O,sheetsClearSheet:ce,sheetsCreateSheet:k,sheetsDeleteSheet:k,sheetsDeleteRowsOrColumns:k};var G={create:x,delete:B},y={appendRow:A,appendOrUpdateRow:C,getRows:_,updateRow:D,clearSheet:P,createSheet:N,deleteSheet:$,deleteRowsOrColumns:W};import{z as i}from"zod";var V=i.object({spreadsheetId:i.string(),title:i.string().optional(),spreadsheetUrl:i.string().optional(),createdAt:i.coerce.date().optional()}),F=i.object({sheetId:i.string(),spreadsheetId:i.string(),title:i.string().optional(),index:i.number().optional(),createdAt:i.coerce.date().optional()}),L=i.object({rowId:i.string(),spreadsheetId:i.string(),sheetName:i.string().optional(),range:i.string().optional(),values:i.array(i.union([i.string(),i.number(),i.boolean(),i.null()])).optional(),createdAt:i.coerce.date().optional()});var M={version:"1.0.0",entities:{spreadsheets:V,sheets:F,rows:L}};import{z as h}from"zod";var K=h.object({spreadsheetId:h.string().optional(),sheetName:h.string().optional(),range:h.string().optional(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])).optional(),eventType:h.literal("rangeUpdated").optional(),timestamp:h.string().optional(),event:h.unknown().optional()}),z=h.object({eventType:h.literal("rangeUpdated"),spreadsheetId:h.string(),sheetName:h.string(),range:h.string(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])),timestamp:h.string()});function ue(s){return typeof s=="string"?JSON.parse(s):s}function v(s){return e=>ue(e.body).eventType===s}var H={match:v("rangeUpdated"),handler:async(s,e)=>{let o=e.payload;if(!o.spreadsheetId||!o.values)return{success:!1,error:"Missing required fields: spreadsheetId or values"};let n={eventType:"rangeUpdated",spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,timestamp:o.timestamp||new Date().toISOString()};if(s.db.rows)try{let a=`${o.spreadsheetId}_${o.sheetName}_${o.range||"A:Z"}`;await s.db.rows.upsertByEntityId(a,{rowId:a,spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,createdAt:new Date})}catch(a){console.warn("Failed to save/update range in database:",a)}return await g(s,"googlesheets.webhook.rangeUpdated",{...n},"completed"),{success:!0,data:n}}};var Z={rangeUpdated:H};var Se={spreadsheets:{create:G.create,delete:G.delete},sheets:{appendRow:y.appendRow,appendOrUpdateRow:y.appendOrUpdateRow,getRows:y.getRows,updateRow:y.updateRow,clearSheet:y.clearSheet,createSheet:y.createSheet,deleteSheet:y.deleteSheet,deleteRowsOrColumns:y.deleteRowsOrColumns}},me={"spreadsheets.create":{input:S.spreadsheetsCreate,output:m.spreadsheetsCreate},"spreadsheets.delete":{input:S.spreadsheetsDelete,output:m.spreadsheetsDelete},"sheets.appendRow":{input:S.sheetsAppendRow,output:m.sheetsAppendRow},"sheets.appendOrUpdateRow":{input:S.sheetsAppendOrUpdateRow,output:m.sheetsAppendOrUpdateRow},"sheets.getRows":{input:S.sheetsGetRows,output:m.sheetsGetRows},"sheets.updateRow":{input:S.sheetsUpdateRow,output:m.sheetsUpdateRow},"sheets.clearSheet":{input:S.sheetsClearSheet,output:m.sheetsClearSheet},"sheets.createSheet":{input:S.sheetsCreateSheet,output:m.sheetsCreateSheet},"sheets.deleteSheet":{input:S.sheetsDeleteSheet,output:m.sheetsDeleteSheet},"sheets.deleteRowsOrColumns":{input:S.sheetsDeleteRowsOrColumns,output:m.sheetsDeleteRowsOrColumns}},we={rangeUpdated:Z.rangeUpdated},Re={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:K,response:z}},ye="oauth_2",Ee={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.appendRow":{riskLevel:"write",description:"Append a new row to a sheet"},"sheets.appendOrUpdateRow":{riskLevel:"write",description:"Append a new row or update an existing one"},"sheets.getRows":{riskLevel:"read",description:"Read rows from a sheet"},"sheets.updateRow":{riskLevel:"write",description:"Update an existing row in a sheet"},"sheets.clearSheet":{riskLevel:"destructive",description:"Clear all data from a sheet [DESTRUCTIVE]"},"sheets.createSheet":{riskLevel:"write",description:"Add a new sheet tab to a spreadsheet"},"sheets.deleteSheet":{riskLevel:"destructive",irreversible:!0,description:"Delete a sheet tab and all its data [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.deleteRowsOrColumns":{riskLevel:"destructive",description:"Delete rows or columns from a sheet [DESTRUCTIVE]"}};function Je(s={}){let e={...s,authType:s.authType??ye};return{id:"googlesheets",schema:M,options:e,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/spreadsheets"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:Se,webhooks:we,endpointMeta:Ee,endpointSchemas:me,webhookSchemas:Re,keyBuilder:async o=>{if(e.key)return e.key;if(o.authType==="oauth_2"){let[n,a,r]=await Promise.all([o.keys.get_access_token(),o.keys.get_expires_at(),o.keys.get_refresh_token()]);if(!r)throw new Error("[corsair:googlesheets] No refresh token. Cannot get access token.");let p=await o.keys.get_integration_credentials();if(!p.client_id||!p.client_secret)throw new Error("[corsair:googlesheets] No client id or client secret");try{let d=await I({accessToken:n,expiresAt:a,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret});return d.refreshed&&await Promise.all([o.keys.set_access_token(d.accessToken),o.keys.set_expires_at(String(d.expiresAt))]),o._refreshAuth=async()=>{let l=await I({accessToken:null,expiresAt:null,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret,forceRefresh:!0});return await o.keys.set_access_token(l.accessToken),await o.keys.set_expires_at(String(l.expiresAt)),l.accessToken},d.accessToken}catch(d){throw new Error(`[corsair:googlesheets] Failed to get valid access token: ${d instanceof Error?d.message:String(d)}`)}}return""},pluginWebhookMatcher:o=>{let n=o.body;if(!n)return!1;let a=typeof n?.spreadsheetId=="string",r=n?.eventType==="rangeUpdated";return a||r}}}export{v as createGoogleSheetsWebhookMatcher,Je as googlesheets,me as googlesheetsEndpointSchemas};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as i,b as h,c as v}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import{a as Tt}from"../../chunk-476ZUILE.js";var f=class extends Error{constructor(r,a,y){super(r);this.code=a;this.status=y;this.name="SpotifyAPIError"}},Gt="https://api.spotify.com/v1",At={enabled:!0,maxRetries:3,initialRetryDelay:1e3,backoffMultiplier:2,headerNames:{retryAfter:"Retry-After"}},R=null,_=0;async function xt(o,e,r){let a=await fetch("https://accounts.spotify.com/api/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:r,client_id:o,client_secret:e})});if(!a.ok){let y=await a.text();throw new f(`Failed to refresh access token: ${y}`,void 0,a.status)}return await a.json()}async function j({accessToken:o,clientId:e,clientSecret:r,refreshToken:a}){let y=Date.now(),m=300*1e3;if(R&&_>y+m&&R===o)return R;try{let c=await xt(e,r,a);return R=c.access_token,_=y+c.expires_in*1e3,R}catch(c){if(c instanceof f)throw c;return o||void 0}}async function n(o,e,r={}){let{method:a="GET",body:y,query:m}=r,c={BASE:Gt,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}},k={method:a,url:o,body:a==="POST"||a==="PUT"||a==="PATCH"?y:void 0,mediaType:"application/json; charset=utf-8",query:a==="GET"?m:void 0};try{let u=await v(c,k,{rateLimitConfig:At});if(u&&typeof u=="object"&&"error"in u&&u.error){let I=u.error;throw new f(I.message||"Spotify API error",void 0,I.status)}return u}catch(u){throw u instanceof h?new f(u.message,void 0,u.status):u instanceof f?u:u instanceof Error?new f(u.message):new f("Unknown error")}}var C=async(o,e)=>{let r={};e.market&&(r.market=e.market);let a=await n(`albums/${e.id}`,o.key,{method:"GET",query:r});if(a&&o.db.albums)try{await o.db.albums.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save album to database:",y)}return await i(o,"spotify.albums.get",{...e},"completed"),a},O=async(o,e)=>{let r={...e},a=await n("browse/new-releases",o.key,{method:"GET",query:r});return await i(o,"spotify.albums.getNewReleases",{...e},"completed"),a},z=async(o,e)=>{let r={...e},a=await n(`albums/${e.id}/tracks`,o.key,{method:"GET",query:r});return await i(o,"spotify.albums.getTracks",{...e},"completed"),a},L=async(o,e)=>{let r={q:e.q,type:e.type||"album"};e.market&&(r.market=e.market),e.limit&&(r.limit=e.limit),e.offset&&(r.offset=e.offset);let a=await n("search",o.key,{method:"GET",query:r});return await i(o,"spotify.albums.search",{...e},"completed"),a};var F=async(o,e)=>{let r=await n(`artists/${e.id}`,o.key,{method:"GET"});if(r&&o.db.artists)try{await o.db.artists.upsertByEntityId(r.id,{...r})}catch(a){console.warn("Failed to save artist to database:",a)}return await i(o,"spotify.artists.get",{...e},"completed"),r},N=async(o,e)=>{let r={...e},a=await n(`artists/${e.id}/albums`,o.key,{method:"GET",query:r});return await i(o,"spotify.artists.getAlbums",{...e},"completed"),a},q=async(o,e)=>{let r=await n(`artists/${e.id}/related-artists`,o.key,{method:"GET"});return await i(o,"spotify.artists.getRelatedArtists",{...e},"completed"),r},U=async(o,e)=>{let r={...e},a=await n(`artists/${e.id}/top-tracks`,o.key,{method:"GET",query:r});return await i(o,"spotify.artists.getTopTracks",{...e},"completed"),a},W=async(o,e)=>{let r={...e},a=await n("search",o.key,{method:"GET",query:r});return await i(o,"spotify.artists.search",{...e},"completed"),a};var D=async(o,e)=>{let r={...e},a=await n("me/tracks",o.key,{method:"GET",query:r});return await i(o,"spotify.library.getLikedTracks",{...e},"completed"),a};var M=async(o,e)=>{let r={type:e.type||"artist"};e.limit&&(r.limit=e.limit),e.after&&(r.after=e.after);let a=await n("me/following",o.key,{method:"GET",query:r});return await i(o,"spotify.myData.getFollowedArtists",{...e},"completed"),a};var V=async(o,e)=>{let r={uri:e.uri};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/queue",o.key,{method:"POST",query:r});return await i(o,"spotify.player.addToQueue",{...e},"completed"),a},B=async(o,e)=>{let r={};e.market&&(r.market=e.market),e.additional_types&&(r.additional_types=e.additional_types);let a=await n("me/player/currently-playing",o.key,{method:"GET",query:r});return await i(o,"spotify.player.getCurrentlyPlaying",{...e},"completed"),a},Q=async(o,e)=>{let r={};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/next",o.key,{method:"POST",query:r});return await i(o,"spotify.player.skipToNext",{...e},"completed"),a},$=async(o,e)=>{let r={};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/pause",o.key,{method:"PUT",query:r});return await i(o,"spotify.player.pause",{...e},"completed"),a},H=async(o,e)=>{let r={};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/previous",o.key,{method:"POST",query:r});return await i(o,"spotify.player.skipToPrevious",{...e},"completed"),a},K=async(o,e)=>{let r={};e.limit&&(r.limit=e.limit),e.after&&(r.after=e.after),e.before&&(r.before=e.before);let a=await n("me/player/recently-played",o.key,{method:"GET",query:r});return await i(o,"spotify.player.getRecentlyPlayed",{...e},"completed"),a},Y=async(o,e)=>{let r={};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/play",o.key,{method:"PUT",query:r});return await i(o,"spotify.player.resume",{...e},"completed"),a},J=async(o,e)=>{let r={volume_percent:e.volume_percent};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/volume",o.key,{method:"PUT",query:r});return await i(o,"spotify.player.setVolume",{...e},"completed"),a},X=async(o,e)=>{let r={};e.device_id&&(r.device_id=e.device_id);let a=await n("me/player/play",o.key,{method:"PUT",query:r,body:e});return await i(o,"spotify.player.startPlayback",{...e},"completed"),a};var Z=async(o,e)=>{let r={};e.position!==void 0&&(r.position=e.position);let a=await n(`playlists/${e.playlist_id}/tracks`,o.key,{method:"POST",query:r,body:{uris:e.uris}});return await i(o,"spotify.playlists.addItem",{...e},"completed"),a},tt=async(o,e)=>{let r=await n(`users/${e.user_id}/playlists`,o.key,{method:"POST",body:e});if(r&&o.db.playlists)try{await o.db.playlists.upsertByEntityId(r.id,{...r})}catch(a){console.warn("Failed to save playlist to database:",a)}return await i(o,"spotify.playlists.create",{...e},"completed"),r},et=async(o,e)=>{let r={...e},a=await n(`playlists/${e.playlist_id}`,o.key,{method:"GET",query:r});if(a&&o.db.playlists)try{await o.db.playlists.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save playlist to database:",y)}return await i(o,"spotify.playlists.get",{...e},"completed"),a},ot=async(o,e)=>{let r=e.user_id||"me",a={...e},y=await n(`users/${r}/playlists`,o.key,{method:"GET",query:a});return await i(o,"spotify.playlists.getUserPlaylists",{...e},"completed"),y},st=async(o,e)=>{let r={...e},a=await n(`playlists/${e.playlist_id}/tracks`,o.key,{method:"GET",query:r});return await i(o,"spotify.playlists.getTracks",{...e},"completed"),a},rt=async(o,e)=>{let r=await n(`playlists/${e.playlist_id}/tracks`,o.key,{method:"DELETE",body:e});return await i(o,"spotify.playlists.removeItem",{...e},"completed"),r},at=async(o,e)=>{let r={...e},a=await n("search",o.key,{method:"GET",query:r});return await i(o,"spotify.playlists.search",{...e},"completed"),a};var it=async(o,e)=>{let r={...e},a=await n(`tracks/${e.id}`,o.key,{method:"GET",query:r});if(a&&o.db.tracks)try{await o.db.tracks.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save track to database:",y)}return await i(o,"spotify.tracks.get",{...e},"completed"),a},nt=async(o,e)=>{let r=await n(`audio-features/${e.id}`,o.key,{method:"GET"});return await i(o,"spotify.tracks.getAudioFeatures",{...e},"completed"),r},pt=async(o,e)=>{let r={...e},a=await n("search",o.key,{method:"GET",query:r});return await i(o,"spotify.tracks.search",{...e},"completed"),a};import{z as t}from"zod";var T=t.object({id:t.string(),name:t.string(),album_type:t.string(),total_tracks:t.number().optional(),available_markets:t.array(t.string()).optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),release_date:t.string().optional(),release_date_precision:t.string().optional(),artists:t.array(t.object({id:t.string(),name:t.string(),external_urls:t.object({spotify:t.string().optional()}).optional()})).optional()}),A=t.object({id:t.string(),name:t.string(),external_urls:t.object({spotify:t.string().optional()}).optional(),followers:t.object({total:t.number().optional()}).optional(),genres:t.array(t.string()).optional(),href:t.string().optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),popularity:t.number().optional()}),g=t.object({id:t.string(),name:t.string(),artists:t.array(t.object({id:t.string(),name:t.string()})).optional(),album:T.optional(),duration_ms:t.number().optional(),explicit:t.boolean().optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),is_local:t.boolean().optional(),popularity:t.number().optional(),preview_url:t.string().nullable().optional(),track_number:t.number().optional()}),x=t.object({id:t.string(),name:t.string(),description:t.string().nullable().optional(),public:t.boolean().optional(),collaborative:t.boolean().optional(),owner:t.object({id:t.string(),display_name:t.string().optional(),external_urls:t.object({spotify:t.string().optional()}).optional()}).optional(),followers:t.object({total:t.number().optional()}).optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),tracks:t.object({href:t.string().optional(),total:t.number().optional()}).optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional()}),Et=t.object({added_at:t.string().optional(),added_by:t.object({id:t.string().optional()}).optional(),is_local:t.boolean().optional(),track:g.optional()}),wt=t.object({id:t.string(),danceability:t.number().optional(),energy:t.number().optional(),key:t.number().optional(),loudness:t.number().optional(),mode:t.number().optional(),speechiness:t.number().optional(),acousticness:t.number().optional(),instrumentalness:t.number().optional(),liveness:t.number().optional(),valence:t.number().optional(),tempo:t.number().optional(),duration_ms:t.number().optional(),time_signature:t.number().optional()}),It=t.object({timestamp:t.number().optional(),context:t.object({external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),type:t.string().optional(),uri:t.string().optional()}).optional(),progress_ms:t.number().optional(),is_playing:t.boolean().optional(),item:g.optional(),currently_playing_type:t.string().optional(),actions:t.object({disallows:t.object({resuming:t.boolean().optional()}).optional()}).optional()}),vt=t.object({id:t.string(),market:t.string().optional()}),_t=t.object({limit:t.number().optional(),offset:t.number().optional(),country:t.string().optional()}),jt=t.object({id:t.string(),limit:t.number().optional(),offset:t.number().optional(),market:t.string().optional()}),Ct=t.object({q:t.string(),type:t.literal("album").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),Ot=t.object({id:t.string()}),zt=t.object({id:t.string(),include_groups:t.string().optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),Lt=t.object({id:t.string()}),Ft=t.object({id:t.string(),market:t.string().optional()}),Nt=t.object({q:t.string(),type:t.literal("artist").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),qt=t.object({limit:t.number().optional(),offset:t.number().optional(),market:t.string().optional()}),Ut=t.object({type:t.literal("artist").optional(),limit:t.number().optional(),after:t.string().optional()}),Wt=t.object({uri:t.string(),device_id:t.string().optional()}),Dt=t.object({market:t.string().optional(),additional_types:t.string().optional()}),Mt=t.object({device_id:t.string().optional()}),Vt=t.object({device_id:t.string().optional()}),Bt=t.object({device_id:t.string().optional()}),Qt=t.object({limit:t.number().optional(),after:t.number().optional(),before:t.number().optional()}),$t=t.object({device_id:t.string().optional()}),Ht=t.object({volume_percent:t.number(),device_id:t.string().optional()}),Kt=t.object({device_id:t.string().optional(),context_uri:t.string().optional(),uris:t.array(t.string()).optional(),offset:t.object({position:t.number().optional(),uri:t.string().optional()}).optional(),position_ms:t.number().optional()}),Yt=t.object({playlist_id:t.string(),uris:t.array(t.string()),position:t.number().optional()}),Jt=t.object({user_id:t.string(),name:t.string(),public:t.boolean().optional(),collaborative:t.boolean().optional(),description:t.string().optional()}),Xt=t.object({playlist_id:t.string(),market:t.string().optional(),fields:t.string().optional(),additional_types:t.string().optional()}),Zt=t.object({user_id:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),te=t.object({playlist_id:t.string(),market:t.string().optional(),fields:t.string().optional(),limit:t.number().optional(),offset:t.number().optional(),additional_types:t.string().optional()}),ee=t.object({playlist_id:t.string(),tracks:t.array(t.object({uri:t.string()})),snapshot_id:t.string().optional()}),oe=t.object({q:t.string(),type:t.literal("playlist").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),se=t.object({id:t.string(),market:t.string().optional()}),re=t.object({id:t.string()}),ae=t.object({q:t.string(),type:t.literal("track").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),p={albumsGet:vt,albumsGetNewReleases:_t,albumsGetTracks:jt,albumsSearch:Ct,artistsGet:Ot,artistsGetAlbums:zt,artistsGetRelatedArtists:Lt,artistsGetTopTracks:Ft,artistsSearch:Nt,libraryGetLikedTracks:qt,myDataGetFollowedArtists:Ut,playerAddToQueue:Wt,playerGetCurrentlyPlaying:Dt,playerSkipToNext:Mt,playerPause:Vt,playerSkipToPrevious:Bt,playerGetRecentlyPlayed:Qt,playerResume:$t,playerSetVolume:Ht,playerStartPlayback:Kt,playlistsAddItem:Yt,playlistsCreate:Jt,playlistsGet:Xt,playlistsGetUserPlaylists:Zt,playlistsGetTracks:te,playlistsRemoveItem:ee,playlistsSearch:oe,tracksGet:se,tracksGetAudioFeatures:re,tracksSearch:ae},ie=T,ne=t.object({albums:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()})}),pe=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(g).optional()}),le=t.object({albums:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()})}),ye=A,ce=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()}),ue=t.object({artists:t.array(A).optional()}),me=t.object({tracks:t.array(g).optional()}),de=t.object({artists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(A).optional()})}),fe=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(t.object({added_at:t.string().optional(),track:g.optional()})).optional()}),be=t.object({artists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),cursors:t.object({after:t.string().nullable().optional()}).optional(),total:t.number().optional(),items:t.array(A).optional()})}),ge=t.object({}),Se=It.nullable().optional(),ke=t.object({}),he=t.object({}),Pe=t.object({}),Re=t.object({items:t.array(t.object({track:g.optional(),played_at:t.string().optional(),context:t.object({type:t.string().optional(),href:t.string().optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),uri:t.string().optional()}).nullable().optional()})).optional(),next:t.string().nullable().optional(),cursors:t.object({after:t.string().optional(),before:t.string().optional()}).optional(),limit:t.number().optional()}),Te=t.object({}),Ge=t.object({}),Ae=t.object({}),xe=t.object({snapshot_id:t.string().optional()}),Ee=x,we=x,Ie=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(x.nullable()).optional()}),ve=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(Et).optional()}),_e=t.object({snapshot_id:t.string().optional()}),je=t.object({playlists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(x.nullable()).optional()})}),Ce=g,Oe=wt,ze=t.object({tracks:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(g).optional()})}),l={albumsGet:ie,albumsGetNewReleases:ne,albumsGetTracks:pe,albumsSearch:le,artistsGet:ye,artistsGetAlbums:ce,artistsGetRelatedArtists:ue,artistsGetTopTracks:me,artistsSearch:de,libraryGetLikedTracks:fe,myDataGetFollowedArtists:be,playerAddToQueue:ge,playerGetCurrentlyPlaying:Se,playerSkipToNext:ke,playerPause:he,playerSkipToPrevious:Pe,playerGetRecentlyPlayed:Re,playerResume:Te,playerSetVolume:Ge,playerStartPlayback:Ae,playlistsAddItem:xe,playlistsCreate:Ee,playlistsGet:we,playlistsGetUserPlaylists:Ie,playlistsGetTracks:ve,playlistsRemoveItem:_e,playlistsSearch:je,tracksGet:Ce,tracksGetAudioFeatures:Oe,tracksSearch:ze};var G={get:C,getNewReleases:O,getTracks:z,search:L},P={get:F,getAlbums:N,getRelatedArtists:q,getTopTracks:U,search:W},lt={getLikedTracks:D},yt={getFollowedArtists:M},d={addToQueue:V,getCurrentlyPlaying:B,getRecentlyPlayed:K,pause:$,resume:Y,setVolume:J,skipToNext:Q,skipToPrevious:H,startPlayback:X},S={addItem:Z,create:tt,get:et,getTracks:st,getUserPlaylists:ot,removeItem:rt,search:at},E={get:it,getAudioFeatures:nt,search:pt};var ct={RATE_LIMIT_ERROR:{match:(o,e)=>{if(o instanceof h&&o.status===429)return!0;let r=o.message.toLowerCase();return r.includes("rate_limited")||r.includes("ratelimited")||r.includes("too_many_requests")||o.message.includes("429")},handler:async(o,e)=>{let r;return o instanceof h&&o.retryAfter!==void 0&&(r=o.retryAfter),{maxRetries:3,headersRetryAfterMs:r}}},AUTH_ERROR:{match:(o,e)=>{if(o instanceof h&&o.status===401)return!0;let r=o.message.toLowerCase();return r.includes("invalid_auth")||r.includes("unauthorized")||r.includes("authentication failed")||r.includes("invalid_token")||r.includes("token_expired")||r.includes("invalid_grant")},handler:async(o,e)=>(console.log(`[SPOTIFY:${e.operation}] Authentication failed - check your access token`),{maxRetries:0})},PERMISSION_ERROR:{match:(o,e)=>{if(o instanceof h&&o.status===403)return!0;let r=o.message.toLowerCase();return r.includes("permission_denied")||r.includes("forbidden")||r.includes("access_denied")||r.includes("insufficient_permissions")||r.includes("insufficient_scope")},handler:async(o,e)=>(console.warn(`[SPOTIFY:${e.operation}] Permission denied: ${o.message}`),{maxRetries:0})},DEFAULT:{match:(o,e)=>!0,handler:async(o,e)=>(console.error(`[SPOTIFY:${e.operation}] Unhandled error: ${o.message}`),{maxRetries:0})}};import{z as s}from"zod";var ut=s.object({id:s.string(),name:s.string(),artists:s.array(s.object({id:s.string(),name:s.string()})).optional(),album:s.object({id:s.string(),name:s.string(),album_type:s.string().optional(),artists:s.array(s.object({id:s.string(),name:s.string(),external_urls:s.object({spotify:s.string().optional()}).optional()})).optional(),images:s.array(s.object({url:s.string(),height:s.number().nullable().optional(),width:s.number().nullable().optional()})).optional(),external_urls:s.object({spotify:s.string().optional()}).optional(),href:s.string().optional(),total_tracks:s.number().optional(),available_markets:s.array(s.string()).optional(),release_date:s.string().optional(),release_date_precision:s.string().optional()}).optional(),duration_ms:s.number().optional(),explicit:s.boolean().optional(),external_urls:s.object({spotify:s.string().optional()}).optional(),href:s.string().optional(),is_local:s.boolean().optional(),popularity:s.number().optional(),preview_url:s.string().nullable().optional(),track_number:s.number().optional(),createdAt:s.coerce.date().nullable().optional()}),mt=s.object({id:s.string(),name:s.string(),album_type:s.string().optional(),total_tracks:s.number().optional(),available_markets:s.array(s.string()).optional(),external_urls:s.object({spotify:s.string().optional()}).optional(),href:s.string().optional(),images:s.array(s.object({url:s.string(),height:s.number().nullable().optional(),width:s.number().nullable().optional()})).optional(),release_date:s.string().optional(),release_date_precision:s.string().optional(),artists:s.array(s.object({id:s.string(),name:s.string(),external_urls:s.object({spotify:s.string().optional()}).optional()})).optional(),createdAt:s.coerce.date().nullable().optional()}),dt=s.object({id:s.string(),name:s.string(),external_urls:s.object({spotify:s.string().optional()}).optional(),followers:s.object({total:s.number().optional()}).optional(),genres:s.array(s.string()).optional(),href:s.string().optional(),images:s.array(s.object({url:s.string(),height:s.number().nullable().optional(),width:s.number().nullable().optional()})).optional(),popularity:s.number().optional(),createdAt:s.coerce.date().nullable().optional()}),ft=s.object({id:s.string(),name:s.string(),description:s.string().nullable().optional(),public:s.boolean().optional(),collaborative:s.boolean().optional(),owner:s.object({id:s.string(),display_name:s.string().optional(),external_urls:s.object({spotify:s.string().optional()}).optional()}).optional(),followers:s.object({total:s.number().optional()}).optional(),images:s.array(s.object({url:s.string(),height:s.number().nullable().optional(),width:s.number().nullable().optional()})).optional(),tracks:s.object({href:s.string().optional(),total:s.number().optional()}).optional(),external_urls:s.object({spotify:s.string().optional()}).optional(),href:s.string().optional(),createdAt:s.coerce.date().nullable().optional()}),bt=s.object({id:s.string(),playlist_id:s.string(),track_id:s.string().optional(),added_at:s.string().optional(),added_by:s.object({id:s.string().optional()}).optional(),is_local:s.boolean().optional(),position:s.number().optional(),createdAt:s.coerce.date().nullable().optional()}),gt=s.object({id:s.string(),display_name:s.string().optional(),external_urls:s.object({spotify:s.string().optional()}).optional(),followers:s.object({total:s.number().optional()}).optional(),href:s.string().optional(),images:s.array(s.object({url:s.string(),height:s.number().nullable().optional(),width:s.number().nullable().optional()})).optional(),product:s.string().optional(),type:s.string().optional(),uri:s.string().optional(),createdAt:s.coerce.date().nullable().optional()});var St={version:"1.0.0",entities:{tracks:ut,albums:mt,artists:dt,playlists:ft,playlistItems:bt,users:gt}};import{z as b}from"zod";var Le=b.object({type:b.string(),created_at:b.string(),data:b.record(b.unknown())}),w=Le.extend({type:b.literal("example"),data:b.object({id:b.string()}).catchall(b.unknown())});function Fe(o){return typeof o=="string"?JSON.parse(o):o}function kt(o){return e=>{let r=Fe(e.body);return typeof r.type=="string"&&r.type===o}}function ht(o,e){if(!e)return{valid:!0};let r=o.headers["x-spotify-signature"],a=typeof r=="string"?r:Array.isArray(r)?r[0]:void 0;if(!a)return{valid:!1,error:"Missing signature header"};let y=o.rawBody||(typeof o.payload=="string"?o.payload:JSON.stringify(o.payload));try{let m=Tt("crypto"),c=m.createHmac("sha256",e).update(y).digest("hex"),k=m.timingSafeEqual(Buffer.from(a),Buffer.from(c));return{valid:k,error:k?void 0:"Invalid signature"}}catch{return{valid:!1,error:"Signature verification failed"}}}var Pt={match:kt("example"),handler:async(o,e)=>{let r=o.key,a=ht(e,r);if(!a.valid)return{success:!1,statusCode:401,error:a.error||"Signature verification failed"};let y=e.payload;return y.type!=="example"?{success:!0,data:void 0}:(console.log("\u{1F4E6} Spotify Example Event:",{id:y.data.id}),await i(o,"spotify.webhook.example",{...y},"completed"),{success:!0,data:y})}};var Rt={example:Pt};var Ne={albums:{get:G.get,getNewReleases:G.getNewReleases,getTracks:G.getTracks,search:G.search},artists:{get:P.get,getAlbums:P.getAlbums,getRelatedArtists:P.getRelatedArtists,getTopTracks:P.getTopTracks,search:P.search},library:{getLikedTracks:lt.getLikedTracks},myData:{getFollowedArtists:yt.getFollowedArtists},player:{addToQueue:d.addToQueue,getCurrentlyPlaying:d.getCurrentlyPlaying,getRecentlyPlayed:d.getRecentlyPlayed,pause:d.pause,resume:d.resume,setVolume:d.setVolume,skipToNext:d.skipToNext,skipToPrevious:d.skipToPrevious,startPlayback:d.startPlayback},playlists:{addItem:S.addItem,create:S.create,get:S.get,getTracks:S.getTracks,getUserPlaylists:S.getUserPlaylists,removeItem:S.removeItem,search:S.search},tracks:{get:E.get,getAudioFeatures:E.getAudioFeatures,search:E.search}},qe={"albums.get":{input:p.albumsGet,output:l.albumsGet},"albums.getNewReleases":{input:p.albumsGetNewReleases,output:l.albumsGetNewReleases},"albums.getTracks":{input:p.albumsGetTracks,output:l.albumsGetTracks},"albums.search":{input:p.albumsSearch,output:l.albumsSearch},"artists.get":{input:p.artistsGet,output:l.artistsGet},"artists.getAlbums":{input:p.artistsGetAlbums,output:l.artistsGetAlbums},"artists.getRelatedArtists":{input:p.artistsGetRelatedArtists,output:l.artistsGetRelatedArtists},"artists.getTopTracks":{input:p.artistsGetTopTracks,output:l.artistsGetTopTracks},"artists.search":{input:p.artistsSearch,output:l.artistsSearch},"library.getLikedTracks":{input:p.libraryGetLikedTracks,output:l.libraryGetLikedTracks},"myData.getFollowedArtists":{input:p.myDataGetFollowedArtists,output:l.myDataGetFollowedArtists},"player.addToQueue":{input:p.playerAddToQueue,output:l.playerAddToQueue},"player.getCurrentlyPlaying":{input:p.playerGetCurrentlyPlaying,output:l.playerGetCurrentlyPlaying},"player.getRecentlyPlayed":{input:p.playerGetRecentlyPlayed,output:l.playerGetRecentlyPlayed},"player.pause":{input:p.playerPause,output:l.playerPause},"player.resume":{input:p.playerResume,output:l.playerResume},"player.setVolume":{input:p.playerSetVolume,output:l.playerSetVolume},"player.skipToNext":{input:p.playerSkipToNext,output:l.playerSkipToNext},"player.skipToPrevious":{input:p.playerSkipToPrevious,output:l.playerSkipToPrevious},"player.startPlayback":{input:p.playerStartPlayback,output:l.playerStartPlayback},"playlists.addItem":{input:p.playlistsAddItem,output:l.playlistsAddItem},"playlists.create":{input:p.playlistsCreate,output:l.playlistsCreate},"playlists.get":{input:p.playlistsGet,output:l.playlistsGet},"playlists.getTracks":{input:p.playlistsGetTracks,output:l.playlistsGetTracks},"playlists.getUserPlaylists":{input:p.playlistsGetUserPlaylists,output:l.playlistsGetUserPlaylists},"playlists.removeItem":{input:p.playlistsRemoveItem,output:l.playlistsRemoveItem},"playlists.search":{input:p.playlistsSearch,output:l.playlistsSearch},"tracks.get":{input:p.tracksGet,output:l.tracksGet},"tracks.getAudioFeatures":{input:p.tracksGetAudioFeatures,output:l.tracksGetAudioFeatures},"tracks.search":{input:p.tracksSearch,output:l.tracksSearch}},Ue={example:{example:Rt.example}},We={"example.example":{description:"An example Spotify webhook event",payload:w,response:w}},De="oauth_2",Me={"albums.get":{riskLevel:"read",description:"Get info about an album"},"albums.getNewReleases":{riskLevel:"read",description:"Get new album releases"},"albums.getTracks":{riskLevel:"read",description:"Get tracks from an album"},"albums.search":{riskLevel:"read",description:"Search for albums"},"artists.get":{riskLevel:"read",description:"Get info about an artist"},"artists.getAlbums":{riskLevel:"read",description:"Get albums by an artist"},"artists.getRelatedArtists":{riskLevel:"read",description:"Get artists related to an artist"},"artists.getTopTracks":{riskLevel:"read",description:"Get top tracks for an artist"},"artists.search":{riskLevel:"read",description:"Search for artists"},"library.getLikedTracks":{riskLevel:"read",description:"Get the current user's liked tracks"},"myData.getFollowedArtists":{riskLevel:"read",description:"Get artists followed by the current user"},"player.addToQueue":{riskLevel:"write",description:"Add a track to the playback queue"},"player.getCurrentlyPlaying":{riskLevel:"read",description:"Get the currently playing track"},"player.getRecentlyPlayed":{riskLevel:"read",description:"Get recently played tracks"},"player.pause":{riskLevel:"write",description:"Pause playback"},"player.resume":{riskLevel:"write",description:"Resume playback"},"player.setVolume":{riskLevel:"write",description:"Set the playback volume"},"player.skipToNext":{riskLevel:"write",description:"Skip to the next track"},"player.skipToPrevious":{riskLevel:"write",description:"Skip to the previous track"},"player.startPlayback":{riskLevel:"write",description:"Start playback of specified content"},"playlists.addItem":{riskLevel:"write",description:"Add a track to a playlist"},"playlists.create":{riskLevel:"write",description:"Create a new playlist"},"playlists.get":{riskLevel:"read",description:"Get info about a playlist"},"playlists.getTracks":{riskLevel:"read",description:"Get tracks in a playlist"},"playlists.getUserPlaylists":{riskLevel:"read",description:"Get the current user's playlists"},"playlists.removeItem":{riskLevel:"write",description:"Remove a track from a playlist"},"playlists.search":{riskLevel:"read",description:"Search for playlists"},"tracks.get":{riskLevel:"read",description:"Get info about a track"},"tracks.getAudioFeatures":{riskLevel:"read",description:"Get audio features for a track"},"tracks.search":{riskLevel:"read",description:"Search for tracks"}};function $o(o={}){let e={...o,authType:o.authType??De};return{id:"spotify",schema:St,options:e,oauthConfig:{providerName:"Spotify",authUrl:"https://accounts.spotify.com/authorize",tokenUrl:"https://accounts.spotify.com/api/token",scopes:["user-read-private","user-read-email","user-read-playback-state","user-modify-playback-state","user-read-currently-playing","user-read-recently-played","user-library-read","user-library-modify","user-follow-read","user-follow-modify","playlist-read-private","playlist-read-collaborative","playlist-modify-public","playlist-modify-private"],tokenAuthMethod:"basic",requiresRegisteredRedirect:!0,authParams:{show_dialog:"true"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:Ne,webhooks:Ue,endpointMeta:Me,endpointSchemas:qe,webhookSchemas:We,pluginWebhookMatcher:r=>{let a=r.headers;return"x-spotify-signature"in a||"spotify-webhook"in a},errorHandlers:{...ct,...e.errorHandlers},keyBuilder:async(r,a)=>{if(a==="webhook"&&e.webhookSecret)return e.webhookSecret;if(a==="webhook"){let y=await r.keys.get_webhook_signature();return y||""}if(a==="endpoint"&&e.key)return e.key;if(a==="endpoint"&&r.authType==="oauth_2"){let y=await r.keys.get_access_token(),m=await r.keys.get_refresh_token();if(!m)throw new Error("No refresh token. Cannot get access token.");let c=await r.keys.get_integration_credentials();if(!c.client_id||!c.client_secret)throw new Error("No client id or client secret");let k=await j({accessToken:y,refreshToken:m,clientId:c.client_id,clientSecret:c.client_secret});if(!k)throw new Error("Access token cannot be created.");return k}return""}}}export{$o as spotify,qe as spotifyEndpointSchemas};
|
|
1
|
+
import{a as i,b as k,c as _}from"../../chunk-BZ3WPT6I.js";import"../../chunk-A7CRE5AE.js";import{a as Gt}from"../../chunk-476ZUILE.js";var f=class extends Error{constructor(s,a,y){super(s);this.code=a;this.status=y;this.name="SpotifyAPIError"}},At="https://api.spotify.com/v1",xt={enabled:!0,maxRetries:3,initialRetryDelay:1e3,backoffMultiplier:2,headerNames:{retryAfter:"Retry-After"}},R=null,j=0;async function Et(o,e,s){let a=await fetch("https://accounts.spotify.com/api/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:s,client_id:o,client_secret:e})});if(!a.ok){let y=await a.text();throw new f(`Failed to refresh access token: ${y}`,void 0,a.status)}return await a.json()}async function w({accessToken:o,clientId:e,clientSecret:s,refreshToken:a}){let y=Date.now(),d=300*1e3;if(R&&j>y+d&&R===o)return R;try{let u=await Et(e,s,a);return R=u.access_token,j=y+u.expires_in*1e3,R}catch(u){if(u instanceof f)throw u;return o||void 0}}async function C(o,e,s={}){let{method:a="GET",body:y,query:d}=s,u={BASE:At,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}},m={method:a,url:o,body:a==="POST"||a==="PUT"||a==="PATCH"?y:void 0,mediaType:"application/json; charset=utf-8",query:a==="GET"?d:void 0};try{let c=await _(u,m,{rateLimitConfig:xt});if(c&&typeof c=="object"&&"error"in c&&c.error){let v=c.error;throw new f(v.message||"Spotify API error",void 0,v.status)}return c}catch(c){throw c instanceof k?new f(c.message,void 0,c.status):c instanceof f?c:c instanceof Error?new f(c.message):new f("Unknown error")}}function wt(o){return o instanceof Error&&"status"in o&&o.status===401||o instanceof f&&o.status===401}async function n(o,e,s={}){try{return await C(o,e.key,s)}catch(a){if(wt(a)&&e._refreshAuth){let y=await e._refreshAuth();return await C(o,y,s)}throw a}}var O=async(o,e)=>{let s={};e.market&&(s.market=e.market);let a=await n(`albums/${e.id}`,o,{method:"GET",query:s});if(a&&o.db.albums)try{await o.db.albums.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save album to database:",y)}return await i(o,"spotify.albums.get",{...e},"completed"),a},z=async(o,e)=>{let s={...e},a=await n("browse/new-releases",o,{method:"GET",query:s});return await i(o,"spotify.albums.getNewReleases",{...e},"completed"),a},L=async(o,e)=>{let s={...e},a=await n(`albums/${e.id}/tracks`,o,{method:"GET",query:s});return await i(o,"spotify.albums.getTracks",{...e},"completed"),a},F=async(o,e)=>{let s={q:e.q,type:e.type||"album"};e.market&&(s.market=e.market),e.limit&&(s.limit=e.limit),e.offset&&(s.offset=e.offset);let a=await n("search",o,{method:"GET",query:s});return await i(o,"spotify.albums.search",{...e},"completed"),a};var N=async(o,e)=>{let s=await n(`artists/${e.id}`,o,{method:"GET"});if(s&&o.db.artists)try{await o.db.artists.upsertByEntityId(s.id,{...s})}catch(a){console.warn("Failed to save artist to database:",a)}return await i(o,"spotify.artists.get",{...e},"completed"),s},q=async(o,e)=>{let s={...e},a=await n(`artists/${e.id}/albums`,o,{method:"GET",query:s});return await i(o,"spotify.artists.getAlbums",{...e},"completed"),a},U=async(o,e)=>{let s=await n(`artists/${e.id}/related-artists`,o,{method:"GET"});return await i(o,"spotify.artists.getRelatedArtists",{...e},"completed"),s},W=async(o,e)=>{let s={...e},a=await n(`artists/${e.id}/top-tracks`,o,{method:"GET",query:s});return await i(o,"spotify.artists.getTopTracks",{...e},"completed"),a},D=async(o,e)=>{let s={...e},a=await n("search",o,{method:"GET",query:s});return await i(o,"spotify.artists.search",{...e},"completed"),a};var M=async(o,e)=>{let s={...e},a=await n("me/tracks",o,{method:"GET",query:s});return await i(o,"spotify.library.getLikedTracks",{...e},"completed"),a};var V=async(o,e)=>{let s={type:e.type||"artist"};e.limit&&(s.limit=e.limit),e.after&&(s.after=e.after);let a=await n("me/following",o,{method:"GET",query:s});return await i(o,"spotify.myData.getFollowedArtists",{...e},"completed"),a};var B=async(o,e)=>{let s={uri:e.uri};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/queue",o,{method:"POST",query:s});return await i(o,"spotify.player.addToQueue",{...e},"completed"),a},Q=async(o,e)=>{let s={};e.market&&(s.market=e.market),e.additional_types&&(s.additional_types=e.additional_types);let a=await n("me/player/currently-playing",o,{method:"GET",query:s});return await i(o,"spotify.player.getCurrentlyPlaying",{...e},"completed"),a},$=async(o,e)=>{let s={};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/next",o,{method:"POST",query:s});return await i(o,"spotify.player.skipToNext",{...e},"completed"),a},H=async(o,e)=>{let s={};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/pause",o,{method:"PUT",query:s});return await i(o,"spotify.player.pause",{...e},"completed"),a},K=async(o,e)=>{let s={};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/previous",o,{method:"POST",query:s});return await i(o,"spotify.player.skipToPrevious",{...e},"completed"),a},Y=async(o,e)=>{let s={};e.limit&&(s.limit=e.limit),e.after&&(s.after=e.after),e.before&&(s.before=e.before);let a=await n("me/player/recently-played",o,{method:"GET",query:s});return await i(o,"spotify.player.getRecentlyPlayed",{...e},"completed"),a},J=async(o,e)=>{let s={};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/play",o,{method:"PUT",query:s});return await i(o,"spotify.player.resume",{...e},"completed"),a},X=async(o,e)=>{let s={volume_percent:e.volume_percent};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/volume",o,{method:"PUT",query:s});return await i(o,"spotify.player.setVolume",{...e},"completed"),a},Z=async(o,e)=>{let s={};e.device_id&&(s.device_id=e.device_id);let a=await n("me/player/play",o,{method:"PUT",query:s,body:e});return await i(o,"spotify.player.startPlayback",{...e},"completed"),a};var tt=async(o,e)=>{let s={};e.position!==void 0&&(s.position=e.position);let a=await n(`playlists/${e.playlist_id}/tracks`,o,{method:"POST",query:s,body:{uris:e.uris}});return await i(o,"spotify.playlists.addItem",{...e},"completed"),a},et=async(o,e)=>{let s=await n(`users/${e.user_id}/playlists`,o,{method:"POST",body:e});if(s&&o.db.playlists)try{await o.db.playlists.upsertByEntityId(s.id,{...s})}catch(a){console.warn("Failed to save playlist to database:",a)}return await i(o,"spotify.playlists.create",{...e},"completed"),s},ot=async(o,e)=>{let s={...e},a=await n(`playlists/${e.playlist_id}`,o,{method:"GET",query:s});if(a&&o.db.playlists)try{await o.db.playlists.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save playlist to database:",y)}return await i(o,"spotify.playlists.get",{...e},"completed"),a},st=async(o,e)=>{let s=e.user_id||"me",a={...e},y=await n(`users/${s}/playlists`,o,{method:"GET",query:a});return await i(o,"spotify.playlists.getUserPlaylists",{...e},"completed"),y},rt=async(o,e)=>{let s={...e},a=await n(`playlists/${e.playlist_id}/tracks`,o,{method:"GET",query:s});return await i(o,"spotify.playlists.getTracks",{...e},"completed"),a},at=async(o,e)=>{let s=await n(`playlists/${e.playlist_id}/tracks`,o,{method:"DELETE",body:e});return await i(o,"spotify.playlists.removeItem",{...e},"completed"),s},it=async(o,e)=>{let s={...e},a=await n("search",o,{method:"GET",query:s});return await i(o,"spotify.playlists.search",{...e},"completed"),a};var nt=async(o,e)=>{let s={...e},a=await n(`tracks/${e.id}`,o,{method:"GET",query:s});if(a&&o.db.tracks)try{await o.db.tracks.upsertByEntityId(a.id,{...a})}catch(y){console.warn("Failed to save track to database:",y)}return await i(o,"spotify.tracks.get",{...e},"completed"),a},pt=async(o,e)=>{let s=await n(`audio-features/${e.id}`,o,{method:"GET"});return await i(o,"spotify.tracks.getAudioFeatures",{...e},"completed"),s},lt=async(o,e)=>{let s={...e},a=await n("search",o,{method:"GET",query:s});return await i(o,"spotify.tracks.search",{...e},"completed"),a};import{z as t}from"zod";var T=t.object({id:t.string(),name:t.string(),album_type:t.string(),total_tracks:t.number().optional(),available_markets:t.array(t.string()).optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),release_date:t.string().optional(),release_date_precision:t.string().optional(),artists:t.array(t.object({id:t.string(),name:t.string(),external_urls:t.object({spotify:t.string().optional()}).optional()})).optional()}),A=t.object({id:t.string(),name:t.string(),external_urls:t.object({spotify:t.string().optional()}).optional(),followers:t.object({total:t.number().optional()}).optional(),genres:t.array(t.string()).optional(),href:t.string().optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),popularity:t.number().optional()}),S=t.object({id:t.string(),name:t.string(),artists:t.array(t.object({id:t.string(),name:t.string()})).optional(),album:T.optional(),duration_ms:t.number().optional(),explicit:t.boolean().optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),is_local:t.boolean().optional(),popularity:t.number().optional(),preview_url:t.string().nullable().optional(),track_number:t.number().optional()}),x=t.object({id:t.string(),name:t.string(),description:t.string().nullable().optional(),public:t.boolean().optional(),collaborative:t.boolean().optional(),owner:t.object({id:t.string(),display_name:t.string().optional(),external_urls:t.object({spotify:t.string().optional()}).optional()}).optional(),followers:t.object({total:t.number().optional()}).optional(),images:t.array(t.object({url:t.string(),height:t.number().nullable().optional(),width:t.number().nullable().optional()})).optional(),tracks:t.object({href:t.string().optional(),total:t.number().optional()}).optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional()}),It=t.object({added_at:t.string().optional(),added_by:t.object({id:t.string().optional()}).optional(),is_local:t.boolean().optional(),track:S.optional()}),vt=t.object({id:t.string(),danceability:t.number().optional(),energy:t.number().optional(),key:t.number().optional(),loudness:t.number().optional(),mode:t.number().optional(),speechiness:t.number().optional(),acousticness:t.number().optional(),instrumentalness:t.number().optional(),liveness:t.number().optional(),valence:t.number().optional(),tempo:t.number().optional(),duration_ms:t.number().optional(),time_signature:t.number().optional()}),_t=t.object({timestamp:t.number().optional(),context:t.object({external_urls:t.object({spotify:t.string().optional()}).optional(),href:t.string().optional(),type:t.string().optional(),uri:t.string().optional()}).optional(),progress_ms:t.number().optional(),is_playing:t.boolean().optional(),item:S.optional(),currently_playing_type:t.string().optional(),actions:t.object({disallows:t.object({resuming:t.boolean().optional()}).optional()}).optional()}),jt=t.object({id:t.string(),market:t.string().optional()}),Ct=t.object({limit:t.number().optional(),offset:t.number().optional(),country:t.string().optional()}),Ot=t.object({id:t.string(),limit:t.number().optional(),offset:t.number().optional(),market:t.string().optional()}),zt=t.object({q:t.string(),type:t.literal("album").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),Lt=t.object({id:t.string()}),Ft=t.object({id:t.string(),include_groups:t.string().optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),Nt=t.object({id:t.string()}),qt=t.object({id:t.string(),market:t.string().optional()}),Ut=t.object({q:t.string(),type:t.literal("artist").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),Wt=t.object({limit:t.number().optional(),offset:t.number().optional(),market:t.string().optional()}),Dt=t.object({type:t.literal("artist").optional(),limit:t.number().optional(),after:t.string().optional()}),Mt=t.object({uri:t.string(),device_id:t.string().optional()}),Vt=t.object({market:t.string().optional(),additional_types:t.string().optional()}),Bt=t.object({device_id:t.string().optional()}),Qt=t.object({device_id:t.string().optional()}),$t=t.object({device_id:t.string().optional()}),Ht=t.object({limit:t.number().optional(),after:t.number().optional(),before:t.number().optional()}),Kt=t.object({device_id:t.string().optional()}),Yt=t.object({volume_percent:t.number(),device_id:t.string().optional()}),Jt=t.object({device_id:t.string().optional(),context_uri:t.string().optional(),uris:t.array(t.string()).optional(),offset:t.object({position:t.number().optional(),uri:t.string().optional()}).optional(),position_ms:t.number().optional()}),Xt=t.object({playlist_id:t.string(),uris:t.array(t.string()),position:t.number().optional()}),Zt=t.object({user_id:t.string(),name:t.string(),public:t.boolean().optional(),collaborative:t.boolean().optional(),description:t.string().optional()}),te=t.object({playlist_id:t.string(),market:t.string().optional(),fields:t.string().optional(),additional_types:t.string().optional()}),ee=t.object({user_id:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),oe=t.object({playlist_id:t.string(),market:t.string().optional(),fields:t.string().optional(),limit:t.number().optional(),offset:t.number().optional(),additional_types:t.string().optional()}),se=t.object({playlist_id:t.string(),tracks:t.array(t.object({uri:t.string()})),snapshot_id:t.string().optional()}),re=t.object({q:t.string(),type:t.literal("playlist").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),ae=t.object({id:t.string(),market:t.string().optional()}),ie=t.object({id:t.string()}),ne=t.object({q:t.string(),type:t.literal("track").optional(),market:t.string().optional(),limit:t.number().optional(),offset:t.number().optional()}),p={albumsGet:jt,albumsGetNewReleases:Ct,albumsGetTracks:Ot,albumsSearch:zt,artistsGet:Lt,artistsGetAlbums:Ft,artistsGetRelatedArtists:Nt,artistsGetTopTracks:qt,artistsSearch:Ut,libraryGetLikedTracks:Wt,myDataGetFollowedArtists:Dt,playerAddToQueue:Mt,playerGetCurrentlyPlaying:Vt,playerSkipToNext:Bt,playerPause:Qt,playerSkipToPrevious:$t,playerGetRecentlyPlayed:Ht,playerResume:Kt,playerSetVolume:Yt,playerStartPlayback:Jt,playlistsAddItem:Xt,playlistsCreate:Zt,playlistsGet:te,playlistsGetUserPlaylists:ee,playlistsGetTracks:oe,playlistsRemoveItem:se,playlistsSearch:re,tracksGet:ae,tracksGetAudioFeatures:ie,tracksSearch:ne},pe=T,le=t.object({albums:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()})}),ye=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(S).optional()}),ce=t.object({albums:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()})}),ue=A,de=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(T).optional()}),me=t.object({artists:t.array(A).optional()}),fe=t.object({tracks:t.array(S).optional()}),be=t.object({artists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(A).optional()})}),ge=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(t.object({added_at:t.string().optional(),track:S.optional()})).optional()}),Se=t.object({artists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),cursors:t.object({after:t.string().nullable().optional()}).optional(),total:t.number().optional(),items:t.array(A).optional()})}),he=t.object({}),ke=_t.nullable().optional(),Pe=t.object({}),Re=t.object({}),Te=t.object({}),Ge=t.object({items:t.array(t.object({track:S.optional(),played_at:t.string().optional(),context:t.object({type:t.string().optional(),href:t.string().optional(),external_urls:t.object({spotify:t.string().optional()}).optional(),uri:t.string().optional()}).nullable().optional()})).optional(),next:t.string().nullable().optional(),cursors:t.object({after:t.string().optional(),before:t.string().optional()}).optional(),limit:t.number().optional()}),Ae=t.object({}),xe=t.object({}),Ee=t.object({}),we=t.object({snapshot_id:t.string().optional()}),Ie=x,ve=x,_e=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(x.nullable()).optional()}),je=t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(It).optional()}),Ce=t.object({snapshot_id:t.string().optional()}),Oe=t.object({playlists:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(x.nullable()).optional()})}),ze=S,Le=vt,Fe=t.object({tracks:t.object({href:t.string().optional(),limit:t.number().optional(),next:t.string().nullable().optional(),offset:t.number().optional(),previous:t.string().nullable().optional(),total:t.number().optional(),items:t.array(S).optional()})}),l={albumsGet:pe,albumsGetNewReleases:le,albumsGetTracks:ye,albumsSearch:ce,artistsGet:ue,artistsGetAlbums:de,artistsGetRelatedArtists:me,artistsGetTopTracks:fe,artistsSearch:be,libraryGetLikedTracks:ge,myDataGetFollowedArtists:Se,playerAddToQueue:he,playerGetCurrentlyPlaying:ke,playerSkipToNext:Pe,playerPause:Re,playerSkipToPrevious:Te,playerGetRecentlyPlayed:Ge,playerResume:Ae,playerSetVolume:xe,playerStartPlayback:Ee,playlistsAddItem:we,playlistsCreate:Ie,playlistsGet:ve,playlistsGetUserPlaylists:_e,playlistsGetTracks:je,playlistsRemoveItem:Ce,playlistsSearch:Oe,tracksGet:ze,tracksGetAudioFeatures:Le,tracksSearch:Fe};var G={get:O,getNewReleases:z,getTracks:L,search:F},P={get:N,getAlbums:q,getRelatedArtists:U,getTopTracks:W,search:D},yt={getLikedTracks:M},ct={getFollowedArtists:V},b={addToQueue:B,getCurrentlyPlaying:Q,getRecentlyPlayed:Y,pause:H,resume:J,setVolume:X,skipToNext:$,skipToPrevious:K,startPlayback:Z},h={addItem:tt,create:et,get:ot,getTracks:rt,getUserPlaylists:st,removeItem:at,search:it},E={get:nt,getAudioFeatures:pt,search:lt};var ut={RATE_LIMIT_ERROR:{match:(o,e)=>{if(o instanceof k&&o.status===429)return!0;let s=o.message.toLowerCase();return s.includes("rate_limited")||s.includes("ratelimited")||s.includes("too_many_requests")||o.message.includes("429")},handler:async(o,e)=>{let s;return o instanceof k&&o.retryAfter!==void 0&&(s=o.retryAfter),{maxRetries:3,headersRetryAfterMs:s}}},AUTH_ERROR:{match:(o,e)=>{if(o instanceof k&&o.status===401)return!0;let s=o.message.toLowerCase();return s.includes("invalid_auth")||s.includes("unauthorized")||s.includes("authentication failed")||s.includes("invalid_token")||s.includes("token_expired")||s.includes("invalid_grant")},handler:async(o,e)=>(console.log(`[SPOTIFY:${e.operation}] Authentication failed - check your access token`),{maxRetries:0})},PERMISSION_ERROR:{match:(o,e)=>{if(o instanceof k&&o.status===403)return!0;let s=o.message.toLowerCase();return s.includes("permission_denied")||s.includes("forbidden")||s.includes("access_denied")||s.includes("insufficient_permissions")||s.includes("insufficient_scope")},handler:async(o,e)=>(console.warn(`[SPOTIFY:${e.operation}] Permission denied: ${o.message}`),{maxRetries:0})},DEFAULT:{match:(o,e)=>!0,handler:async(o,e)=>(console.error(`[SPOTIFY:${e.operation}] Unhandled error: ${o.message}`),{maxRetries:0})}};import{z as r}from"zod";var dt=r.object({id:r.string(),name:r.string(),artists:r.array(r.object({id:r.string(),name:r.string()})).optional(),album:r.object({id:r.string(),name:r.string(),album_type:r.string().optional(),artists:r.array(r.object({id:r.string(),name:r.string(),external_urls:r.object({spotify:r.string().optional()}).optional()})).optional(),images:r.array(r.object({url:r.string(),height:r.number().nullable().optional(),width:r.number().nullable().optional()})).optional(),external_urls:r.object({spotify:r.string().optional()}).optional(),href:r.string().optional(),total_tracks:r.number().optional(),available_markets:r.array(r.string()).optional(),release_date:r.string().optional(),release_date_precision:r.string().optional()}).optional(),duration_ms:r.number().optional(),explicit:r.boolean().optional(),external_urls:r.object({spotify:r.string().optional()}).optional(),href:r.string().optional(),is_local:r.boolean().optional(),popularity:r.number().optional(),preview_url:r.string().nullable().optional(),track_number:r.number().optional(),createdAt:r.coerce.date().nullable().optional()}),mt=r.object({id:r.string(),name:r.string(),album_type:r.string().optional(),total_tracks:r.number().optional(),available_markets:r.array(r.string()).optional(),external_urls:r.object({spotify:r.string().optional()}).optional(),href:r.string().optional(),images:r.array(r.object({url:r.string(),height:r.number().nullable().optional(),width:r.number().nullable().optional()})).optional(),release_date:r.string().optional(),release_date_precision:r.string().optional(),artists:r.array(r.object({id:r.string(),name:r.string(),external_urls:r.object({spotify:r.string().optional()}).optional()})).optional(),createdAt:r.coerce.date().nullable().optional()}),ft=r.object({id:r.string(),name:r.string(),external_urls:r.object({spotify:r.string().optional()}).optional(),followers:r.object({total:r.number().optional()}).optional(),genres:r.array(r.string()).optional(),href:r.string().optional(),images:r.array(r.object({url:r.string(),height:r.number().nullable().optional(),width:r.number().nullable().optional()})).optional(),popularity:r.number().optional(),createdAt:r.coerce.date().nullable().optional()}),bt=r.object({id:r.string(),name:r.string(),description:r.string().nullable().optional(),public:r.boolean().optional(),collaborative:r.boolean().optional(),owner:r.object({id:r.string(),display_name:r.string().optional(),external_urls:r.object({spotify:r.string().optional()}).optional()}).optional(),followers:r.object({total:r.number().optional()}).optional(),images:r.array(r.object({url:r.string(),height:r.number().nullable().optional(),width:r.number().nullable().optional()})).optional(),tracks:r.object({href:r.string().optional(),total:r.number().optional()}).optional(),external_urls:r.object({spotify:r.string().optional()}).optional(),href:r.string().optional(),createdAt:r.coerce.date().nullable().optional()}),gt=r.object({id:r.string(),playlist_id:r.string(),track_id:r.string().optional(),added_at:r.string().optional(),added_by:r.object({id:r.string().optional()}).optional(),is_local:r.boolean().optional(),position:r.number().optional(),createdAt:r.coerce.date().nullable().optional()}),St=r.object({id:r.string(),display_name:r.string().optional(),external_urls:r.object({spotify:r.string().optional()}).optional(),followers:r.object({total:r.number().optional()}).optional(),href:r.string().optional(),images:r.array(r.object({url:r.string(),height:r.number().nullable().optional(),width:r.number().nullable().optional()})).optional(),product:r.string().optional(),type:r.string().optional(),uri:r.string().optional(),createdAt:r.coerce.date().nullable().optional()});var ht={version:"1.0.0",entities:{tracks:dt,albums:mt,artists:ft,playlists:bt,playlistItems:gt,users:St}};import{z as g}from"zod";var Ne=g.object({type:g.string(),created_at:g.string(),data:g.record(g.unknown())}),I=Ne.extend({type:g.literal("example"),data:g.object({id:g.string()}).catchall(g.unknown())});function qe(o){return typeof o=="string"?JSON.parse(o):o}function kt(o){return e=>{let s=qe(e.body);return typeof s.type=="string"&&s.type===o}}function Pt(o,e){if(!e)return{valid:!0};let s=o.headers["x-spotify-signature"],a=typeof s=="string"?s:Array.isArray(s)?s[0]:void 0;if(!a)return{valid:!1,error:"Missing signature header"};let y=o.rawBody||(typeof o.payload=="string"?o.payload:JSON.stringify(o.payload));try{let d=Gt("crypto"),u=d.createHmac("sha256",e).update(y).digest("hex"),m=d.timingSafeEqual(Buffer.from(a),Buffer.from(u));return{valid:m,error:m?void 0:"Invalid signature"}}catch{return{valid:!1,error:"Signature verification failed"}}}var Rt={match:kt("example"),handler:async(o,e)=>{let s=o.key,a=Pt(e,s);if(!a.valid)return{success:!1,statusCode:401,error:a.error||"Signature verification failed"};let y=e.payload;return y.type!=="example"?{success:!0,data:void 0}:(console.log("\u{1F4E6} Spotify Example Event:",{id:y.data.id}),await i(o,"spotify.webhook.example",{...y},"completed"),{success:!0,data:y})}};var Tt={example:Rt};var Ue={albums:{get:G.get,getNewReleases:G.getNewReleases,getTracks:G.getTracks,search:G.search},artists:{get:P.get,getAlbums:P.getAlbums,getRelatedArtists:P.getRelatedArtists,getTopTracks:P.getTopTracks,search:P.search},library:{getLikedTracks:yt.getLikedTracks},myData:{getFollowedArtists:ct.getFollowedArtists},player:{addToQueue:b.addToQueue,getCurrentlyPlaying:b.getCurrentlyPlaying,getRecentlyPlayed:b.getRecentlyPlayed,pause:b.pause,resume:b.resume,setVolume:b.setVolume,skipToNext:b.skipToNext,skipToPrevious:b.skipToPrevious,startPlayback:b.startPlayback},playlists:{addItem:h.addItem,create:h.create,get:h.get,getTracks:h.getTracks,getUserPlaylists:h.getUserPlaylists,removeItem:h.removeItem,search:h.search},tracks:{get:E.get,getAudioFeatures:E.getAudioFeatures,search:E.search}},We={"albums.get":{input:p.albumsGet,output:l.albumsGet},"albums.getNewReleases":{input:p.albumsGetNewReleases,output:l.albumsGetNewReleases},"albums.getTracks":{input:p.albumsGetTracks,output:l.albumsGetTracks},"albums.search":{input:p.albumsSearch,output:l.albumsSearch},"artists.get":{input:p.artistsGet,output:l.artistsGet},"artists.getAlbums":{input:p.artistsGetAlbums,output:l.artistsGetAlbums},"artists.getRelatedArtists":{input:p.artistsGetRelatedArtists,output:l.artistsGetRelatedArtists},"artists.getTopTracks":{input:p.artistsGetTopTracks,output:l.artistsGetTopTracks},"artists.search":{input:p.artistsSearch,output:l.artistsSearch},"library.getLikedTracks":{input:p.libraryGetLikedTracks,output:l.libraryGetLikedTracks},"myData.getFollowedArtists":{input:p.myDataGetFollowedArtists,output:l.myDataGetFollowedArtists},"player.addToQueue":{input:p.playerAddToQueue,output:l.playerAddToQueue},"player.getCurrentlyPlaying":{input:p.playerGetCurrentlyPlaying,output:l.playerGetCurrentlyPlaying},"player.getRecentlyPlayed":{input:p.playerGetRecentlyPlayed,output:l.playerGetRecentlyPlayed},"player.pause":{input:p.playerPause,output:l.playerPause},"player.resume":{input:p.playerResume,output:l.playerResume},"player.setVolume":{input:p.playerSetVolume,output:l.playerSetVolume},"player.skipToNext":{input:p.playerSkipToNext,output:l.playerSkipToNext},"player.skipToPrevious":{input:p.playerSkipToPrevious,output:l.playerSkipToPrevious},"player.startPlayback":{input:p.playerStartPlayback,output:l.playerStartPlayback},"playlists.addItem":{input:p.playlistsAddItem,output:l.playlistsAddItem},"playlists.create":{input:p.playlistsCreate,output:l.playlistsCreate},"playlists.get":{input:p.playlistsGet,output:l.playlistsGet},"playlists.getTracks":{input:p.playlistsGetTracks,output:l.playlistsGetTracks},"playlists.getUserPlaylists":{input:p.playlistsGetUserPlaylists,output:l.playlistsGetUserPlaylists},"playlists.removeItem":{input:p.playlistsRemoveItem,output:l.playlistsRemoveItem},"playlists.search":{input:p.playlistsSearch,output:l.playlistsSearch},"tracks.get":{input:p.tracksGet,output:l.tracksGet},"tracks.getAudioFeatures":{input:p.tracksGetAudioFeatures,output:l.tracksGetAudioFeatures},"tracks.search":{input:p.tracksSearch,output:l.tracksSearch}},De={example:{example:Tt.example}},Me={"example.example":{description:"An example Spotify webhook event",payload:I,response:I}},Ve="oauth_2",Be={"albums.get":{riskLevel:"read",description:"Get info about an album"},"albums.getNewReleases":{riskLevel:"read",description:"Get new album releases"},"albums.getTracks":{riskLevel:"read",description:"Get tracks from an album"},"albums.search":{riskLevel:"read",description:"Search for albums"},"artists.get":{riskLevel:"read",description:"Get info about an artist"},"artists.getAlbums":{riskLevel:"read",description:"Get albums by an artist"},"artists.getRelatedArtists":{riskLevel:"read",description:"Get artists related to an artist"},"artists.getTopTracks":{riskLevel:"read",description:"Get top tracks for an artist"},"artists.search":{riskLevel:"read",description:"Search for artists"},"library.getLikedTracks":{riskLevel:"read",description:"Get the current user's liked tracks"},"myData.getFollowedArtists":{riskLevel:"read",description:"Get artists followed by the current user"},"player.addToQueue":{riskLevel:"write",description:"Add a track to the playback queue"},"player.getCurrentlyPlaying":{riskLevel:"read",description:"Get the currently playing track"},"player.getRecentlyPlayed":{riskLevel:"read",description:"Get recently played tracks"},"player.pause":{riskLevel:"write",description:"Pause playback"},"player.resume":{riskLevel:"write",description:"Resume playback"},"player.setVolume":{riskLevel:"write",description:"Set the playback volume"},"player.skipToNext":{riskLevel:"write",description:"Skip to the next track"},"player.skipToPrevious":{riskLevel:"write",description:"Skip to the previous track"},"player.startPlayback":{riskLevel:"write",description:"Start playback of specified content"},"playlists.addItem":{riskLevel:"write",description:"Add a track to a playlist"},"playlists.create":{riskLevel:"write",description:"Create a new playlist"},"playlists.get":{riskLevel:"read",description:"Get info about a playlist"},"playlists.getTracks":{riskLevel:"read",description:"Get tracks in a playlist"},"playlists.getUserPlaylists":{riskLevel:"read",description:"Get the current user's playlists"},"playlists.removeItem":{riskLevel:"write",description:"Remove a track from a playlist"},"playlists.search":{riskLevel:"read",description:"Search for playlists"},"tracks.get":{riskLevel:"read",description:"Get info about a track"},"tracks.getAudioFeatures":{riskLevel:"read",description:"Get audio features for a track"},"tracks.search":{riskLevel:"read",description:"Search for tracks"}};function Ko(o={}){let e={...o,authType:o.authType??Ve};return{id:"spotify",schema:ht,options:e,oauthConfig:{providerName:"Spotify",authUrl:"https://accounts.spotify.com/authorize",tokenUrl:"https://accounts.spotify.com/api/token",scopes:["user-read-private","user-read-email","user-read-playback-state","user-modify-playback-state","user-read-currently-playing","user-read-recently-played","user-library-read","user-library-modify","user-follow-read","user-follow-modify","playlist-read-private","playlist-read-collaborative","playlist-modify-public","playlist-modify-private"],tokenAuthMethod:"basic",requiresRegisteredRedirect:!0,authParams:{show_dialog:"true"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:Ue,webhooks:De,endpointMeta:Be,endpointSchemas:We,webhookSchemas:Me,pluginWebhookMatcher:s=>{let a=s.headers;return"x-spotify-signature"in a||"spotify-webhook"in a},errorHandlers:{...ut,...e.errorHandlers},keyBuilder:async(s,a)=>{if(a==="webhook"&&e.webhookSecret)return e.webhookSecret;if(a==="webhook"){let y=await s.keys.get_webhook_signature();return y||""}if(a==="endpoint"&&e.key)return e.key;if(a==="endpoint"&&s.authType==="oauth_2"){let y=await s.keys.get_access_token(),d=await s.keys.get_refresh_token();if(!d)throw new Error("[corsair:spotify] No refresh token. Cannot get access token.");let u=await s.keys.get_integration_credentials();if(!u.client_id||!u.client_secret)throw new Error("[corsair:spotify] No client id or client secret");try{let m=await w({accessToken:y,refreshToken:d,clientId:u.client_id,clientSecret:u.client_secret});if(!m)throw new Error("[corsair:spotify] Access token cannot be created.");return s._refreshAuth=async()=>{let c=await w({accessToken:null,refreshToken:d,clientId:u.client_id,clientSecret:u.client_secret});return c&&await s.keys.set_access_token(c),c||""},m}catch(m){throw new Error(`[corsair:spotify] Failed to get access token: ${m instanceof Error?m.message:String(m)}`)}}return""}}}export{Ko as spotify,We as spotifyEndpointSchemas};
|
package/dist/setup.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
1
|
+
import{a as o}from"./chunk-B7SHIP45.js";import"./chunk-J7NCVPA4.js";import"./chunk-34Z5IBIX.js";import"./chunk-Q55TIVXA.js";import"./chunk-HO245J34.js";import"./chunk-73HYPGOI.js";import"./chunk-A7CRE5AE.js";import"./chunk-476ZUILE.js";export{o as setupCorsair};
|