UNPKG

@langchain/community

Version:
1 lines 5.55 kB
{"version":3,"file":"base.cjs","names":["StructuredTool","google"],"sources":["../../../src/tools/gmail/base.ts"],"sourcesContent":["import { gmail_v1, google } from \"googleapis\";\nimport { StructuredTool } from \"@langchain/core/tools\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nexport interface GmailBaseToolParams {\n credentials?: {\n clientEmail?: string;\n privateKey?: string;\n keyfile?: string;\n subject?: string;\n // support string and async function to handle token validation and expiration\n accessToken?: string | (() => Promise<string>);\n };\n scopes?: string[];\n}\n\nexport abstract class GmailBaseTool extends StructuredTool {\n name = \"Gmail\";\n\n description = \"A tool to send and view emails through Gmail\";\n\n protected params: GmailBaseToolParams;\n\n protected gmail?: gmail_v1.Gmail;\n\n constructor(\n { credentials, scopes }: GmailBaseToolParams = {\n credentials: {\n clientEmail: getEnvironmentVariable(\"GMAIL_CLIENT_EMAIL\"),\n privateKey: getEnvironmentVariable(\"GMAIL_PRIVATE_KEY\"),\n keyfile: getEnvironmentVariable(\"GMAIL_KEYFILE\"),\n subject: getEnvironmentVariable(\"GMAIL_SUBJECT\"),\n },\n scopes: [\"https://mail.google.com/\"],\n }\n ) {\n super(...arguments);\n\n if (!credentials) {\n throw new Error(\"Missing credentials to authenticate to Gmail\");\n }\n\n if (!credentials.accessToken) {\n if (!credentials.clientEmail) {\n throw new Error(\"Missing GMAIL_CLIENT_EMAIL to interact with Gmail\");\n }\n\n if (!credentials.privateKey && !credentials.keyfile) {\n throw new Error(\n \"Missing GMAIL_PRIVATE_KEY or GMAIL_KEYFILE or accessToken to interact with Gmail\"\n );\n }\n }\n\n this.params = { credentials, scopes };\n }\n\n async getGmailClient() {\n const { credentials, scopes } = this.params;\n\n if (credentials?.accessToken) {\n // always return a new instance so that we don't end up using expired access tokens\n const auth = new google.auth.OAuth2();\n const accessToken =\n typeof credentials.accessToken === \"function\"\n ? await credentials.accessToken()\n : credentials.accessToken;\n\n auth.setCredentials({\n // get fresh access token if a function is provided\n access_token: accessToken,\n });\n return google.gmail({ version: \"v1\", auth });\n }\n\n // when not using access token its ok to use singleton instance\n if (this.gmail) {\n return this.gmail;\n }\n\n const auth = new google.auth.JWT(\n credentials?.clientEmail,\n credentials?.keyfile,\n credentials?.privateKey,\n scopes,\n credentials?.subject\n );\n\n this.gmail = google.gmail({ version: \"v1\", auth });\n return this.gmail;\n }\n\n parseHeaderAndBody(payload: gmail_v1.Schema$MessagePart | undefined) {\n if (!payload) {\n return { body: \"\" };\n }\n\n const headers = payload.headers || [];\n\n const subject = headers.find((header) => header.name === \"Subject\");\n const sender = headers.find((header) => header.name === \"From\");\n\n let body = \"\";\n if (payload.parts) {\n body = payload.parts\n .map((part) =>\n part.mimeType === \"text/plain\"\n ? this.decodeBody(part.body?.data ?? \"\")\n : \"\"\n )\n .join(\"\");\n } else if (payload.body?.data) {\n body = this.decodeBody(payload.body.data);\n }\n\n return { subject, sender, body };\n }\n\n decodeBody(body: string) {\n if (body) {\n try {\n // Gmail uses URL-safe base64 encoding, so we need to handle it properly\n // Replace URL-safe characters and decode\n return atob(body.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n } catch {\n // Keep the original encoded body if decoding fails\n return body;\n }\n }\n return \"\";\n }\n}\n"],"mappings":";;;;;AAgBA,IAAsB,gBAAtB,cAA4CA,sBAAAA,eAAe;CACzD,OAAO;CAEP,cAAc;CAEd;CAEA;CAEA,YACE,EAAE,aAAa,WAAgC;EAC7C,aAAa;GACX,cAAA,GAAA,0BAAA,wBAAoC,qBAAqB;GACzD,aAAA,GAAA,0BAAA,wBAAmC,oBAAoB;GACvD,UAAA,GAAA,0BAAA,wBAAgC,gBAAgB;GAChD,UAAA,GAAA,0BAAA,wBAAgC,gBAAgB;GACjD;EACD,QAAQ,CAAC,2BAA2B;EACrC,EACD;AACA,QAAM,GAAG,UAAU;AAEnB,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,+CAA+C;AAGjE,MAAI,CAAC,YAAY,aAAa;AAC5B,OAAI,CAAC,YAAY,YACf,OAAM,IAAI,MAAM,oDAAoD;AAGtE,OAAI,CAAC,YAAY,cAAc,CAAC,YAAY,QAC1C,OAAM,IAAI,MACR,mFACD;;AAIL,OAAK,SAAS;GAAE;GAAa;GAAQ;;CAGvC,MAAM,iBAAiB;EACrB,MAAM,EAAE,aAAa,WAAW,KAAK;AAErC,MAAI,aAAa,aAAa;GAE5B,MAAM,OAAO,IAAIC,WAAAA,OAAO,KAAK,QAAQ;GACrC,MAAM,cACJ,OAAO,YAAY,gBAAgB,aAC/B,MAAM,YAAY,aAAa,GAC/B,YAAY;AAElB,QAAK,eAAe,EAElB,cAAc,aACf,CAAC;AACF,UAAOA,WAAAA,OAAO,MAAM;IAAE,SAAS;IAAM;IAAM,CAAC;;AAI9C,MAAI,KAAK,MACP,QAAO,KAAK;EAGd,MAAM,OAAO,IAAIA,WAAAA,OAAO,KAAK,IAC3B,aAAa,aACb,aAAa,SACb,aAAa,YACb,QACA,aAAa,QACd;AAED,OAAK,QAAQA,WAAAA,OAAO,MAAM;GAAE,SAAS;GAAM;GAAM,CAAC;AAClD,SAAO,KAAK;;CAGd,mBAAmB,SAAkD;AACnE,MAAI,CAAC,QACH,QAAO,EAAE,MAAM,IAAI;EAGrB,MAAM,UAAU,QAAQ,WAAW,EAAE;EAErC,MAAM,UAAU,QAAQ,MAAM,WAAW,OAAO,SAAS,UAAU;EACnE,MAAM,SAAS,QAAQ,MAAM,WAAW,OAAO,SAAS,OAAO;EAE/D,IAAI,OAAO;AACX,MAAI,QAAQ,MACV,QAAO,QAAQ,MACZ,KAAK,SACJ,KAAK,aAAa,eACd,KAAK,WAAW,KAAK,MAAM,QAAQ,GAAG,GACtC,GACL,CACA,KAAK,GAAG;WACF,QAAQ,MAAM,KACvB,QAAO,KAAK,WAAW,QAAQ,KAAK,KAAK;AAG3C,SAAO;GAAE;GAAS;GAAQ;GAAM;;CAGlC,WAAW,MAAc;AACvB,MAAI,KACF,KAAI;AAGF,UAAO,KAAK,KAAK,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC;UACjD;AAEN,UAAO;;AAGX,SAAO"}